re PR c++/57325 (ICE in strip_typedefs, at cp/tree.c:1306)
authorJason Merrill <jason@redhat.com>
Mon, 20 May 2013 17:01:09 +0000 (13:01 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Mon, 20 May 2013 17:01:09 +0000 (13:01 -0400)
PR c++/57325
* tree.c (build_cplus_array_type): Copy layout info if element
type is complete.

From-SVN: r199113

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/g++.dg/template/array26.C [new file with mode: 0644]

index f7c4547456e661bdfc0d8e1bb6e7b22036963fe1..5ea7a27625a93b1b90d54b37fad67121b0e0d9e2 100644 (file)
@@ -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
index 2df2087afb2d461db59db8e9a9415934fa477b69..9c324e34b31644c8ab7d9d20a74e4bcdc2afef7a 100644 (file)
@@ -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 (file)
index 0000000..6692071
--- /dev/null
@@ -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);
+}