OSDN Git Service

PR 21894
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 7 Aug 2005 19:01:09 +0000 (19:01 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 7 Aug 2005 19:01:09 +0000 (19:01 +0000)
        * tree-nested.c (convert_local_reference): Save and restore val_only
        around component_ref and friends.  Clear walk_subtrees by default.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@102832 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/gcc.c-torture/compile/nested-2.c [new file with mode: 0644]
gcc/tree-nested.c

index be5749b..f4e7a4f 100644 (file)
@@ -1,3 +1,9 @@
+2005-08-06  Richard Henderson  <rth@redhat.com>
+
+       PR 21894
+       * tree-nested.c (convert_local_reference): Save and restore val_only
+       around component_ref and friends.  Clear walk_subtrees by default.
+
 2005-08-06  Peter O'Gorman  <peter@pogma.com>
 
        PR 21366
diff --git a/gcc/testsuite/gcc.c-torture/compile/nested-2.c b/gcc/testsuite/gcc.c-torture/compile/nested-2.c
new file mode 100644 (file)
index 0000000..6e61b32
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR 21105 */
+
+void
+CheckFile ()
+{
+  char tagname[10];
+  char *a = tagname;
+
+  int validate ()
+  {
+    return (a == tagname + 4);
+  }
+
+  if (a == tagname)
+    validate ();
+}
index 4f6ec71..45c9bfe 100644 (file)
@@ -950,7 +950,9 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data)
   struct walk_stmt_info *wi = data;
   struct nesting_info *info = wi->info;
   tree t = *tp, field, x;
+  bool save_val_only;
 
+  *walk_subtrees = 0;
   switch (TREE_CODE (t))
     {
     case VAR_DECL:
@@ -989,34 +991,31 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data)
       break;
 
     case ADDR_EXPR:
-      {
-       bool save_val_only = wi->val_only;
-
-       wi->val_only = false;
-       wi->is_lhs = false;
-       wi->changed = false;
-       walk_tree (&TREE_OPERAND (t, 0), convert_local_reference, wi, NULL);
-       wi->val_only = save_val_only;
+      save_val_only = wi->val_only;
+      wi->val_only = false;
+      wi->is_lhs = false;
+      wi->changed = false;
+      walk_tree (&TREE_OPERAND (t, 0), convert_local_reference, wi, NULL);
+      wi->val_only = save_val_only;
 
-       /* If we converted anything ... */
-       if (wi->changed)
-         {
-           tree save_context;
+      /* If we converted anything ... */
+      if (wi->changed)
+       {
+         tree save_context;
 
-           /* Then the frame decl is now addressable.  */
-           TREE_ADDRESSABLE (info->frame_decl) = 1;
+         /* Then the frame decl is now addressable.  */
+         TREE_ADDRESSABLE (info->frame_decl) = 1;
            
-           save_context = current_function_decl;
-           current_function_decl = info->context;
-           recompute_tree_invarant_for_addr_expr (t);
-           current_function_decl = save_context;
-
-           /* If we are in a context where we only accept values, then
-              compute the address into a temporary.  */
-           if (save_val_only)
-             *tp = tsi_gimplify_val (wi->info, t, &wi->tsi);
-         }
-      }
+         save_context = current_function_decl;
+         current_function_decl = info->context;
+         recompute_tree_invarant_for_addr_expr (t);
+         current_function_decl = save_context;
+
+         /* If we are in a context where we only accept values, then
+            compute the address into a temporary.  */
+         if (save_val_only)
+           *tp = tsi_gimplify_val (wi->info, t, &wi->tsi);
+       }
       break;
 
     case REALPART_EXPR:
@@ -1028,6 +1027,7 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data)
       /* Go down this entire nest and just look at the final prefix and
         anything that describes the references.  Otherwise, we lose track
         of whether a NOP_EXPR or VIEW_CONVERT_EXPR needs a simple value.  */
+      save_val_only = wi->val_only;
       wi->val_only = true;
       wi->is_lhs = false;
       for (; handled_component_p (t); tp = &TREE_OPERAND (t, 0), t = *tp)
@@ -1055,6 +1055,7 @@ convert_local_reference (tree *tp, int *walk_subtrees, void *data)
        }
       wi->val_only = false;
       walk_tree (tp, convert_local_reference, wi, NULL);
+      wi->val_only = save_val_only;
       break;
 
     default: