Commit f388b7be by Jason Merrill Committed by Jason Merrill

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

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

From-SVN: r238688
parent 2dac37c0
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.
......
......@@ -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)
......
// 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;
}
// PR c++/71774
// { dg-do compile { target c++11 } }
class Meow
{
protected:
Meow() =default;
virtual void f() {}
};
class Purr : public Meow
{
public:
Purr()
: Meow{}
{}
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment