aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDodji Seketeli <dodji@redhat.com>2012-04-30 11:42:25 +0000
committerDodji Seketeli <dodji@gcc.gnu.org>2012-04-30 13:42:25 +0200
commit2d48bdcadfe34cc00ffc7b26687700017b5410c9 (patch)
treecf4e13328cba84e16a72f7c69d9cbeae7e7b0b42
parentc4ca1a09618ff751220fd01d81b0ca62e6cdb735 (diff)
downloadgcc-2d48bdcadfe34cc00ffc7b26687700017b5410c9.zip
gcc-2d48bdcadfe34cc00ffc7b26687700017b5410c9.tar.gz
gcc-2d48bdcadfe34cc00ffc7b26687700017b5410c9.tar.bz2
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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/gcc.dg/cpp/pragma-diagnostic-2.c10
-rw-r--r--gcc/tree-ssa.c15
4 files changed, 21 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9ec7dde..470a1a5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7194809..0b03515 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
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 f399833..32a01fb 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);
}
}