diff options
author | Marek Polacek <polacek@redhat.com> | 2018-03-19 20:46:16 +0000 |
---|---|---|
committer | Marek Polacek <mpolacek@gcc.gnu.org> | 2018-03-19 20:46:16 +0000 |
commit | ac9ec1988a6d0add2eb724a5d1a9d06101623c51 (patch) | |
tree | a3847b60c31c362e39f3aea067f15282fcf7b0c0 /gcc | |
parent | e5cc0d5453f3a79902522c719fe4fd5765b689b3 (diff) | |
download | gcc-ac9ec1988a6d0add2eb724a5d1a9d06101623c51.zip gcc-ac9ec1988a6d0add2eb724a5d1a9d06101623c51.tar.gz gcc-ac9ec1988a6d0add2eb724a5d1a9d06101623c51.tar.bz2 |
re PR c++/84927 (ICE with NSDMI and reference)
PR c++/84927
* constexpr.c (cxx_eval_bare_aggregate): Update constructor's flags
as we evaluate the elements.
(cxx_eval_constant_expression): Verify constructor's flags
unconditionally.
* g++.dg/cpp1y/nsdmi-aggr9.C: New test.
From-SVN: r258661
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr9.C | 14 |
4 files changed, 30 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 712d4d8..236ea21 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -3,6 +3,12 @@ PR c++/84925 * pt.c (enclosing_instantiation_of): Check if fn is null. + PR c++/84927 + * constexpr.c (cxx_eval_bare_aggregate): Update constructor's flags + as we evaluate the elements. + (cxx_eval_constant_expression): Verify constructor's flags + unconditionally. + 2018-03-16 Jason Merrill <jason@redhat.com> PR c++/71834 - template-id with too few arguments. diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 05a1cb6..894bcd0 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -2880,7 +2880,12 @@ cxx_eval_bare_aggregate (const constexpr_ctx *ctx, tree t, (*p)->last().value = elt; } else - CONSTRUCTOR_APPEND_ELT (*p, index, elt); + { + CONSTRUCTOR_APPEND_ELT (*p, index, elt); + /* Adding an element might change the ctor's flags. */ + TREE_CONSTANT (ctx->ctor) = constant_p; + TREE_SIDE_EFFECTS (ctx->ctor) = side_effects_p; + } } if (*non_constant_p || !changed) return t; @@ -4530,11 +4535,7 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, { /* Don't re-process a constant CONSTRUCTOR, but do fold it to VECTOR_CST if applicable. */ - /* FIXME after GCC 6 branches, make the verify unconditional. */ - if (CHECKING_P) - verify_constructor_flags (t); - else - recompute_constructor_flags (t); + verify_constructor_flags (t); if (TREE_CONSTANT (t)) return fold (t); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 882dc9a..7638ca1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ PR c++/84925 * g++.dg/cpp1z/lambda-__func__.C: New test. + PR c++/84927 + * g++.dg/cpp1y/nsdmi-aggr9.C: New test. + 2018-03-19 Maxim Ostapenko <m.ostapenko@samsung.com> PR sanitizer/78651 diff --git a/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr9.C b/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr9.C new file mode 100644 index 0000000..4e13fc5c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr9.C @@ -0,0 +1,14 @@ +// PR c++/84927 - ICE with NSDMI and reference +// { dg-do compile { target c++14 } } + +struct A +{ + int& r; + int i = r; +}; + +void foo() +{ + int j; + A a = A{j}; +} |