aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2013-05-20 13:01:09 -0400
committerJason Merrill <jason@gcc.gnu.org>2013-05-20 13:01:09 -0400
commit9f0bdc935f2199a2247b9d30858a9262d1a6bfa8 (patch)
tree29e63f39501d7b153fe603378cbc7d205bbf7167
parent14c2ec26e2d1232b88906927355517d34ffdbab6 (diff)
downloadgcc-9f0bdc935f2199a2247b9d30858a9262d1a6bfa8.zip
gcc-9f0bdc935f2199a2247b9d30858a9262d1a6bfa8.tar.gz
gcc-9f0bdc935f2199a2247b9d30858a9262d1a6bfa8.tar.bz2
re PR c++/57325 (ICE in strip_typedefs, at cp/tree.c:1306)
PR c++/57325 * tree.c (build_cplus_array_type): Copy layout info if element type is complete. From-SVN: r199113
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/tree.c6
-rw-r--r--gcc/testsuite/g++.dg/template/array26.C40
3 files changed, 50 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f7c4547..5ea7a27 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2013-05-20 Jason Merrill <jason@redhat.com>
+
+ PR c++/57325
+ * tree.c (build_cplus_array_type): Copy layout info if element
+ type is complete.
+
2013-05-20 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/23608
diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 2df2087..9c324e3 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -829,10 +829,12 @@ build_cplus_array_type (tree elt_type, tree index_type)
if (TYPE_MAIN_VARIANT (t) != m)
{
- if (COMPLETE_TYPE_P (t) && !COMPLETE_TYPE_P (m))
+ if (COMPLETE_TYPE_P (TREE_TYPE (t)) && !COMPLETE_TYPE_P (m))
{
/* m was built before the element type was complete, so we
- also need to copy the layout info from t. */
+ also need to copy the layout info from t. We might
+ end up doing this multiple times if t is an array of
+ unknown bound. */
tree size = TYPE_SIZE (t);
tree size_unit = TYPE_SIZE_UNIT (t);
unsigned int align = TYPE_ALIGN (t);
diff --git a/gcc/testsuite/g++.dg/template/array26.C b/gcc/testsuite/g++.dg/template/array26.C
new file mode 100644
index 0000000..6692071
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/array26.C
@@ -0,0 +1,40 @@
+// PR c++/57325
+
+class valarray { int _M_data; };
+template < typename > struct SimpleJet { valarray partials; };
+
+template < class C > struct scoped_ptr_impl
+{
+ scoped_ptr_impl (C *):data_ () { }
+ struct Data
+ {
+ C ptr;
+ };
+ Data data_;
+};
+
+template < class, class = int >struct scoped_ptr;
+template < class C, class D > struct scoped_ptr <C[], D >
+{
+ scoped_ptr ():impl_ (0) { }
+ scoped_ptr_impl < C > impl_;
+};
+
+template < typename JetsT > void
+TestJets (JetsT *)
+{
+ typedef typename JetsT::JetType JetT;
+ scoped_ptr < JetT[] > a;
+}
+
+template < typename T > struct SimpleJets
+{
+ typedef SimpleJet < T > JetType;
+ scoped_ptr < SimpleJet < T >[] > vars_;
+};
+
+void fn ()
+{
+ SimpleJets < double >b;
+ TestJets (&b);
+}