aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2020-05-23 14:39:28 -0400
committerPatrick Palka <ppalka@redhat.com>2020-05-23 14:39:28 -0400
commit6d1556ecfae3eff010ef7dc15f3da998403fa196 (patch)
tree97e25bb6e9824b291ae5e5bd1cfc0be8a18596ca /gcc
parent3cb0c7cc160a50f830bfa9aa5a3264b773a28bf8 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/cp/constexpr.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/warn/pr94038-3.C15
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);