[clang-repl] Always clean up scope and context for TopLevelStmtDecl#150215
[clang-repl] Always clean up scope and context for TopLevelStmtDecl#150215vgvassilev merged 1 commit intollvm:mainfrom
Conversation
|
@llvm/pr-subscribers-clang Author: Devajith (devajithvs) ChangesThis fixes an issue introduced by llvm/llvm-project@4b70d17, where failing to pop compound scope, function scope info, and decl context after a failed statement could lead to an inconsistent internal state. Full diff: https://github.com/llvm/llvm-project/pull/150215.diff 3 Files Affected:
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 893ef02450921..e47caeb855d0c 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -5695,11 +5695,10 @@ Parser::DeclGroupPtrTy Parser::ParseTopLevelStmtDecl() {
Scope::CompoundStmtScope);
TopLevelStmtDecl *TLSD = Actions.ActOnStartTopLevelStmtDecl(getCurScope());
StmtResult R = ParseStatementOrDeclaration(Stmts, SubStmtCtx);
+ Actions.ActOnFinishTopLevelStmtDecl(TLSD, R.get());
if (!R.isUsable())
R = Actions.ActOnNullStmt(Tok.getLocation());
- Actions.ActOnFinishTopLevelStmtDecl(TLSD, R.get());
-
if (Tok.is(tok::annot_repl_input_end) &&
Tok.getAnnotationValue() != nullptr) {
ConsumeAnnotationToken();
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index fd22e012ea8b0..6e6669886ba36 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -20573,7 +20573,8 @@ TopLevelStmtDecl *Sema::ActOnStartTopLevelStmtDecl(Scope *S) {
}
void Sema::ActOnFinishTopLevelStmtDecl(TopLevelStmtDecl *D, Stmt *Statement) {
- D->setStmt(Statement);
+ if (Statement)
+ D->setStmt(Statement);
PopCompoundScope();
PopFunctionScopeInfo();
PopDeclContext();
diff --git a/clang/test/Interpreter/fail.cpp b/clang/test/Interpreter/fail.cpp
index 633d92794325c..c13029bc6e155 100644
--- a/clang/test/Interpreter/fail.cpp
+++ b/clang/test/Interpreter/fail.cpp
@@ -18,4 +18,12 @@ extern "C" int printf(const char *, ...);
int i = 42;
auto r1 = printf("i = %d\n", i);
// CHECK: i = 42
+
+1aap = 42; // expected-error {{intended to fail the -verify test}}
+1aap = 42; i = 5;
+// expected-error {{intended to fail the -verify test but not hit an assertion}}
+
+printf("i = %d\n", i);
+// CHECK: i = 42
+
%quit
|
|
CC: @weliveindetail, @vgvassilev Not sure Fixes one of the failing test when updating ROOT/CLING to LLVM20: root-project/root#19242 |
There was a problem hiding this comment.
Can we spell out the actual diagnostic here?
6f8190a to
3111b1d
Compare
This fixes an issue introduced by llvm/llvm-project@4b70d17bcffa, where failing to pop compound scope, function scope info, and decl context after a failed statement could lead to an inconsistent internal state.
3111b1d to
92bcd85
Compare
vgvassilev
left a comment
There was a problem hiding this comment.
LGTM! @devajithvs, do you have commit access or should I merge?
|
I don't have commit access. It'd be great if you can merge. |
…lvm#150215) This fixes an issue introduced by llvm#84150, where failing to pop compound scope, function scope info, and decl context after a failed statement could lead to an inconsistent internal state.
…StmtDecl (llvm#150215) This fixes an issue introduced by llvm#84150, where failing to pop compound scope, function scope info, and decl context after a failed statement could lead to an inconsistent internal state. (cherry picked from commit 38a977d)
…StmtDecl (llvm#150215) This fixes an issue introduced by llvm#84150, where failing to pop compound scope, function scope info, and decl context after a failed statement could lead to an inconsistent internal state. (cherry picked from commit 38a977d)
This fixes an issue introduced by #84150, where failing to pop compound scope, function scope info, and decl context after a failed statement could lead to an inconsistent internal state.