Fix -Wuninitialized for -ftrack-macro-expansion
authorDodji Seketeli <dodji@redhat.com>
Mon, 30 Apr 2012 11:42:25 +0000 (11:42 +0000)
committerDodji Seketeli <dodji@gcc.gnu.org>
Mon, 30 Apr 2012 11:42:25 +0000 (13:42 +0200)
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
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/cpp/pragma-diagnostic-2.c
gcc/tree-ssa.c

index 9ec7dde25fd015a3b6fa911d2d0781b7e46b55ab..470a1a5f29e76a8fb790c45caacd5d1498bc7a0d 100644 (file)
@@ -1,5 +1,10 @@
 2012-04-30  Dodji Seketeli  <dodji@redhat.com>
 
+       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 "<built-in>" 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
index 71948097024eea6ffda61310e4faa1ebb26a2d00..0b03515f96e518b489ad5a87c2806ef454260644 100644 (file)
@@ -1,5 +1,8 @@
 2012-04-30  Dodji Seketeli  <dodji@redhat.com>
 
+       Fix -Wuninitialized for -ftrack-macro-expansion
+       * gcc.dg/cpp/pragma-diagnostic-2.c: Fix this.
+
        Strip "<built-in>" loc from displayed expansion context
        * g++.dg/warn/Wconversion-real-integer2.C: New test.
        * g++.dg/warn/Wconversion-real-integer-3.C: Likewise.
index 7ab95b0c63bf6c3ad4416c3d39bcbadc52710081..57f3f01939ad66f622fc7543c8c52616134b2e82 100644 (file)
@@ -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 } } */
index f399833c5460799508d9893cda013f0a910d2ed3..32a01fb1eeff1cc14eef5e9e61e57c8e912f9681 100644 (file)
@@ -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);
     }
 }