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:
Patrick Palka 2020-05-23 14:39:28 -04:00
parent 3cb0c7cc16
commit 6d1556ecfa
4 changed files with 29 additions and 1 deletions

View file

@ -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

View file

@ -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;

View file

@ -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.

View 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);