[multiple changes]
authorAndrew Pinski <pinskia@gcc.gnu.org>
Mon, 30 Apr 2007 17:01:18 +0000 (10:01 -0700)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Mon, 30 Apr 2007 17:01:18 +0000 (10:01 -0700)
2007-04-30  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        PR C++/31721
        * tree.c (reconstruct_complex_type): Reconstruct a reference
        correctly.
        Also use the same mode for the pointer as the old pointer type.
2007-04-30  Andrew pinski  <andrew_pinski@playstation.sony.com>

        PR C++/31721
        * g++.dg/ext/vector7.C: New testcase.

From-SVN: r124300

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ext/vector7.C [new file with mode: 0644]
gcc/tree.c

index 24ff41264da00fdadc09b1796c088bfab4e44bb9..da8aaf6b53d886bd8ac3aced2777db411c409082 100644 (file)
@@ -1,3 +1,10 @@
+2007-04-30  Andrew Pinski  <andrew_pinski@playstation.sony.com>
+
+       PR C++/31721
+       * tree.c (reconstruct_complex_type): Reconstruct a reference
+       correctly.
+       Also use the same mode for the pointer as the old pointer type.
+
 2007-04-30  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
        * doc/trouble.texi (Interoperation): Remove note about Ultrix
index d9972b7497fcb3cb9e41130db93b14ffade2e2d6..efe44a6e78b356cc94e162d9b5973c617d2198a3 100644 (file)
@@ -1,4 +1,9 @@
-2007-04-29 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+2007-04-30  Andrew pinski  <andrew_pinski@playstation.sony.com>
+
+       PR C++/31721
+       * g++.dg/ext/vector7.C: New testcase.
+
+2007-04-29  Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
 
        PR fortran/31591
        * gfortran.dg/bound_simplification_1.f90: New test.
diff --git a/gcc/testsuite/g++.dg/ext/vector7.C b/gcc/testsuite/g++.dg/ext/vector7.C
new file mode 100644 (file)
index 0000000..cd259b1
--- /dev/null
@@ -0,0 +1,8 @@
+// { dg-options "" }
+// { dg-do compile }
+// PR C++/31721 and PR 14217
+// the attribute vector_size would change a reference type into a pointer type which was wrong.
+
+#define vector __attribute__((__vector_size__(16) ))
+vector int b;
+vector int &a = b;
index 626f8e447c04a259b0259291338c271199117fc3..fbaeb737cc8ed7bba25058507f5da303381db414 100644 (file)
@@ -7236,11 +7236,18 @@ tree
 reconstruct_complex_type (tree type, tree bottom)
 {
   tree inner, outer;
-
-  if (POINTER_TYPE_P (type))
+  
+  if (TREE_CODE (type) == POINTER_TYPE)
+    {
+      inner = reconstruct_complex_type (TREE_TYPE (type), bottom);
+      outer = build_pointer_type_for_mode (inner, TYPE_MODE (type),
+                                          TYPE_REF_CAN_ALIAS_ALL (type));
+    }
+  else if (TREE_CODE (type) == REFERENCE_TYPE)
     {
       inner = reconstruct_complex_type (TREE_TYPE (type), bottom);
-      outer = build_pointer_type (inner);
+      outer = build_reference_type_for_mode (inner, TYPE_MODE (type),
+                                            TYPE_REF_CAN_ALIAS_ALL (type));
     }
   else if (TREE_CODE (type) == ARRAY_TYPE)
     {