Besides the warning emitted by warn_uninit, this function wants to hint the user at where the uninitialized variable was declared, for cases where the declaration location is outside the current function.
Now that expand_location expands to the location that is in the main source file (even for -ftrack-macro-expansion) the hinting part was not working well for cases where the variable is declared in a macro (outside the function), which is then expanded in the function. So I had to adjust warn_uninit a little bit to make it consider the spelling location of the variable declaration. I have fixed the test gcc.dg/cpp/pragma-diagnostic-2.c on which I believe gcc shouldn't emit any error. Here is the new output on that test: =~= gcc.dg/cpp/pragma-diagnostic-2.c: In function 'g': gcc.dg/cpp/pragma-diagnostic-2.c:10:5: warning: 'a' is used uninitialized in this function [-Wuninitialized] gcc.dg/cpp/pragma-diagnostic-2.c:9:7: note: 'a' was declared here gcc.dg/cpp/pragma-diagnostic-2.c:9:7: note: in expansion of macro 'CODE_WITH_WARNING' gcc.dg/cpp/pragma-diagnostic-2.c:17:3: note: expanded from here gcc.dg/cpp/pragma-diagnostic-2.c: In function 'h': gcc.dg/cpp/pragma-diagnostic-2.c:10:5: warning: 'a' is used uninitialized in this function [-Wuninitialized] gcc.dg/cpp/pragma-diagnostic-2.c:9:7: note: 'a' was declared here gcc.dg/cpp/pragma-diagnostic-2.c:9:7: note: in expansion of macro 'CODE_WITH_WARNING' gcc.dg/cpp/pragma-diagnostic-2.c:27:3: note: expanded from here =~= Tested and bootstrapped on x86_64-unknown-linux-gnu against trunk. Note that the bootstrap with -ftrack-macro-expansion turned on exhibits other separate issues that are addressed in subsequent patches. This patch just fixes one class of problems. The patch does pass bootstrap with -ftrack-macro-expansion turned off, though. gcc/ * tree-ssa.c (warn_uninit): Use the spelling location of the variable declaration. Use linemap_location_before_p for source locations. gcc/testsuite/ * gcc.dg/cpp/pragma-diagnostic-2.c: Fix this. --- gcc/testsuite/gcc.dg/cpp/pragma-diagnostic-2.c | 10 ++-------- gcc/tree-ssa.c | 15 +++++++++++---- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/gcc/testsuite/gcc.dg/cpp/pragma-diagnostic-2.c b/gcc/testsuite/gcc.dg/cpp/pragma-diagnostic-2.c index 7ab95b0..57f3f01 100644 --- a/gcc/testsuite/gcc.dg/cpp/pragma-diagnostic-2.c +++ b/gcc/testsuite/gcc.dg/cpp/pragma-diagnostic-2.c @@ -6,8 +6,8 @@ void f (unsigned); #define CODE_WITH_WARNING \ - int a; /* { dg-message "expansion|declared here" } */ \ - f (a) /* { dg-message "expansion" } */ + int a; /* { dg-message "was declared here" } */ \ + f (a) /* { dg-warning "used uninitialized" } */ #pragma GCC diagnostic ignored "-Wuninitialized" @@ -26,9 +26,3 @@ h (void) { CODE_WITH_WARNING; /* { dg-message "expanded" } */ } - -/* - { dg-message "some warnings being treated as errors" "" {target *-*-*} 0 } -*/ - -/* { dg-error "uninitialized" "" { target *-*-* } { 10 } } */ diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 08f908f..977f0f7 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -1584,7 +1584,7 @@ warn_uninit (enum opt_code wc, tree t, tree expr, tree var, const char *gmsgid, void *data) { gimple context = (gimple) data; - location_t location; + location_t location, cfun_loc; expanded_location xloc, floc; if (!ssa_undefined_value_p (t)) @@ -1602,8 +1602,12 @@ warn_uninit (enum opt_code wc, tree t, location = (context != NULL && gimple_has_location (context)) ? gimple_location (context) : DECL_SOURCE_LOCATION (var); + location = linemap_resolve_location (line_table, location, + LRK_SPELLING_LOCATION, + NULL); + cfun_loc = DECL_SOURCE_LOCATION (cfun->decl); xloc = expand_location (location); - floc = expand_location (DECL_SOURCE_LOCATION (cfun->decl)); + floc = expand_location (cfun_loc); if (warning_at (location, wc, gmsgid, expr)) { TREE_NO_WARNING (expr) = 1; @@ -1611,8 +1615,11 @@ warn_uninit (enum opt_code wc, tree t, if (location == DECL_SOURCE_LOCATION (var)) return; if (xloc.file != floc.file - || xloc.line < floc.line - || xloc.line > LOCATION_LINE (cfun->function_end_locus)) + || linemap_location_before_p (line_table, + location, cfun_loc) + || linemap_location_before_p (line_table, + cfun->function_end_locus, + location)) inform (DECL_SOURCE_LOCATION (var), "%qD was declared here", var); } } -- Dodji