https://github.com/shashforge updated 
https://github.com/llvm/llvm-project/pull/175497

>From 662dd0e3237d8be74b5abab25d5e02e635382e94 Mon Sep 17 00:00:00 2001
From: Shashi Shankar <[email protected]>
Date: Mon, 12 Jan 2026 08:39:29 +0100
Subject: [PATCH] [clang][CodeGen] Avoid emitting dependent record-local
 definitions

Clang could enqueue record-local member definitions from dependent
contexts for deferred emission. During code generation this could
lead to crashes when codegen encounters placeholder or dependent
types.

Skip adding record-local definitions whose lexical record context
is still dependent.

Fixes #175423.
---
 clang/lib/CodeGen/CodeGenFunction.cpp |  1 +
 clang/lib/CodeGen/CodeGenModule.cpp   | 18 +++++++++++++-----
 clang/test/CodeGenCXX/bug175423.cpp   | 21 +++++++++++++++++++++
 3 files changed, 35 insertions(+), 5 deletions(-)
 create mode 100644 clang/test/CodeGenCXX/bug175423.cpp

diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp 
b/clang/lib/CodeGen/CodeGenFunction.cpp
index 6c0589be32913..b9fe749791db1 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -1775,6 +1775,7 @@ bool CodeGenFunction::ConstantFoldsToSimpleInteger(const 
Expr *Cond,
                                                    bool AllowLabels) {
   // FIXME: Rename and handle conversion of other evaluatable things
   // to bool.
+
   Expr::EvalResult Result;
   if (!Cond->EvaluateAsInt(Result, getContext()))
     return false;  // Not foldable, not integer or not fully evaluatable.
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp 
b/clang/lib/CodeGen/CodeGenModule.cpp
index 85ed38f144627..34dccf25a9c92 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -5222,11 +5222,19 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
       // Look for a declaration that's lexically in a record.
       for (const auto *FD = cast<FunctionDecl>(D)->getMostRecentDecl(); FD;
            FD = FD->getPreviousDecl()) {
-        if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) {
-          if (FD->doesThisDeclarationHaveABody()) {
-            addDeferredDeclToEmit(GD.getWithDecl(FD));
-            break;
-          }
+        const auto *LexicalRD =
+            dyn_cast<CXXRecordDecl>(FD->getLexicalDeclContext());
+        if (!LexicalRD)
+          continue;
+
+        // Do not attempt to emit template patterns. These are still in a
+        // dependent context and cannot be code generated until instantiated.
+        if (LexicalRD->isDependentContext())
+          continue;
+
+        if (FD->doesThisDeclarationHaveABody()) {
+          addDeferredDeclToEmit(GD.getWithDecl(FD));
+          break;
         }
       }
     }
diff --git a/clang/test/CodeGenCXX/bug175423.cpp 
b/clang/test/CodeGenCXX/bug175423.cpp
new file mode 100644
index 0000000000000..7f3fbf24371a3
--- /dev/null
+++ b/clang/test/CodeGenCXX/bug175423.cpp
@@ -0,0 +1,21 @@
+// RUN: %clang_cc1 -std=c++20 -emit-llvm -o - %s -w | FileCheck %s
+// CHECK: define{{.*}} i32 @main
+
+template <typename, typename>
+inline constexpr bool is_same_v = false;
+
+template <typename T>
+inline constexpr bool is_same_v<T, T> = true;
+
+template <int &T> void FuncTemplate() { T; }
+
+template <typename T> struct Container {
+  static void Execute() {
+    if (is_same_v<T, int>)
+      ;
+    static int InternalVar;
+    FuncTemplate<InternalVar>;
+  }
+};
+
+int main() { Container<char>::Execute; }

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to