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: r194284
This commit is contained in:
parent
c7dd75fb5c
commit
0ed4ab44f6
@ -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.
|
||||
|
||||
|
@ -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
|
||||
|
25
gcc/testsuite/g++.dg/cpp0x/initlist-pure.C
Normal file
25
gcc/testsuite/g++.dg/cpp0x/initlist-pure.C
Normal 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;
|
||||
}
|
@ -8,5 +8,5 @@ struct A // { dg-message "note" }
|
||||
struct B
|
||||
{
|
||||
A a; // { dg-error "abstract" }
|
||||
B() : a() {} // { dg-error "abstract" }
|
||||
B() : a() {}
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user