https://github.com/a-tarasyuk created 
https://github.com/llvm/llvm-project/pull/181828

Fixes #181470

--- 

This patch addresses the regression caused by 
f3dcec0ee73fee6a33fcfb422e04297e4d466de6. The assertion occurs when 
nested-name-specifier error recovery tries to extend a nested name specifier 
with a result found via ordinary lookup fallback

https://github.com/llvm/llvm-project/blob/75aa83c0c035a7a10f0f48355c93858f003b8e4e/clang/lib/Sema/SemaCXXScopeSpec.cpp#L725-L728

which can hit `getTypeDeclType` qualifier assertions

https://github.com/llvm/llvm-project/blob/75aa83c0c035a7a10f0f48355c93858f003b8e4e/clang/lib/Sema/SemaCXXScopeSpec.cpp#L420

https://github.com/llvm/llvm-project/blob/4f92cf9599c4077c08b7fac0a21624e55da572f9/clang/lib/AST/ASTContext.cpp#L5162-L5176



>From 14eb8b1e26c23359862b2c9070de8896dd0f63bb Mon Sep 17 00:00:00 2001
From: Oleksandr Tarasiuk <[email protected]>
Date: Tue, 17 Feb 2026 16:04:57 +0200
Subject: [PATCH] [Clang] fix nested-name-specifier error recovery with
 ordinary lookup fallback results

---
 clang/docs/ReleaseNotes.rst             |  1 +
 clang/lib/Sema/SemaCXXScopeSpec.cpp     |  3 ++-
 clang/test/SemaCXX/nested-name-spec.cpp | 10 +++++++++-
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index c648e8b0ec6fa..aa2f7614a0f38 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -268,6 +268,7 @@ Bug Fixes in This Version
 - Clang now outputs relative paths of embeds for dependency output. (#GH161950)
 - Fixed an assertion failure when evaluating ``_Countof`` on invalid 
``void``-typed operands. (#GH180893)
 - Fixed a ``-Winvalid-noreturn`` false positive for unreachable ``try`` blocks 
following an unconditional ``throw``. (#GH174822)
+- Fixed an assertion failure caused by error recovery while extending a nested 
name specifier with results from ordinary lookup. (#GH181470)
 
 Bug Fixes to Compiler Builtins
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaCXXScopeSpec.cpp 
b/clang/lib/Sema/SemaCXXScopeSpec.cpp
index fdbd46c109243..a4a25a4f44602 100644
--- a/clang/lib/Sema/SemaCXXScopeSpec.cpp
+++ b/clang/lib/Sema/SemaCXXScopeSpec.cpp
@@ -792,7 +792,8 @@ bool Sema::BuildCXXNestedNameSpecifier(Scope *S, 
NestedNameSpecInfo &IdInfo,
           << IdInfo.Identifier << getLangOpts().CPlusPlus;
       return true;
     }
-    if (::ExtendNestedNameSpecifier(*this, SS, ND, IdInfo.IdentifierLoc,
+    if (Found.getLookupKind() == LookupNestedNameSpecifierName &&
+        ::ExtendNestedNameSpecifier(*this, SS, ND, IdInfo.IdentifierLoc,
                                     IdInfo.CCLoc)) {
       const Type *T = SS.getScopeRep().getAsType();
       Diag(IdInfo.IdentifierLoc, diag::err_expected_class_or_namespace)
diff --git a/clang/test/SemaCXX/nested-name-spec.cpp 
b/clang/test/SemaCXX/nested-name-spec.cpp
index c60275b709ddb..74012cebb2ae1 100644
--- a/clang/test/SemaCXX/nested-name-spec.cpp
+++ b/clang/test/SemaCXX/nested-name-spec.cpp
@@ -476,7 +476,8 @@ namespace A {
 class B {
   typedef C D; // expected-error{{unknown type name 'C'}}
   A::D::F;
-  // expected-error@-1{{'A::D' (aka 'int') is not a class, namespace, or 
enumeration}}
+  // expected-error@-1{{'D' is not a class, namespace, or enumeration}}
+  // expected-note@-3 {{'D' declared here}}
 };
 }
 }
@@ -516,3 +517,10 @@ struct S : V<> {
   V<> v; // no crash
 };
 }
+
+namespace GH181470 {
+namespace N {}
+bar;                           // expected-error {{a type specifier is 
required for all declarations}}
+template <class T> N::T::bar;  // expected-error {{'T' is not a class, 
namespace, or enumeration}} \
+                               // expected-note {{'T' declared here}}
+}

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

Reply via email to