From: Jason Merrill Date: Thu, 25 Feb 2016 14:09:24 +0000 (-0500) Subject: re PR c++/67364 ("accessing uninitialized member" error in constexpr context) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6a0cc1cd6c5f5fbc4675ac7c3e7a899a3d8d4475;p=gcc.git re PR c++/67364 ("accessing uninitialized member" error in constexpr context) PR c++/67364 * constexpr.c (cxx_eval_component_reference): Don't complain about unevaluated empty classes. From-SVN: r233716 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index eb5cfe6b566..97296e4d222 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2016-02-25 Jason Merrill + PR c++/67364 + * constexpr.c (cxx_eval_component_reference): Don't complain about + unevaluated empty classes. + PR c++/68049 * tree.c (strip_typedefs): Use DECL_ORIGINAL_TYPE. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index d3b04b11e80..8d9168c3950 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -1983,7 +1983,8 @@ cxx_eval_component_reference (const constexpr_ctx *ctx, tree t, return t; } - if (CONSTRUCTOR_NO_IMPLICIT_ZERO (whole)) + if (CONSTRUCTOR_NO_IMPLICIT_ZERO (whole) + && !is_empty_class (TREE_TYPE (part))) { /* 'whole' is part of the aggregate initializer we're currently building; if there's no initializer for this member yet, that's an diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-empty10.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-empty10.C new file mode 100644 index 00000000000..694ed3d1277 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-empty10.C @@ -0,0 +1,17 @@ +// PR c++/67364 +// { dg-do compile { target c++11 } } + +template +struct element : Xn { + constexpr element() : Xn() { } +}; + +template +struct closure { + element member; + constexpr closure() { } +}; + +struct empty { }; +constexpr closure tup{}; +constexpr empty first = tup.member;