diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-11-19 22:28:22 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-11-19 22:28:22 +0100 |
commit | fce6467b1ef93c162f955a10d9bdb2bfb2e12c1c (patch) | |
tree | b8a1da4576a3bcf5ef2182777180953d6af6f675 | |
parent | 8d5d90878ea9731301d3a1af32a444e4772e65e4 (diff) | |
download | gcc-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
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/constexpr-dtor4.C | 15 |
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" } |