llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Vipul Cariappa (Vipul-Cariappa)

<details>
<summary>Changes</summary>

Fixes the following crash in clang-repl

```c++
clang-repl&gt; try { throw 1; } catch { 0; }
In file included from &lt;&lt;&lt; inputs &gt;&gt;&gt;:1:
input_line_1:1:23: error: expected '('
    1 | try { throw 1; } catch { 0; }
      |                       ^
      |                       (
clang-repl: 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/clang/lib/AST/DeclBase.cpp:1757:
 void clang::DeclContext::addHiddenDecl(clang::Decl*): Assertion 
`D-&gt;getLexicalDeclContext() == this &amp;&amp; "Decl inserted into wrong 
lexical context"' failed.
 #<!-- -->0 0x000059b28459e6da 
llvm::sys::PrintStackTrace(llvm::raw_ostream&amp;, int) 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/llvm/lib/Support/Unix/Signals.inc:804:22
 #<!-- -->1 0x000059b28459eaed PrintStackTraceSignalHandler(void*) 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/llvm/lib/Support/Unix/Signals.inc:880:1
 #<!-- -->2 0x000059b28459bf7f llvm::sys::RunSignalHandlers() 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/llvm/lib/Support/Signals.cpp:105:20
 #<!-- -->3 0x000059b28459df8e SignalHandler(int, siginfo_t*, void*) 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/llvm/lib/Support/Unix/Signals.inc:418:13
 #<!-- -->4 0x000077cdf444ea50 (/usr/lib/libc.so.6+0x42a50)
 #<!-- -->5 0x000077cdf44aee3b pthread_kill (/usr/lib/libc.so.6+0xa2e3b)
 #<!-- -->6 0x000077cdf444e928 raise (/usr/lib/libc.so.6+0x42928)
 #<!-- -->7 0x000077cdf443156c abort (/usr/lib/libc.so.6+0x2556c)
 #<!-- -->8 0x000077cdf44314d2 __assert_perror_fail (/usr/lib/libc.so.6+0x254d2)
 #<!-- -->9 0x000077cdf4444c56 (/usr/lib/libc.so.6+0x38c56)
#<!-- -->10 0x000059b28495bfc4 clang::DeclContext::addHiddenDecl(clang::Decl*) 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/clang/lib/AST/DeclBase.cpp:1759:3
#<!-- -->11 0x000059b28495c0f5 clang::DeclContext::addDecl(clang::Decl*) 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/clang/lib/AST/DeclBase.cpp:1785:37
#<!-- -->12 0x000059b28773cc2a 
clang::Sema::ActOnStartTopLevelStmtDecl(clang::Scope*) 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/clang/lib/Sema/SemaDecl.cpp:20302:18
#<!-- -->13 0x000059b286f1efdf clang::Parser::ParseTopLevelStmtDecl() 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/clang/lib/Parse/ParseDecl.cpp:6024:62
#<!-- -->14 0x000059b286ef18ee 
clang::Parser::ParseExternalDeclaration(clang::ParsedAttributes&amp;, 
clang::ParsedAttributes&amp;, clang::ParsingDeclSpec*) 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/clang/lib/Parse/Parser.cpp:1065:35
#<!-- -->15 0x000059b286ef0702 
clang::Parser::ParseTopLevelDecl(clang::OpaquePtr&lt;clang::DeclGroupRef&gt;&amp;,
 clang::Sema::ModuleImportState&amp;) 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/clang/lib/Parse/Parser.cpp:758:36
#<!-- -->16 0x000059b28562dff2 
clang::IncrementalParser::ParseOrWrapTopLevelDecl() 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/clang/lib/Interpreter/IncrementalParser.cpp:66:36
#<!-- -->17 0x000059b28562e5b7 clang::IncrementalParser::Parse(llvm::StringRef) 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/clang/lib/Interpreter/IncrementalParser.cpp:132:8
#<!-- -->18 0x000059b28561832b clang::Interpreter::Parse(llvm::StringRef) 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/clang/lib/Interpreter/Interpreter.cpp:570:8
#<!-- -->19 0x000059b285618cbd 
clang::Interpreter::ParseAndExecute(llvm::StringRef, clang::Value*) 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/clang/lib/Interpreter/Interpreter.cpp:649:8
#<!-- -->20 0x000059b2836f9343 main 
/home/vipul-cariappa/Documents/Workspace/cpp-py/llvms/llvm-project-a/clang/tools/clang-repl/ClangRepl.cpp:255:59
#<!-- -->21 0x000077cdf443388e (/usr/lib/libc.so.6+0x2788e)
#<!-- -->22 0x000077cdf443394a __libc_start_main (/usr/lib/libc.so.6+0x2794a)
#<!-- -->23 0x000059b2836f7965 _start (./bin/clang-repl+0x73b8965)
fish: Job 1, './bin/clang-repl' terminated by signal SIGABRT (Abort)
```

With this change:
```c++
clang-repl&gt; try { throw 1; } catch { 0; }
In file included from &lt;&lt;&lt; inputs &gt;&gt;&gt;:1:
input_line_1:1:23: error: expected '('
    1 | try { throw 1; } catch { 0; }
      |                       ^
      |                       (
error: Parsing failed.
clang-repl&gt; 1;
clang-repl&gt; %quit
```

---
Full diff: https://github.com/llvm/llvm-project/pull/127087.diff


2 Files Affected:

- (modified) clang/lib/Parse/ParseDecl.cpp (+1-1) 
- (modified) clang/unittests/Interpreter/InterpreterTest.cpp (+7) 


``````````diff
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index 75b5e11f8327c..7ae136af47391 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -6024,7 +6024,7 @@ Parser::DeclGroupPtrTy Parser::ParseTopLevelStmtDecl() {
   TopLevelStmtDecl *TLSD = Actions.ActOnStartTopLevelStmtDecl(getCurScope());
   StmtResult R = ParseStatementOrDeclaration(Stmts, SubStmtCtx);
   if (!R.isUsable())
-    return nullptr;
+    R = Actions.ActOnNullStmt(Tok.getLocation());
 
   Actions.ActOnFinishTopLevelStmtDecl(TLSD, R.get());
 
diff --git a/clang/unittests/Interpreter/InterpreterTest.cpp 
b/clang/unittests/Interpreter/InterpreterTest.cpp
index 30b051e747f92..578f1d4c0eac6 100644
--- a/clang/unittests/Interpreter/InterpreterTest.cpp
+++ b/clang/unittests/Interpreter/InterpreterTest.cpp
@@ -107,6 +107,13 @@ TEST_F(InterpreterTest, Errors) {
 
   auto RecoverErr = Interp->Parse("int var1 = 42;");
   EXPECT_TRUE(!!RecoverErr);
+
+  Err = Interp->Parse("try { throw 1; } catch { 0; }").takeError();
+  EXPECT_THAT(DiagnosticOutput, HasSubstr("error: expected '('"));
+  EXPECT_EQ("Parsing failed.", llvm::toString(std::move(Err)));
+
+  RecoverErr = Interp->Parse("var1 = 424;");
+  EXPECT_TRUE(!!RecoverErr);
 }
 
 // Here we test whether the user can mix declarations and statements. The

``````````

</details>


https://github.com/llvm/llvm-project/pull/127087
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to