[clang] [clang-repl] fix segfault in CleanUpPTU() (PR #75629)

via cfe-commits cfe-commits at lists.llvm.org
Fri Dec 15 09:09:45 PST 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Pavel Kalugin (p4vook)

<details>
<summary>Changes</summary>

Check if the last translation unit or its first declaration are actually empty and do not nead cleanup.

Previously this caused segmentation fault on empty PTUs.

Add a regression test.

Fixes: #<!-- -->72980

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


2 Files Affected:

- (modified) clang/lib/Interpreter/IncrementalParser.cpp (+8) 
- (added) clang/test/Interpreter/anonymous-scope-fail.cpp (+10) 


``````````diff
diff --git a/clang/lib/Interpreter/IncrementalParser.cpp b/clang/lib/Interpreter/IncrementalParser.cpp
index 370bcbfee8b014..f894af881134bb 100644
--- a/clang/lib/Interpreter/IncrementalParser.cpp
+++ b/clang/lib/Interpreter/IncrementalParser.cpp
@@ -373,7 +373,15 @@ std::unique_ptr<llvm::Module> IncrementalParser::GenModule() {
 
 void IncrementalParser::CleanUpPTU(PartialTranslationUnit &PTU) {
   TranslationUnitDecl *MostRecentTU = PTU.TUPart;
+  if (!MostRecentTU) {
+    return;
+  }
+
   TranslationUnitDecl *FirstTU = MostRecentTU->getFirstDecl();
+  if (!FirstTU) {
+    return;
+  }
+
   if (StoredDeclsMap *Map = FirstTU->getPrimaryContext()->getLookupPtr()) {
     for (auto I = Map->begin(); I != Map->end(); ++I) {
       StoredDeclsList &List = I->second;
diff --git a/clang/test/Interpreter/anonymous-scope-fail.cpp b/clang/test/Interpreter/anonymous-scope-fail.cpp
new file mode 100644
index 00000000000000..c32b42d2859d97
--- /dev/null
+++ b/clang/test/Interpreter/anonymous-scope-fail.cpp
@@ -0,0 +1,10 @@
+// RUN: clang-repl "int x = 10;" "{ int t; a::b(t); }" "int y = 10;"
+// REQUIRES: host-supports-jit
+// UNSUPPORTED: system-aix
+// RUN: cat %s | not clang-repl | FileCheck %s
+{ int t; a::b(t); }
+extern "C" int printf(const char *, ...);
+int i = 42;
+auto r1 = printf("i = %d\n", i);
+// CHECK: i = 42
+%quit

``````````

</details>


https://github.com/llvm/llvm-project/pull/75629


More information about the cfe-commits mailing list