diff options
author | Patrick Palka <ppalka@redhat.com> | 2020-05-23 14:39:28 -0400 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2020-05-23 14:39:28 -0400 |
commit | 6d1556ecfae3eff010ef7dc15f3da998403fa196 (patch) | |
tree | 97e25bb6e9824b291ae5e5bd1cfc0be8a18596ca /gcc | |
parent | 3cb0c7cc160a50f830bfa9aa5a3264b773a28bf8 (diff) | |
download | gcc-6d1556ecfae3eff010ef7dc15f3da998403fa196.zip gcc-6d1556ecfae3eff010ef7dc15f3da998403fa196.tar.gz gcc-6d1556ecfae3eff010ef7dc15f3da998403fa196.tar.bz2 |
c++: Avoid concept evaluation when uid-sensitive [PR94038]
Concept evaluation may entail DECL_UID generation and/or template
instantiation, so in general we can't perform it during uid-sensitive
constexpr evaluation.
gcc/cp/ChangeLog:
PR c++/94038
* constexpr.c (cxx_eval_constant_expression)
<case TEMPLATE_ID_EXPR>: Don't evaluate the concept when
constexpr evaluation is uid-sensitive.
gcc/testsuite/ChangeLog:
PR c++/94038
* g++.dg/warn/pr94038-3.C: New test.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/constexpr.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/pr94038-3.C | 15 |
4 files changed, 29 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 385bfcd..2feeb12 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2020-05-23 Patrick Palka <ppalka@redhat.com> + + PR c++/94038 + * constexpr.c (cxx_eval_constant_expression) + <case TEMPLATE_ID_EXPR>: Don't evaluate the concept when + constexpr evaluation is uid-sensitive. + 2020-05-21 Patrick Palka <ppalka@redhat.com> PR c++/94038 diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index 98c974e..4e441ac 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -6486,7 +6486,8 @@ cxx_eval_constant_expression (const constexpr_ctx *ctx, tree t, break; } - if (!processing_template_decl) + if (!processing_template_decl + && !uid_sensitive_constexpr_evaluation_p ()) r = evaluate_concept_check (t, tf_warning_or_error); else *non_constant_p = true; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9711a27..80fd33d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-05-23 Patrick Palka <ppalka@redhat.com> + + PR c++/94038 + * g++.dg/warn/pr94038-3.C: New test. + 2020-05-22 Mark Wielaard <mark@klomp.org> * gcc.dg/spellcheck-stdint.c: New test. diff --git a/gcc/testsuite/g++.dg/warn/pr94038-3.C b/gcc/testsuite/g++.dg/warn/pr94038-3.C new file mode 100644 index 0000000..49b6d13 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr94038-3.C @@ -0,0 +1,15 @@ +// PR c++/94038 +// { dg-do compile { target c++20 } } +// { dg-additional-options "-Wall" } + +template<typename T> +constexpr int foo() { + return T::x; +} + +constexpr bool bar(bool a) { return a; } + +template<typename T> +concept C = foo<T>() == 0; + +static_assert(decltype(bar(C<int>)){} == false); |