[clang] [clang]Fix name lookup crash (PR #190484)
via cfe-commits
cfe-commits at lists.llvm.org
Mon May 25 05:48:43 PDT 2026
https://github.com/Serosh-commits updated https://github.com/llvm/llvm-project/pull/190484
>From b718513c1c1617f2b0f3fd941fc4cba68083cb8c Mon Sep 17 00:00:00 2001
From: Serosh-commits <janmejayapanda400 at gmail.com>
Date: Sat, 25 Apr 2026 18:36:59 +0530
Subject: [PATCH 1/3] [Clang] Fix a name lookup crash when parsing invalid
template parameters (#GH189344)
---
clang/docs/ReleaseNotes.rst | 2 ++
clang/lib/Sema/SemaLookup.cpp | 5 +----
clang/test/SemaCXX/gh189344.cpp | 12 ++++++++++++
3 files changed, 15 insertions(+), 4 deletions(-)
create mode 100644 clang/test/SemaCXX/gh189344.cpp
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index f8508ebefb199..752e37765a484 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -520,6 +520,8 @@ Bug Fixes to Attribute Support
Bug Fixes to C++ Support
^^^^^^^^^^^^^^^^^^^^^^^^
+
+- Fixed a name lookup crash when parsing invalid template parameters. (#GH189344)
- Fixed a crash when a function template is defined as a non-template friend with a global scope qualifier. (#GH185341)
- Clang now rejects constant template parameters with block pointer types, since these are not implemented anyway and would lead to crashes. (#GH189247)
- Fixed a crash on error recovery when dealing with invalid templates. (#GH183075)
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp
index b96065f8619d2..9ce64ed85540b 100644
--- a/clang/lib/Sema/SemaLookup.cpp
+++ b/clang/lib/Sema/SemaLookup.cpp
@@ -1528,10 +1528,7 @@ bool Sema::CppLookupName(LookupResult &R, Scope *S) {
// If we have a context, and it's not a context stashed in the
// template parameter scope for an out-of-line definition, also
// look into that context.
- if (!(Found && S->isTemplateParamScope())) {
- assert(Ctx->isFileContext() &&
- "We should have been looking only at file context here already.");
-
+ if (Ctx->isFileContext() && !(Found && S->isTemplateParamScope())) {
// Look into context considering using-directives.
if (CppNamespaceLookup(*this, R, Context, Ctx, UDirs))
Found = true;
diff --git a/clang/test/SemaCXX/gh189344.cpp b/clang/test/SemaCXX/gh189344.cpp
new file mode 100644
index 0000000000000..f656c1173c2ac
--- /dev/null
+++ b/clang/test/SemaCXX/gh189344.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s
+
+template <union { } alignas ( union a { c ) ( a :: ) ( :: (b
+// expected-error at -1 {{cannot be defined in a type specifier}}
+// expected-error at -2 {{'a' cannot be defined in a type specifier}}
+// expected-error at -3 {{unknown type name 'b'}}
+// expected-error at -4 2{{parameter declarator cannot be qualified}}
+// expected-error at -5 {{a type specifier is required for all declarations}}
+// expected-note at -6 2{{to match this '('}}
+// expected-error@* 3{{expected unqualified-id}}
+// expected-error@* 2{{expected ')'}}
+// expected-error@* {{expected ',' or '>' in template-parameter-list}}
>From 5e70ddf052e37fcc2fa4755e06270fd2c73d760c Mon Sep 17 00:00:00 2001
From: Serosh-commits <janmejayapanda400 at gmail.com>
Date: Mon, 25 May 2026 16:34:00 +0530
Subject: [PATCH 2/3] address feedback
---
clang/lib/Sema/SemaDecl.cpp | 5 ++++-
clang/lib/Sema/SemaLookup.cpp | 5 ++++-
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 36538e18f297c..2f9f03d2c34b0 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -1489,6 +1489,7 @@ void Sema::EnterTemplatedContext(Scope *S, DeclContext *DC) {
unsigned ScopeDepth = getTemplateDepth(S);
for (; S && S->isTemplateParamScope(); S = S->getParent(), --ScopeDepth) {
DeclContext *SearchDCAfterScope = DC;
+ bool SetLookupEntity = false;
for (; DC; DC = DC->getLookupParent()) {
if (const TemplateParameterList *TPL =
cast<Decl>(DC)->getDescribedTemplateParams()) {
@@ -1497,10 +1498,12 @@ void Sema::EnterTemplatedContext(Scope *S, DeclContext *DC) {
continue;
if (ScopeDepth == DCDepth)
SearchDCAfterScope = DC = DC->getLookupParent();
+ SetLookupEntity = true;
break;
}
}
- S->setLookupEntity(SearchDCAfterScope);
+ if (SetLookupEntity)
+ S->setLookupEntity(SearchDCAfterScope);
}
}
diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp
index 9ce64ed85540b..b96065f8619d2 100644
--- a/clang/lib/Sema/SemaLookup.cpp
+++ b/clang/lib/Sema/SemaLookup.cpp
@@ -1528,7 +1528,10 @@ bool Sema::CppLookupName(LookupResult &R, Scope *S) {
// If we have a context, and it's not a context stashed in the
// template parameter scope for an out-of-line definition, also
// look into that context.
- if (Ctx->isFileContext() && !(Found && S->isTemplateParamScope())) {
+ if (!(Found && S->isTemplateParamScope())) {
+ assert(Ctx->isFileContext() &&
+ "We should have been looking only at file context here already.");
+
// Look into context considering using-directives.
if (CppNamespaceLookup(*this, R, Context, Ctx, UDirs))
Found = true;
>From 83d2d3095703304570ca6abe7690d913eabaae39 Mon Sep 17 00:00:00 2001
From: Serosh-commits <janmejayapanda400 at gmail.com>
Date: Mon, 25 May 2026 18:12:25 +0530
Subject: [PATCH 3/3] fix the mecha properly to prevent the bad union stash
---
clang/lib/Sema/SemaDecl.cpp | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
index 2f9f03d2c34b0..410ba470b3834 100644
--- a/clang/lib/Sema/SemaDecl.cpp
+++ b/clang/lib/Sema/SemaDecl.cpp
@@ -1489,7 +1489,7 @@ void Sema::EnterTemplatedContext(Scope *S, DeclContext *DC) {
unsigned ScopeDepth = getTemplateDepth(S);
for (; S && S->isTemplateParamScope(); S = S->getParent(), --ScopeDepth) {
DeclContext *SearchDCAfterScope = DC;
- bool SetLookupEntity = false;
+ bool FoundTemplateContext = false;
for (; DC; DC = DC->getLookupParent()) {
if (const TemplateParameterList *TPL =
cast<Decl>(DC)->getDescribedTemplateParams()) {
@@ -1498,12 +1498,19 @@ void Sema::EnterTemplatedContext(Scope *S, DeclContext *DC) {
continue;
if (ScopeDepth == DCDepth)
SearchDCAfterScope = DC = DC->getLookupParent();
- SetLookupEntity = true;
+ FoundTemplateContext = true;
break;
}
}
- if (SetLookupEntity)
- S->setLookupEntity(SearchDCAfterScope);
+ if (!SearchDCAfterScope)
+ continue;
+
+ if (!FoundTemplateContext && !SearchDCAfterScope->isFileContext()) {
+ if (const auto *RD = dyn_cast<RecordDecl>(SearchDCAfterScope))
+ if (RD->isUnion() && !RD->isTemplateDecl())
+ continue;
+ }
+ S->setLookupEntity(SearchDCAfterScope);
}
}
More information about the cfe-commits
mailing list