aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <pinskia@gcc.gnu.org>2007-04-30 10:01:18 -0700
committerAndrew Pinski <pinskia@gcc.gnu.org>2007-04-30 10:01:18 -0700
commitab44f2818c38e3ec1897fb8f12d8923d49b394c6 (patch)
treef862f637a67c0b3826daf74e6d0df59e36b7417c /gcc
parent8f1a19e2c51a192569f3553cbd35ea59499684f8 (diff)
downloadgcc-ab44f2818c38e3ec1897fb8f12d8923d49b394c6.zip
gcc-ab44f2818c38e3ec1897fb8f12d8923d49b394c6.tar.gz
gcc-ab44f2818c38e3ec1897fb8f12d8923d49b394c6.tar.bz2
[multiple changes]
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/ext/vector7.C8
-rw-r--r--gcc/tree.c13
4 files changed, 31 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 24ff412..da8aaf6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d9972b7..efe44a6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..cd259b1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/vector7.C
@@ -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;
diff --git a/gcc/tree.c b/gcc/tree.c
index 626f8e4..fbaeb73 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -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)
{