re PR c++/67364 ("accessing uninitialized member" error in constexpr context)

PR c++/67364

	* constexpr.c (cxx_eval_component_reference): Just return an empty
	CONSTRUCTOR for an empty class.

From-SVN: r233945
This commit is contained in:
Jason Merrill 2016-03-03 17:43:03 -05:00 committed by Jason Merrill
parent 2e981ba068
commit 639475f047
3 changed files with 26 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2016-03-03 Jason Merrill <jason@redhat.com>
PR c++/67364
* constexpr.c (cxx_eval_component_reference): Just return an empty
CONSTRUCTOR for an empty class.
2016-03-01 Jason Merrill <jason@redhat.com>
PR c++/70036

View File

@ -1988,11 +1988,12 @@ cxx_eval_component_reference (const constexpr_ctx *ctx, tree t,
}
if (CONSTRUCTOR_NO_IMPLICIT_ZERO (whole)
&& !is_empty_class (TREE_TYPE (part)))
&& !is_really_empty_class (TREE_TYPE (t)))
{
/* 'whole' is part of the aggregate initializer we're currently
building; if there's no initializer for this member yet, that's an
error. */
error. But expand_aggr_init_1 doesn't bother to initialize really
empty classes, so ignore them here, too. */
if (!ctx->quiet)
error ("accessing uninitialized member %qD", part);
*non_constant_p = true;

View File

@ -0,0 +1,17 @@
// PR c++/67364
// { dg-do compile { target c++11 } }
template <typename Xn>
struct element : Xn {
constexpr element() : Xn() { }
};
template <typename Xn>
struct closure {
element<Xn> member;
constexpr closure() { }
};
struct empty { struct {} s; };
constexpr closure<empty> tup{};
constexpr empty first = tup.member;