[PATCH] D157195: [Clang] Fix the do while statement disappearing in AST when an error occurs in the conditional expression of the do while statement
Yurong via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Aug 5 09:48:22 PDT 2023
yronglin created this revision.
Herald added a project: All.
yronglin requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Signed-off-by: yrong <yronglin777 at gmail.com>
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D157195
Files:
clang/lib/Parse/ParseStmt.cpp
clang/test/AST/ast-dump-recovery.cpp
clang/test/SemaCXX/constexpr-function-recovery-crash.cpp
Index: clang/test/SemaCXX/constexpr-function-recovery-crash.cpp
===================================================================
--- clang/test/SemaCXX/constexpr-function-recovery-crash.cpp
+++ clang/test/SemaCXX/constexpr-function-recovery-crash.cpp
@@ -78,6 +78,9 @@
constexpr int test12() { return "wrong"; } // expected-error {{cannot initialize return object of type 'int'}}
constexpr int force12 = test12(); // expected-error {{must be initialized by a constant}}
+constexpr int test13() { do {} while (a < 10); return 0; } // expected-error {{use of undeclared identifier}}
+static_assert(test13()); // expected-error {{static assertion expression is not an integral constant expression}}
+
#define TEST_EVALUATE(Name, X) \
constexpr int testEvaluate##Name() { \
X return 0; \
Index: clang/test/AST/ast-dump-recovery.cpp
===================================================================
--- clang/test/AST/ast-dump-recovery.cpp
+++ clang/test/AST/ast-dump-recovery.cpp
@@ -420,3 +420,15 @@
// CHECK: RecoveryExpr {{.*}} '<dependent type>' contains-errors lvalue
// CHECK-NEXT: `-DeclRefExpr {{.*}} 'foo' 'int *'
}
+
+void RecoveryToDoWhileStmtCond() {
+ // CHECK: FunctionDecl {{.*}} RecoveryToDoWhileStmtCond
+ // CHECK: `-DoStmt {{.*}}
+ // CHECK-NEXT: |-CompoundStmt {{.*}}
+ // CHECK-NEXT: `-BinaryOperator {{.*}} '<dependent type>' contains-errors '<'
+ // CHECK-NEXT: |-BinaryOperator {{.*}} '<dependent type>' contains-errors '+'
+ // CHECK-NEXT: | |-RecoveryExpr {{.*}} '<dependent type>' contains-errors lvalue
+ // CHECK-NEXT: | `-IntegerLiteral {{.*}} 'int' 1
+ // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 10
+ do {} while (some_invalid_val + 1 < 10);
+}
Index: clang/lib/Parse/ParseStmt.cpp
===================================================================
--- clang/lib/Parse/ParseStmt.cpp
+++ clang/lib/Parse/ParseStmt.cpp
@@ -1894,7 +1894,8 @@
ExprResult Cond = ParseExpression();
// Correct the typos in condition before closing the scope.
if (Cond.isUsable())
- Cond = Actions.CorrectDelayedTyposInExpr(Cond);
+ Cond = Actions.CorrectDelayedTyposInExpr(Cond, /*InitDecl*/ nullptr,
+ /*RecoveryUncorrectedTypos*/ true);
else {
if (!Tok.isOneOf(tok::r_paren, tok::r_square, tok::r_brace))
SkipUntil(tok::semi);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D157195.547496.patch
Type: text/x-patch
Size: 2430 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230805/1165a56e/attachment-0001.bin>
More information about the cfe-commits
mailing list