From ab44f2818c38e3ec1897fb8f12d8923d49b394c6 Mon Sep 17 00:00:00 2001 From: Andrew Pinski Date: Mon, 30 Apr 2007 10:01:18 -0700 Subject: [multiple changes] 2007-04-30 Andrew Pinski 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 PR C++/31721 * g++.dg/ext/vector7.C: New testcase. From-SVN: r124300 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 7 ++++++- gcc/testsuite/g++.dg/ext/vector7.C | 8 ++++++++ gcc/tree.c | 13 ++++++++++--- 4 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/vector7.C (limited to 'gcc') 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 + + 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 * 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 +2007-04-30 Andrew pinski + + PR C++/31721 + * g++.dg/ext/vector7.C: New testcase. + +2007-04-29 Francois-Xavier Coudert 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) { -- cgit v1.1