From eed80a964ed0aee0e5133345ba870d6d18826f14 Mon Sep 17 00:00:00 2001 From: rexim Date: Sat, 26 Jun 2021 01:43:58 +0700 Subject: [PATCH 1/4] (#481) Introduce bang_diag unit --- bang/nobuild.c | 3 ++- bang/src/bang_diag.c | 32 ++++++++++++++++++++++++++++++++ bang/src/bang_diag.h | 31 +++++++++++++++++++++++++++++++ bang/src/bang_lexer.h | 10 +--------- 4 files changed, 66 insertions(+), 10 deletions(-) create mode 100644 bang/src/bang_diag.c create mode 100644 bang/src/bang_diag.h diff --git a/bang/nobuild.c b/bang/nobuild.c index 6d848ed..ffe468d 100644 --- a/bang/nobuild.c +++ b/bang/nobuild.c @@ -24,7 +24,8 @@ PATH("..", "basm", "src", "verifier.c") #define BANG_UNITS PATH("src", "bang_compiler.c"), \ PATH("src", "bang_lexer.c"), \ - PATH("src", "bang_parser.c") + PATH("src", "bang_parser.c"), \ + PATH("src", "bang_diag.c") #define UNITS BM_UNITS, COMMON_UNITS, BASM_UNITS, BANG_UNITS #define LIBS "-lm" diff --git a/bang/src/bang_diag.c b/bang/src/bang_diag.c new file mode 100644 index 0000000..0a8f3e0 --- /dev/null +++ b/bang/src/bang_diag.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include +#include "./bang_diag.h" + +const char *bang_diag_level_label(Bang_Diag_Level level) +{ + switch (level) { + case BANG_DIAG_NOTE: + return "NOTE"; + case BANG_DIAG_WARNING: + return "WARNING"; + case BANG_DIAG_ERROR: + return "ERROR"; + default: + assert(false && "unreachable"); + exit(1); + } +} + +void bang_diag_msg(Bang_Loc loc, Bang_Diag_Level level, const char *fmt, ...) +{ + fprintf(stderr, Bang_Loc_Fmt": %s: ", Bang_Loc_Arg(loc), bang_diag_level_label(level)); + + va_list args; + va_start(args, fmt); + vfprintf(stderr, fmt, args); + va_end(args); + + fprintf(stderr, "\n"); +} diff --git a/bang/src/bang_diag.h b/bang/src/bang_diag.h new file mode 100644 index 0000000..31c357b --- /dev/null +++ b/bang/src/bang_diag.h @@ -0,0 +1,31 @@ +#ifndef BANG_DIAG_H_ +#define BANG_DIAG_H_ + +#include + +#if defined(__GNUC__) || defined(__clang__) +// https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attributes.html +#define BANG_PRINTF_FORMAT(STRING_INDEX, FIRST_TO_CHECK) __attribute__ ((format (printf, STRING_INDEX, FIRST_TO_CHECK))) +#else +#define BANG_PRINTF_FORMAT(STRING_INDEX, FIRST_TO_CHECK) +#endif + +typedef struct { + size_t row; + size_t col; + const char *file_path; +} Bang_Loc; + +#define Bang_Loc_Fmt "%s:%zu:%zu" +#define Bang_Loc_Arg(loc) (loc).file_path, (loc).row, (loc).col + +typedef enum { + BANG_DIAG_NOTE, + BANG_DIAG_WARNING, + BANG_DIAG_ERROR, +} Bang_Diag_Level; + +const char *bang_diag_level_label(Bang_Diag_Level level); +void bang_diag_msg(Bang_Loc loc, Bang_Diag_Level level, const char *fmt, ...) BANG_PRINTF_FORMAT(3, 4); + +#endif // BANG_DIAG_H_ diff --git a/bang/src/bang_lexer.h b/bang/src/bang_lexer.h index 4712a87..509356c 100644 --- a/bang/src/bang_lexer.h +++ b/bang/src/bang_lexer.h @@ -4,6 +4,7 @@ #include #include "./sv.h" +#include "./bang_diag.h" typedef enum { BANG_TOKEN_KIND_NAME = 0, @@ -31,15 +32,6 @@ typedef enum { const char *bang_token_kind_name(Bang_Token_Kind kind); -typedef struct { - size_t row; - size_t col; - const char *file_path; -} Bang_Loc; - -#define Bang_Loc_Fmt "%s:%zu:%zu" -#define Bang_Loc_Arg(loc) (loc).file_path, (loc).row, (loc).col - typedef struct { Bang_Token_Kind kind; String_View text; From 2a5ce69ebc5f674629b0de4eb40ea513b97274e6 Mon Sep 17 00:00:00 2001 From: rexim Date: Sat, 26 Jun 2021 01:54:12 +0700 Subject: [PATCH 2/4] (#481) Treat variable shadowing warning as error if requested --- bang/src/bang_compiler.c | 15 +++++++++------ bang/src/bang_compiler.h | 2 ++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/bang/src/bang_compiler.c b/bang/src/bang_compiler.c index d19675b..42a86f3 100644 --- a/bang/src/bang_compiler.c +++ b/bang/src/bang_compiler.c @@ -719,14 +719,17 @@ void compile_var_def_into_basm(Bang *bang, Basm *basm, Bang_Var_Def var_def, Ban // Shadowed Var Warning { - // TODO(#481): bang has no option to treat warnings as errors Compiled_Var *shadowed_var = bang_get_compiled_var_by_name(bang, var_def.name); if (shadowed_var) { - fprintf(stderr, Bang_Loc_Fmt": WARNING: variable `"SV_Fmt"` is shadowing another variable with the same name\n", - Bang_Loc_Arg(var_def.loc), - SV_Arg(var_def.name)); - fprintf(stderr, Bang_Loc_Fmt": NOTE: the shadowed variable is located here\n", - Bang_Loc_Arg(shadowed_var->def.loc)); + bang_diag_msg(var_def.loc, bang->warnings_as_errors ? BANG_DIAG_ERROR : BANG_DIAG_WARNING, + "variable `"SV_Fmt"` is shadowing another variable with the same name", + SV_Arg(var_def.name)); + bang_diag_msg(shadowed_var->def.loc, BANG_DIAG_NOTE, + "the shadowed variable is located here"); + + if (bang->warnings_as_errors) { + exit(1); + } } } diff --git a/bang/src/bang_compiler.h b/bang/src/bang_compiler.h index 3f37d47..3eb9840 100644 --- a/bang/src/bang_compiler.h +++ b/bang/src/bang_compiler.h @@ -79,6 +79,8 @@ typedef struct { size_t procs_count; Bang_Loc entry_loc; + + bool warnings_as_errors; } Bang; Compiled_Var *bang_get_compiled_var_by_name(Bang *bang, String_View name); From 92f4d05f046a1c1c3b9f5a4cc8c487d74635a278 Mon Sep 17 00:00:00 2001 From: rexim Date: Sat, 26 Jun 2021 01:54:36 +0700 Subject: [PATCH 3/4] (#481) introduce `-werror` flag to both `bang run` and `bang build` --- bang/src/bang.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/bang/src/bang.c b/bang/src/bang.c index 71b0a71..61d71ec 100644 --- a/bang/src/bang.c +++ b/bang/src/bang.c @@ -11,6 +11,8 @@ #define BANG_DEFAULT_STACK_SIZE 4096 +// TODO: move intersecting `bang run` and `bang build` flags to `bang` + static void build_usage(FILE *stream) { fprintf(stream, "Usage: bang build [OPTIONS] \n"); @@ -19,6 +21,7 @@ static void build_usage(FILE *stream) fprintf(stream, " -t Output target. Default is `bm`.\n"); fprintf(stream, " Provide `list` to get the list of all available targets.\n"); fprintf(stream, " -s Local variables stack size in bytes. (default %zu)\n", (size_t) BANG_DEFAULT_STACK_SIZE); + fprintf(stream, " -werror Treat warnings as errors\n"); fprintf(stream, " -h Print this help to stdout\n"); } @@ -53,6 +56,7 @@ static void run_usage(FILE *stream) fprintf(stream, "OPTIONS:\n"); fprintf(stream, " -t Enable trace mode\n"); fprintf(stream, " -s Local variables stack size in bytes. (default %zu)\n", (size_t) BANG_DEFAULT_STACK_SIZE); + fprintf(stream, " -werror Treat warnings as errors\n"); fprintf(stream, " -h Print this help to stdout\n"); } @@ -90,7 +94,14 @@ static void run_subcommand(int argc, char **argv) stack_size_cstr); exit(1); } + } else if (strcmp(flag, "-werror") == 0) { + bang.warnings_as_errors = true; } else { + if (input_file_path != NULL) { + fprintf(stderr, "ERROR: input file path is already specified as `%s`. Multiple file paths are not supported yet\n", input_file_path); + exit(1); + } + input_file_path = flag; } } @@ -231,6 +242,11 @@ static void build_subcommand(int argc, char **argv) build_usage(stdout); exit(0); } else { + if (input_file_path != NULL) { + fprintf(stderr, "ERROR: input file path is already specified as `%s`. Multiple file paths are not supported yet\n", input_file_path); + exit(1); + } + input_file_path = flag; } } From 223301e53ab52e42892b93303fd548cba685f255 Mon Sep 17 00:00:00 2001 From: rexim Date: Sat, 26 Jun 2021 01:56:38 +0700 Subject: [PATCH 4/4] Add TODO(#483) --- bang/src/bang.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bang/src/bang.c b/bang/src/bang.c index 61d71ec..cedb413 100644 --- a/bang/src/bang.c +++ b/bang/src/bang.c @@ -11,7 +11,7 @@ #define BANG_DEFAULT_STACK_SIZE 4096 -// TODO: move intersecting `bang run` and `bang build` flags to `bang` +// TODO(#483): move intersecting `bang run` and `bang build` flags to `bang` static void build_usage(FILE *stream) {