]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/45083 (strange warning text from gcc)
authorJakub Jelinek <jakub@redhat.com>
Tue, 27 Jul 2010 09:43:59 +0000 (11:43 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 27 Jul 2010 09:43:59 +0000 (11:43 +0200)
PR tree-optimization/45083
* tree-inline.c (add_local_variables): Also remap DECL_DEBUG_EXPR.

* gcc.dg/pr45083.c: New test.

From-SVN: r162559

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr45083.c [new file with mode: 0644]
gcc/tree-inline.c

index 6983da721b4acc93ce962ca0d76708b26a49ced5..f9a1b2f53f330817fad3bead5d5bdf510f2b7c62 100644 (file)
@@ -1,3 +1,8 @@
+2010-07-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/45083
+       * tree-inline.c (add_local_variables): Also remap DECL_DEBUG_EXPR.
+
 2010-07-27  Bernd Schmidt  <bernds@codesourcery.com>
 
        * postreload.c (reload_combine_recognize_const_pattern): Move test
index 9ce38788dd2869b627ba5eb46692c2d2458bc160..93bfc7060697372b6c9533274b1196f2f8a1ebcf 100644 (file)
@@ -1,3 +1,8 @@
+2010-07-27  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/45083
+       * gcc.dg/pr45083.c: New test.
+
 2010-07-26  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/40873
diff --git a/gcc/testsuite/gcc.dg/pr45083.c b/gcc/testsuite/gcc.dg/pr45083.c
new file mode 100644 (file)
index 0000000..c9a4dbf
--- /dev/null
@@ -0,0 +1,25 @@
+/* PR tree-optimization/45083 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -Wuninitialized" } */
+
+struct S { char *a; unsigned b; unsigned c; };
+extern int foo (const char *);
+extern void bar (int, int);
+
+static void
+baz (void)
+{
+  struct S cs[1];      /* { dg-message "was declared here" } */
+  switch (cs->b)       /* { dg-warning "cs\[^\n\r\]*\\.b\[^\n\r\]*is used uninitialized" } */
+    {
+    case 101:
+      if (foo (cs->a)) /* { dg-warning "cs\[^\n\r\]*\\.a\[^\n\r\]*may be used uninitialized" } */
+       bar (cs->c, cs->b);     /* { dg-warning "cs\[^\n\r\]*\\.c\[^\n\r\]*may be used uninitialized" } */
+    }
+}
+
+void
+test (void)
+{
+  baz ();
+}
index dc09c29b6ea20000fcfd303eb767542d2b7f0ce4..81d6cfb4c508f79294cf2f5ce0e809899c2a9b5d 100644 (file)
@@ -3687,7 +3687,24 @@ add_local_variables (struct function *callee, struct function *caller,
          add_local_decl (caller, var);
       }
     else if (!can_be_nonlocal (var, id))
-      add_local_decl (caller, remap_decl (var, id));
+      {
+        tree new_var = remap_decl (var, id);
+
+        /* Remap debug-expressions.  */
+       if (TREE_CODE (new_var) == VAR_DECL
+           && DECL_DEBUG_EXPR_IS_FROM (new_var)
+           && new_var != var)
+         {
+           tree tem = DECL_DEBUG_EXPR (var);
+           bool old_regimplify = id->regimplify;
+           id->remapping_type_depth++;
+           walk_tree (&tem, copy_tree_body_r, id, NULL);
+           id->remapping_type_depth--;
+           id->regimplify = old_regimplify;
+           SET_DECL_DEBUG_EXPR (new_var, tem);
+         }
+       add_local_decl (caller, new_var);
+      }
 }
 
 /* Fetch callee declaration from the call graph edge going from NODE and