re PR c++/54325 (C++11 uniform initialization syntax for argument-less abstract base class constructor fails)

PR c++/54325
	* tree.c (build_aggr_init_expr): Don't check for abstract class.

From-SVN: r194290
This commit is contained in:
Jason Merrill 2012-12-07 00:13:33 -05:00 committed by Jason Merrill
parent 54ca6baf7a
commit 6ad351516e
4 changed files with 36 additions and 7 deletions

View 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.

View File

@ -396,18 +396,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)
@ -466,6 +461,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

View File

@ -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;
}

View File

@ -8,5 +8,5 @@ struct A // { dg-message "note" }
struct B
{
A a; // { dg-error "abstract" }
B() : a() {} // { dg-error "abstract" }
B() : a() {}
};