aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2018-03-19 20:46:16 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2018-03-19 20:46:16 +0000
commitac9ec1988a6d0add2eb724a5d1a9d06101623c51 (patch)
treea3847b60c31c362e39f3aea067f15282fcf7b0c0 /gcc
parente5cc0d5453f3a79902522c719fe4fd5765b689b3 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/cp/constexpr.c13
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/cpp1y/nsdmi-aggr9.C14
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};
+}