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.
This commit is contained in:
parent
3cb0c7cc16
commit
6d1556ecfa
4 changed files with 29 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
15
gcc/testsuite/g++.dg/warn/pr94038-3.C
Normal file
15
gcc/testsuite/g++.dg/warn/pr94038-3.C
Normal file
|
@ -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);
|
Loading…
Add table
Reference in a new issue