[PATCH] D153296: [AST] Stop evaluate constant expression if the condition expression which in switch statement contains errors
Yurong via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 22 11:54:26 PDT 2023
yronglin updated this revision to Diff 533714.
yronglin added a comment.
Address comments
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D153296/new/
https://reviews.llvm.org/D153296
Files:
clang/lib/AST/ExprConstant.cpp
clang/test/SemaCXX/switch.cpp
Index: clang/test/SemaCXX/switch.cpp
===================================================================
--- clang/test/SemaCXX/switch.cpp
+++ clang/test/SemaCXX/switch.cpp
@@ -1,4 +1,5 @@
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++17 %s
void test() {
bool x = true;
@@ -146,3 +147,17 @@
}
} // namespace EmptyEnum
+
+#if __cplusplus >= 201703L
+constexpr int foo(unsigned char c) {
+ switch (unknown_value) { // expected-error {{use of undeclared identifier}}
+ case 0:
+ return 7;
+ default:
+ break;
+ }
+ return 0;
+}
+
+static_assert(foo('d')); // expected-error {{static assertion expression is not an integral constant expression}}
+#endif
Index: clang/lib/AST/ExprConstant.cpp
===================================================================
--- clang/lib/AST/ExprConstant.cpp
+++ clang/lib/AST/ExprConstant.cpp
@@ -4889,6 +4889,9 @@
static bool EvaluateDependentExpr(const Expr *E, EvalInfo &Info) {
assert(E->isValueDependent());
+ // Stop evaluate if E is a RecoveryExpr.
+ if (isa<RecoveryExpr>(E))
+ return false;
if (Info.noteSideEffect())
return true;
assert(E->containsErrors() && "valid value-dependent expression should never "
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D153296.533714.patch
Type: text/x-patch
Size: 1273 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230622/93a5debb/attachment.bin>
More information about the cfe-commits
mailing list