Author: Mahmoud Ahmed
Date: 2026-09-04T13:06:23+02:00
New Revision: 1886f7240ecb91bdd13d00969eac20537c0314c8

URL: 
https://github.com/llvm/llvm-project/commit/1886f7240ecb91bdd13d00969eac20537c0314c8
DIFF: 
https://github.com/llvm/llvm-project/commit/1886f7240ecb91bdd13d00969eac20537c0314c8.diff

LOG: [clang][Parse] Fix DeclContext reentry to use the template's lexical TU, 
not the current fragment's TU (#218571)

Problem:
when `-fdelayed-template-parsing` is enabled Instantiating a late-parsed
function template defined in an earlier TU caused an assertion failure
in `clang::Sema::PushDeclContext`:

``DC->getLexicalParent() == CurContext && "The next DeclContext should
be lexically contained in the current one."'`

Fix:
- 1 in `Parser::ParseLateTemplatedFuncDef` obtained the enclosing
`TranslationUnitDecl` called it `LexicalTU`
- 2 changed `GlobalSavedContext` with the `LexicalTU` instead of using
`Actions.Context.getTranslationUnitDecl()`
- in the case that no `LexicalTU` was found fellback to
`Actions.Context.getTranslationUnitDecl()`
 
Fixes #217073

Added: 
    clang/test/Interpreter/delayed-template-parsing-incremental.cpp

Modified: 
    clang/docs/ReleaseNotes.md
    clang/lib/Parse/ParseTemplate.cpp

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 042d7112dbe7d..ca5c63fbaa17d 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -611,6 +611,7 @@ features cannot lower the translation-unit ABI level;
   definition of a member of a class template added a default argument to a
   parameter that follows a parameter pack (e.g.
   `template <typename... T> S::S(T..., int = 10) {}`).  (#GH216211)
+- Fixed an assertion failure when instantiating a late-parsed function 
template defined in an earlier translation unit with 
-fdelayed-template-parsing. (#GH217073)
 
 - Allow redeclaration lookup to consider conversion function templates, 
allowing
   Clang to match an in-class specialization such as `template<> operator int()`

diff  --git a/clang/lib/Parse/ParseTemplate.cpp 
b/clang/lib/Parse/ParseTemplate.cpp
index a43f4cbcca874..1e5aa55338309 100644
--- a/clang/lib/Parse/ParseTemplate.cpp
+++ b/clang/lib/Parse/ParseTemplate.cpp
@@ -1454,17 +1454,25 @@ void 
Parser::ParseLateTemplatedFuncDef(LateParsedTemplate &LPT) {
   // Track template parameter depth.
   TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth);
 
-  // To restore the context after late parsing.
-  Sema::ContextRAII GlobalSavedContext(
-      Actions, Actions.Context.getTranslationUnitDecl());
-
   MultiParseScope Scopes(*this);
 
   // Get the list of DeclContexts to reenter.
   SmallVector<DeclContext*, 4> DeclContextsToReenter;
-  for (DeclContext *DC = FunD; DC && !DC->isTranslationUnit();
-       DC = DC->getLexicalParent())
+  DeclContext *LexicalTU = nullptr;
+  for (DeclContext *DC = FunD; DC; DC = DC->getLexicalParent()) {
+    if (DC->isTranslationUnit()) {
+      LexicalTU = DC;
+      break;
+    }
     DeclContextsToReenter.push_back(DC);
+  }
+
+  if (!LexicalTU) {
+    LexicalTU = Actions.Context.getTranslationUnitDecl();
+  }
+
+  // To restore the context after late parsing.
+  Sema::ContextRAII GlobalSavedContext(Actions, LexicalTU);
 
   // Reenter scopes from outermost to innermost.
   for (DeclContext *DC : reverse(DeclContextsToReenter)) {

diff  --git a/clang/test/Interpreter/delayed-template-parsing-incremental.cpp 
b/clang/test/Interpreter/delayed-template-parsing-incremental.cpp
new file mode 100644
index 0000000000000..897a62abad094
--- /dev/null
+++ b/clang/test/Interpreter/delayed-template-parsing-incremental.cpp
@@ -0,0 +1,7 @@
+// clang/test/Interpreter/delayed-template-parsing.cpp
+// REQUIRES: host-supports-jit
+// RUN: cat %s | clang-repl -Xcc -fdelayed-template-parsing 2>&1
+// see ISSUE 217073 and PR 218571
+
+namespace GH217073{ template <typename T> int f(T) { return 0; } }
+GH217073::f(1);


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

Reply via email to