class.c (type_has_constexpr_default_constructor): Make sure the caller stripped an...
authorJason Merrill <jason@redhat.com>
Thu, 10 Feb 2011 16:29:49 +0000 (11:29 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Thu, 10 Feb 2011 16:29:49 +0000 (11:29 -0500)
* class.c (type_has_constexpr_default_constructor): Make sure the
caller stripped an enclosing array.
* init.c (perform_member_init): Strip arrays before calling it.

From-SVN: r170006

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/init.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/regress/abi-empty7.C [new file with mode: 0644]

index f247933dba04ca90cba6ab75453806087bf4cd60..26de2b6ea0e643c97168fe6fdc25e2c28a39ec5c 100644 (file)
@@ -1,5 +1,9 @@
 2011-02-09  Jason Merrill  <jason@redhat.com>
 
+       * class.c (type_has_constexpr_default_constructor): Make sure the
+       caller stripped an enclosing array.
+       * init.c (perform_member_init): Strip arrays before calling it.
+
        PR c++/47511
        * semantics.c (potential_constant_expression_1): Handle TEMPLATE_DECL.
 
index 03951cfa4ea3ecd504ac6366b904d8c901baf3ec..66c85bdb5dee1be1b15db2e0f2e622b763cd1545 100644 (file)
@@ -4349,7 +4349,11 @@ type_has_constexpr_default_constructor (tree t)
   tree fns;
 
   if (!CLASS_TYPE_P (t))
-    return false;
+    {
+      /* The caller should have stripped an enclosing array.  */
+      gcc_assert (TREE_CODE (t) != ARRAY_TYPE);
+      return false;
+    }
   if (CLASSTYPE_LAZY_DEFAULT_CTOR (t))
     return synthesized_default_constructor_is_constexpr (t);
   fns = locate_ctor (t);
index 6ffdc2f3f364efeee5857fae919b83fe557bfa7d..e590118f3cfb1d3a647e192a86db431621c088c5 100644 (file)
@@ -535,8 +535,10 @@ perform_member_init (tree member, tree init)
                       "uninitialized member %qD with %<const%> type %qT",
                       member, type);
 
+         core_type = strip_array_types (type);
+
          if (DECL_DECLARED_CONSTEXPR_P (current_function_decl)
-             && !type_has_constexpr_default_constructor (type))
+             && !type_has_constexpr_default_constructor (core_type))
            {
              if (!DECL_TEMPLATE_INSTANTIATION (current_function_decl))
                error ("uninitialized member %qD in %<constexpr%> constructor",
@@ -544,7 +546,6 @@ perform_member_init (tree member, tree init)
              DECL_DECLARED_CONSTEXPR_P (current_function_decl) = false;
            }
 
-         core_type = strip_array_types (type);
          if (CLASS_TYPE_P (core_type)
              && (CLASSTYPE_READONLY_FIELDS_NEED_INIT (core_type)
                  || CLASSTYPE_REF_FIELDS_NEED_INIT (core_type)))
index c37a2730f5a1a47344280ed036471755858f77d5..8d7e3871c8166c925b5c6f104a0f415e170e048b 100644 (file)
@@ -1,5 +1,7 @@
 2011-02-09  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/cpp0x/regress/abi-empty7.C: New.
+
        * g++.dg/cpp0x/regress: New directory.
        * g++.dg/cpp0x/constexpr-regress1.C: Move to regress/regress1.C.
        * g++.dg/cpp0x/constexpr-regress2.C: Move to regress/regress2.C.
diff --git a/gcc/testsuite/g++.dg/cpp0x/regress/abi-empty7.C b/gcc/testsuite/g++.dg/cpp0x/regress/abi-empty7.C
new file mode 100644 (file)
index 0000000..adc7127
--- /dev/null
@@ -0,0 +1,20 @@
+// Copy of abi/empty7.C.
+// { dg-do run { target i?86-*-* x86_64-*-* } }
+// { dg-require-effective-target ilp32 }
+// { dg-options "-fabi-version=0 -std=c++0x" }
+
+struct S1 {};
+struct S2 { virtual void f () {} S1 s1[4]; };
+struct S3 : virtual public S2 {};
+struct S4 : virtual public S2 { int i; };
+struct S5 : public S3, virtual public S4 {};
+struct S6 { S5 s5; };
+struct S7 { S1 s1[5]; };
+struct S8 : public S1, public S6, virtual public S7 { };
+
+S8 s8;
+
+int main () {
+  if ((char *)(S7 *)&s8 - (char *)&s8 != 24)
+    return 1;
+}