typeck.c (mark_addressable): Don't test TREE_ADDRESSABLE early.
authorRichard Henderson <rth@redhat.com>
Thu, 20 Jun 2002 23:23:54 +0000 (16:23 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 20 Jun 2002 23:23:54 +0000 (16:23 -0700)
        * typeck.c (mark_addressable): Don't test TREE_ADDRESSABLE early.
        Call put_var_into_stack.
        * g++.dg/opt/asm1.C: New.

From-SVN: r54862

gcc/cp/ChangeLog
gcc/cp/typeck.c
gcc/testsuite/g++.dg/opt/asm1.C [new file with mode: 0644]

index 4a37ab3fe0bdfa348d07b6eed9aa2463e52f86a2..8cc664e3b3ff914656cba3d5070c411f5f46c6a8 100644 (file)
@@ -1,3 +1,9 @@
+2002-06-20  Richard Henderson  <rth@redhat.com>
+
+       PR c++/6747
+        * typeck.c (mark_addressable): Don't test TREE_ADDRESSABLE early.
+        Call put_var_into_stack.
+
 2002-06-20  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * spew.c (remove_last_token): Use ARRAY_SIZE in lieu of explicit
index 5ea8bdb4f28b42413e3dad0cd0578a26dd71c0b3..c1338d934e3e9df66a9fd154cda551d2f7ae71dd 100644 (file)
@@ -4805,9 +4805,6 @@ cxx_mark_addressable (exp)
 {
   register tree x = exp;
 
-  if (TREE_ADDRESSABLE (x) == 1)
-    return true;
-
   while (1)
     switch (TREE_CODE (x))
       {
@@ -4826,6 +4823,8 @@ cxx_mark_addressable (exp)
            TREE_ADDRESSABLE (x) = 1; /* so compiler doesn't die later */
            return true;
          }
+       /* FALLTHRU */
+
       case VAR_DECL:
        /* Caller should not be trying to mark initialized
           constant fields addressable.  */
@@ -4833,6 +4832,7 @@ cxx_mark_addressable (exp)
                            || DECL_IN_AGGR_P (x) == 0
                            || TREE_STATIC (x)
                            || DECL_EXTERNAL (x), 314);
+       /* FALLTHRU */
 
       case CONST_DECL:
       case RESULT_DECL:
@@ -4841,6 +4841,7 @@ cxx_mark_addressable (exp)
          warning ("address requested for `%D', which is declared `register'",
                      x);
        TREE_ADDRESSABLE (x) = 1;
+       put_var_into_stack (x);
        return true;
 
       case FUNCTION_DECL:
diff --git a/gcc/testsuite/g++.dg/opt/asm1.C b/gcc/testsuite/g++.dg/opt/asm1.C
new file mode 100644 (file)
index 0000000..3f932a6
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/6747
+// { dg-do compile }
+// { dg-options "-O" }
+
+void foo()
+{
+  union { double d; char c[sizeof(double)]; } tmp;
+  __asm__ ("" : "=m" (tmp.d)); // { dg-bogus "not directly addressable" }
+}