diff options
author | Marek Polacek <polacek@redhat.com> | 2020-06-18 09:38:42 -0400 |
---|---|---|
committer | Giuliano Belinassi <giuliano.belinassi@usp.br> | 2020-08-17 13:14:02 -0300 |
commit | 2e323e17e4839b7ea7eee20db6e4206a8ac618e4 (patch) | |
tree | f36f75db8ac347efdf3dc2d3664ed71f195a23c2 /gcc | |
parent | 3b90d824360703e7c9e7ee2bc2751fb5846b4874 (diff) | |
download | gcc-2e323e17e4839b7ea7eee20db6e4206a8ac618e4.zip gcc-2e323e17e4839b7ea7eee20db6e4206a8ac618e4.tar.gz gcc-2e323e17e4839b7ea7eee20db6e4206a8ac618e4.tar.bz2 |
c++: ICE in requires-expressions with invalid args [PR95735]
This ICE-on-invalid goes back to GCC 6. In finish_template_variable,
if coerce_innermost_template_parms returns error_mark_node, we pass
it down to constraints_satisfied_p and that error_mark_node flows
down to various satisfy_* functions and then to various tsubst_*
functions, where we crash. diagnose_constraints also doesn't cope
with error arglist, so I think we should just return as in the
patch below.
gcc/cp/ChangeLog:
PR c++/95735
* pt.c (finish_template_variable): Return if
coerce_innermost_template_parms return error_mark_node.
gcc/testsuite/ChangeLog:
PR c++/95735
* g++.dg/cpp2a/concepts-err2.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/pt.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp2a/concepts-err2.C | 11 |
2 files changed, 13 insertions, 0 deletions
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 9732e3b..1c0759e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -10154,6 +10154,8 @@ finish_template_variable (tree var, tsubst_flags_t complain) arglist = coerce_innermost_template_parms (parms, arglist, templ, complain, /*req_all*/true, /*use_default*/true); + if (arglist == error_mark_node) + return error_mark_node; if (flag_concepts && !constraints_satisfied_p (templ, arglist)) { diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-err2.C b/gcc/testsuite/g++.dg/cpp2a/concepts-err2.C new file mode 100644 index 0000000..c0372a6 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-err2.C @@ -0,0 +1,11 @@ +// PR c++/95735 +// { dg-do compile { target concepts } } + +template <auto F> + requires requires { F(); } +bool v{}; + +void f() { + int x; + static_assert(v<[&] { x++; }>); // { dg-error "not a constant expression" } +} |