diff --git a/Documentation/usage/command_line_flags.rst b/Documentation/usage/command_line_flags.rst index 155d4ace9..68c217a6d 100644 --- a/Documentation/usage/command_line_flags.rst +++ b/Documentation/usage/command_line_flags.rst @@ -136,7 +136,7 @@ These flags affect the general behavior of the compiler. The standards requires that parameters must be declared lexically before they are used. Using -gno-strict-parameter-declaration will allow using a parameter before declaration, with a - warning. The warning can be suppressed with -Wno-anachronisms. + warning. The warning can be suppressed with -Wno-declaration-after-use. * shared-loop-index/no-shared-loop-index @@ -267,6 +267,7 @@ These flags affect the general behavior of the compiler. -Wanachronisms -Wimplicit -Wimplicit-dimensions + -Wdeclaration-after-use -Wmacro-replacement -Wportbind -Wselect-range @@ -295,6 +296,11 @@ These flags affect the general behavior of the compiler. This flag is supported in release 10.1 or master branch snapshots after 2016-02-06. + * declaration-after-use + + With -gno-strict-parameter-declaration, issue a warning when a + parameter is declared after it is used. + * macro-redefinition This enables warnings when a macro is redefined, even if the macro text diff --git a/compiler.h b/compiler.h index eafc8aac9..0b5feca91 100644 --- a/compiler.h +++ b/compiler.h @@ -104,6 +104,9 @@ extern bool warn_sens_entire_arr; /* Warn about level-appropriate anachronisms. */ extern bool warn_anachronisms; +/* Warn about declaration after use (unless flaged as errors). */ +extern bool warn_decl_after_use; + /* Warn about nets that are references but not driven. */ extern bool warn_floating_nets; diff --git a/driver/iverilog.man.in b/driver/iverilog.man.in index 1c0b9e44c..19ac06361 100644 --- a/driver/iverilog.man.in +++ b/driver/iverilog.man.in @@ -154,7 +154,7 @@ numbers are not truncated to integer width. The standards requires that parameters must be declared lexically before they are used. Using \fB\-gno\-strict\-parameter\-declaration\fP will allow using a parameter before declaration, with a warning. -The warning can be suppressed with -Wno-anachronisms. +The warning can be suppressed with -Wno-declaration-after-use. .TP 8 .B -gshared-loop-index\fI|\fP-gno-shared-loop-index Enable (default) or disable the exclusion of for-loop control variables @@ -373,6 +373,11 @@ This enables warnings for creation of implicit declarations. For example, if a scalar wire X is used but not declared in the Verilog source, this will print a warning at its first use. +.TP 8 +.B declaration-after-use +This enables warnings for declarations after use, when +those are not flagged as errors (default). + .TP 8 .B macro-redefinition\fI | \fPmacro-replacement This enables preprocessor warnings when a macro is being redefined. diff --git a/driver/main.c b/driver/main.c index c1de20333..803e457c6 100644 --- a/driver/main.c +++ b/driver/main.c @@ -143,7 +143,7 @@ int gen_std_include = 1; of the include list. */ int gen_relative_include = 0; -char warning_flags[17] = "n"; +char warning_flags[18] = "nu"; int separate_compilation_flag = 0; @@ -528,6 +528,7 @@ static void process_warning_switch(const char*name) { if (strcmp(name,"all") == 0) { process_warning_switch("anachronisms"); + process_warning_switch("declaration-after-use"); process_warning_switch("implicit"); process_warning_switch("implicit-dimensions"); process_warning_switch("macro-replacement"); @@ -538,6 +539,9 @@ static void process_warning_switch(const char*name) } else if (strcmp(name,"anachronisms") == 0) { if (! strchr(warning_flags, 'n')) strcat(warning_flags, "n"); + } else if (strcmp(name,"declaration-after-use") == 0) { + if (! strchr(warning_flags, 'u')) + strcat(warning_flags, "u"); } else if (strcmp(name,"floating-nets") == 0) { if (! strchr(warning_flags, 'f')) strcat(warning_flags, "f"); @@ -579,6 +583,12 @@ static void process_warning_switch(const char*name) cp[0] = cp[1]; cp += 1; } + } else if (strcmp(name,"no-declaration-after-use") == 0) { + char*cp = strchr(warning_flags, 'u'); + if (cp) while (*cp) { + cp[0] = cp[1]; + cp += 1; + } } else if (strcmp(name,"no-floating-nets") == 0) { char*cp = strchr(warning_flags, 'f'); if (cp) while (*cp) { diff --git a/main.cc b/main.cc index 7ed4c7c50..8e71ef7b3 100644 --- a/main.cc +++ b/main.cc @@ -173,6 +173,7 @@ bool warn_ob_select = false; bool warn_sens_entire_vec = false; bool warn_sens_entire_arr = false; bool warn_anachronisms = false; +bool warn_decl_after_use = false; bool warn_floating_nets = false; /* @@ -767,6 +768,9 @@ static void read_iconfig_file(const char*ipath) case 'n': warn_anachronisms = true; break; + case 'u': + warn_decl_after_use = true; + break; default: break; } diff --git a/symbol_search.cc b/symbol_search.cc index cbe307ff9..11922e684 100644 --- a/symbol_search.cc +++ b/symbol_search.cc @@ -196,7 +196,7 @@ bool symbol_search(const LineInfo*li, Design*des, NetScope*scope, res->scope = scope; res->par_val = par; res->path_head = path; - if (warn_anachronisms && decl_after_use) { + if (warn_decl_after_use && decl_after_use) { cerr << li->get_fileline() << ": warning: parameter `" << path_tail.name << "` used before declaration." << endl;