PR c++/55922 - list-value-initialization of base

PR c++/63151
	* init.c (expand_aggr_init_1): Handle list-initialization from {}.

From-SVN: r238688
This commit is contained in:
Jason Merrill 2016-07-23 22:56:22 -04:00 committed by Jason Merrill
parent 2dac37c091
commit f388b7be18
4 changed files with 55 additions and 0 deletions

View File

@ -1,5 +1,9 @@
2016-07-23 Jason Merrill <jason@redhat.com>
PR c++/55922
PR c++/63151
* init.c (expand_aggr_init_1): Handle list-initialization from {}.
PR c++/70709
* class.c (walk_subobject_offsets): Handle 0-length array.

View File

@ -1817,6 +1817,19 @@ expand_aggr_init_1 (tree binfo, tree true_exp, tree exp, tree init, int flags,
return;
}
/* List-initialization from {} becomes value-initialization for non-aggregate
classes with default constructors. Handle this here so protected access
works. */
if (init && TREE_CODE (init) == TREE_LIST)
{
tree elt = TREE_VALUE (init);
if (DIRECT_LIST_INIT_P (elt)
&& CONSTRUCTOR_ELTS (elt) == 0
&& CLASSTYPE_NON_AGGREGATE (type)
&& TYPE_HAS_DEFAULT_CONSTRUCTOR (type))
init = void_type_node;
}
/* If an explicit -- but empty -- initializer list was present,
that's value-initialization. */
if (init == void_type_node)

View File

@ -0,0 +1,21 @@
// PR c++/55922
// { dg-do run { target c++11 } }
bool called = false;
struct Base {
Base() { if (called) throw 1; called = true; }
};
struct B1 : virtual Base {
B1() { }
};
struct C : B1, virtual Base {
C() : B1{}
{ }
};
int main() {
C c;
}

View File

@ -0,0 +1,17 @@
// PR c++/71774
// { dg-do compile { target c++11 } }
class Meow
{
protected:
Meow() =default;
virtual void f() {}
};
class Purr : public Meow
{
public:
Purr()
: Meow{}
{}
};