https://github.com/DeanSturtevant1 created 
https://github.com/llvm/llvm-project/pull/224711

In DeclBase.h, clang::FunctionDecl is only forward-declared. Commit 
c9074cfd0d95 defined getEnclosingFunction() and castEnclosingFunction() inline 
in DeclBase.h, which instantiates dyn_cast<FunctionDecl> and cast<FunctionDecl> 
on an incomplete type when DeclBase.h is compiled standalone (e.g. with 
-fmodules / header units).

Move the non-const definitions to DeclBase.cpp where FunctionDecl is complete, 
and delegate the const overloads via const_cast, matching 
getOuterLexicalRecordContext() and getEnclosingNonExpansionStatementContext().


>From a425d783256c39ac70fcfb3bc2315df6343491ad Mon Sep 17 00:00:00 2001
From: Dean Sturtevant <[email protected]>
Date: Fri, 18 Sep 2026 15:04:02 -0400
Subject: [PATCH] [Clang] Move
 DeclContext::getEnclosingFunction/castEnclosingFunction out of line

In DeclBase.h, clang::FunctionDecl is only forward-declared. Commit 
c9074cfd0d95 defined getEnclosingFunction() and castEnclosingFunction() inline 
in DeclBase.h, which instantiates dyn_cast<FunctionDecl> and cast<FunctionDecl> 
on an incomplete type when DeclBase.h is compiled standalone (e.g. with 
-fmodules / header units).

Move the non-const definitions to DeclBase.cpp where FunctionDecl is complete, 
and delegate the const overloads via const_cast, matching 
getOuterLexicalRecordContext() and getEnclosingNonExpansionStatementContext().
---
 clang/include/clang/AST/DeclBase.h | 14 ++++----------
 clang/lib/AST/DeclBase.cpp         |  8 ++++++++
 2 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/clang/include/clang/AST/DeclBase.h 
b/clang/include/clang/AST/DeclBase.h
index a067d87e92a84..8ea2533825dd9 100644
--- a/clang/include/clang/AST/DeclBase.h
+++ b/clang/include/clang/AST/DeclBase.h
@@ -2198,20 +2198,14 @@ class DeclContext {
   /// In particular, this will return nullptr if the *nearest* enclosing
   /// DeclContext that is not an expansion statement is something other
   /// than a function (e.g. a CXXRecordDecl, even if it is a local class).
-  FunctionDecl *getEnclosingFunction() {
-    return dyn_cast<FunctionDecl>(getEnclosingNonExpansionStatementContext());
-  }
-
+  FunctionDecl *getEnclosingFunction();
   const FunctionDecl *getEnclosingFunction() const {
-    return dyn_cast<FunctionDecl>(getEnclosingNonExpansionStatementContext());
-  }
-
-  FunctionDecl *castEnclosingFunction() {
-    return cast<FunctionDecl>(getEnclosingNonExpansionStatementContext());
+    return const_cast<DeclContext *>(this)->getEnclosingFunction();
   }
 
+  FunctionDecl *castEnclosingFunction();
   const FunctionDecl *castEnclosingFunction() const {
-    return cast<FunctionDecl>(getEnclosingNonExpansionStatementContext());
+    return const_cast<DeclContext *>(this)->castEnclosingFunction();
   }
 
   /// Test whether the context supports looking up names.
diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
index 70f61fa57a682..548643cea2cce 100644
--- a/clang/lib/AST/DeclBase.cpp
+++ b/clang/lib/AST/DeclBase.cpp
@@ -2096,6 +2096,14 @@ DeclContext 
*DeclContext::getEnclosingNonExpansionStatementContext() {
   return DC;
 }
 
+FunctionDecl *DeclContext::getEnclosingFunction() {
+  return dyn_cast<FunctionDecl>(getEnclosingNonExpansionStatementContext());
+}
+
+FunctionDecl *DeclContext::castEnclosingFunction() {
+  return cast<FunctionDecl>(getEnclosingNonExpansionStatementContext());
+}
+
 bool DeclContext::InEnclosingNamespaceSetOf(const DeclContext *O) const {
   // For non-file contexts, this is equivalent to Equals.
   if (!isFileContext())

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

Reply via email to