re PR c++/54325 (C++11 uniform initialization syntax for argument-less abstract base...
authorJason Merrill <jason@redhat.com>
Fri, 7 Dec 2012 04:54:27 +0000 (23:54 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 7 Dec 2012 04:54:27 +0000 (23:54 -0500)
PR c++/54325
* tree.c (build_aggr_init_expr): Don't check for abstract class.

From-SVN: r194284

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/g++.dg/cpp0x/initlist-pure.C [new file with mode: 0644]
gcc/testsuite/g++.dg/other/abstract3.C

index a92ebe147c9a07cf22f1358935c5244be05d3eea..7bec9ca96caa3da802335b9c88596a745cad58e5 100644 (file)
@@ -1,5 +1,9 @@
 2012-12-06  Jason Merrill  <jason@redhat.com>
 
+       PR c++/54325
+       * tree.c (build_aggr_init_expr): Don't check for abstract class.
+       (build_cplus_new): Check here instead.
+
        PR c++/55058
        * pt.c (tsubst): Keep the quals when looking through a typedef.
 
index 28ff0f20eb11a4ce7c3ae40be2e7ca2da3dd7001..ca82f75eb64ec8c12f9c652b448a319b513f0faa 100644 (file)
@@ -407,18 +407,13 @@ build_aggr_init_array (tree return_type, tree fn, tree slot, int nargs,
    callable.  */
 
 tree
-build_aggr_init_expr (tree type, tree init, tsubst_flags_t complain)
+build_aggr_init_expr (tree type, tree init, tsubst_flags_t /*complain*/)
 {
   tree fn;
   tree slot;
   tree rval;
   int is_ctor;
 
-  /* Make sure that we're not trying to create an instance of an
-     abstract class.  */
-  if (abstract_virtuals_error_sfinae (NULL_TREE, type, complain))
-    return error_mark_node;
-
   if (TREE_CODE (init) == CALL_EXPR)
     fn = CALL_EXPR_FN (init);
   else if (TREE_CODE (init) == AGGR_INIT_EXPR)
@@ -477,6 +472,11 @@ build_cplus_new (tree type, tree init, tsubst_flags_t complain)
   tree rval = build_aggr_init_expr (type, init, complain);
   tree slot;
 
+  /* Make sure that we're not trying to create an instance of an
+     abstract class.  */
+  if (abstract_virtuals_error_sfinae (NULL_TREE, type, complain))
+    return error_mark_node;
+
   if (TREE_CODE (rval) == AGGR_INIT_EXPR)
     slot = AGGR_INIT_EXPR_SLOT (rval);
   else if (TREE_CODE (rval) == CALL_EXPR
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-pure.C b/gcc/testsuite/g++.dg/cpp0x/initlist-pure.C
new file mode 100644 (file)
index 0000000..63c341c
--- /dev/null
@@ -0,0 +1,25 @@
+// PR c++/54325
+// { dg-options -std=c++11 }
+
+class Base {
+public:
+  Base() {};
+  virtual ~Base() {};
+
+  virtual void do_stuff() = 0;
+};
+
+class Derived: public Base {
+public:
+  Derived() : Base{} {};
+  virtual ~Derived() {};
+
+  virtual void do_stuff() {};
+};
+
+int
+main() {
+  Derived d;
+
+  return 0;
+}
index 528b7d793605ee36b7762b75ab28b249ee010df5..95e293e501b2b01b9c8d4fe050aeed8b0080a0fb 100644 (file)
@@ -8,5 +8,5 @@ struct A                  // { dg-message "note" }
 struct B
 {
   A a;           // { dg-error "abstract" }
-  B() : a() {}   // { dg-error "abstract" }
+  B() : a() {}
 };