aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-11-19 22:28:22 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-11-19 22:28:22 +0100
commitfce6467b1ef93c162f955a10d9bdb2bfb2e12c1c (patch)
treeb8a1da4576a3bcf5ef2182777180953d6af6f675 /gcc
parent8d5d90878ea9731301d3a1af32a444e4772e65e4 (diff)
downloadgcc-fce6467b1ef93c162f955a10d9bdb2bfb2e12c1c.zip
gcc-fce6467b1ef93c162f955a10d9bdb2bfb2e12c1c.tar.gz
gcc-fce6467b1ef93c162f955a10d9bdb2bfb2e12c1c.tar.bz2
re PR c++/92414 (internal compiler error: tree check: expected constructor, have error_mark in cxx_eval_store_expression, at cp/constexpr.c:4009)
PR c++/92414 * constexpr.c (cxx_eval_outermost_constant_expr): If DECL_INITIAL on object is erroneous, return t without trying to evaluate a constexpr dtor. * g++.dg/cpp2a/constexpr-dtor4.C: New test. From-SVN: r278468
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/constexpr.c2
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/constexpr-dtor4.C15
4 files changed, 30 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2313a82..0d78df6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2019-11-19 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/92414
+ * constexpr.c (cxx_eval_outermost_constant_expr): If DECL_INITIAL
+ on object is erroneous, return t without trying to evaluate
+ a constexpr dtor.
+
2019-11-12 Jason Merrill <jason@redhat.com>
* call.c (same_fn_or_template): Change to cand_parms_match.
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c
index 8c79b04..9ce768b 100644
--- a/gcc/cp/constexpr.c
+++ b/gcc/cp/constexpr.c
@@ -5834,6 +5834,8 @@ cxx_eval_outermost_constant_expr (tree t, bool allow_non_constant,
gcc_assert (object && VAR_P (object));
gcc_assert (DECL_DECLARED_CONSTEXPR_P (object));
gcc_assert (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (object));
+ if (error_operand_p (DECL_INITIAL (object)))
+ return t;
ctx.ctor = unshare_expr (DECL_INITIAL (object));
TREE_READONLY (ctx.ctor) = false;
/* Temporarily force decl_really_constant_value to return false
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fc275fa..2cc8db5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,9 +1,14 @@
+2019-11-19 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/92414
+ * g++.dg/cpp2a/constexpr-dtor4.C: New test.
+
2019-11-19 Dragan Mladjenovic <dmladjenovic@wavecomp.com>
* gcc.target/mips/msa-ds.c: New test.
2019-11-19 Richard Sandiford <richard.sandiford@arm.com>
-gcc/
+
Revert:
2019-11-18 Richard Sandiford <richard.sandiford@arm.com>
diff --git a/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor4.C b/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor4.C
new file mode 100644
index 0000000..68ad69c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/constexpr-dtor4.C
@@ -0,0 +1,15 @@
+// PR c++/92414
+// { dg-do compile { target c++2a } }
+
+struct A { virtual void foo (); };
+
+struct B : A {
+ constexpr B (int); // { dg-warning "used but never defined" }
+ constexpr ~B () { }
+};
+
+struct D : B {
+ constexpr D () : B (42) { } // { dg-error "used before its definition" }
+};
+
+constexpr D d; // { dg-message "in 'constexpr' expansion of" }