From 2d48bdcadfe34cc00ffc7b26687700017b5410c9 Mon Sep 17 00:00:00 2001 From: Dodji Seketeli Date: Mon, 30 Apr 2012 11:42:25 +0000 Subject: [PATCH] Fix -Wuninitialized for -ftrack-macro-expansion 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. From-SVN: r186971 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.dg/cpp/pragma-diagnostic-2.c | 10 ++-------- gcc/tree-ssa.c | 15 +++++++++++---- 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9ec7dde25fd..470a1a5f29e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2012-04-30 Dodji Seketeli + Fix -Wuninitialized for -ftrack-macro-expansion + * tree-ssa.c (warn_uninit): Use the spelling location of the + variable declaration. Use linemap_location_before_p for source + locations. + Strip "" loc from displayed expansion context * input.c (expand_location_1): When expanding to spelling location in a context of a macro expansion, skip reserved system header diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 71948097024..0b03515f96e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2012-04-30 Dodji Seketeli + Fix -Wuninitialized for -ftrack-macro-expansion + * gcc.dg/cpp/pragma-diagnostic-2.c: Fix this. + Strip "" loc from displayed expansion context * g++.dg/warn/Wconversion-real-integer2.C: New test. * g++.dg/warn/Wconversion-real-integer-3.C: Likewise. diff --git a/gcc/testsuite/gcc.dg/cpp/pragma-diagnostic-2.c b/gcc/testsuite/gcc.dg/cpp/pragma-diagnostic-2.c index 7ab95b0c63b..57f3f01939a 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 f399833c546..32a01fb1eef 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -1613,7 +1613,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)) @@ -1631,8 +1631,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; @@ -1640,8 +1644,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); } } -- 2.30.2