[clang] Attempt to fix issue number 91564 (PR #167157)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Nov 8 08:59:20 PST 2025
https://github.com/Red-RobinHood created https://github.com/llvm/llvm-project/pull/167157
None
>From 2bea7af6ca6d5036e39158665b9008c71d5c37ec Mon Sep 17 00:00:00 2001
From: Red-RobinHood <hood.robin.red at gmail.com>
Date: Sat, 8 Nov 2025 22:23:19 +0530
Subject: [PATCH] Attempt to fix issue number 91564
---
clang/include/clang/Parse/Parser.h | 2 ++
clang/lib/Parse/ParseDeclCXX.cpp | 21 ++++++++++++++++++++-
clang/lib/Sema/SemaType.cpp | 11 +++++++++++
3 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h
index dad8efd0f017f..b7b1b629f2d1e 100644
--- a/clang/include/clang/Parse/Parser.h
+++ b/clang/include/clang/Parse/Parser.h
@@ -3787,6 +3787,8 @@ class Parser : public CodeCompletionHandler {
/// true except when we are parsing an expression within a C++
/// template argument list, where the '>' closes the template
/// argument list.
+ SmallVector<TemplateParameterList *, 4> *TemplateParamsFromAlias = nullptr;
+
bool GreaterThanIsOperator;
// C++ type trait keywords that can be reverted to identifiers and still be
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index b96968d4592f5..8f30bc3c19409 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -889,6 +889,13 @@ Decl *Parser::ParseAliasDeclarationAfterDeclarator(
<< FixItHint::CreateRemoval(SourceRange(D.EllipsisLoc));
Decl *DeclFromDeclSpec = nullptr;
+
+ TemplateParameterLists *SavedTemplateParamsFromAlias =
+ TemplateParamsFromAlias;
+ TemplateParamsFromAlias = TemplateInfo.TemplateParams;
+ TemplateParameterLists *TemplateParams = TemplateInfo.TemplateParams;
+ TemplateParamsFromAlias = SavedTemplateParamsFromAlias;
+
TypeResult TypeAlias =
ParseTypeName(nullptr,
TemplateInfo.Kind != ParsedTemplateKind::NonTemplate ? DeclaratorContext::AliasTemplate
@@ -904,7 +911,7 @@ Decl *Parser::ParseAliasDeclarationAfterDeclarator(
: "alias declaration"))
SkipUntil(tok::semi);
- TemplateParameterLists *TemplateParams = TemplateInfo.TemplateParams;
+ TemplateParams = TemplateInfo.TemplateParams;
MultiTemplateParamsArg TemplateParamsArg(
TemplateParams ? TemplateParams->data() : nullptr,
TemplateParams ? TemplateParams->size() : 0);
@@ -1543,6 +1550,18 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind,
DeclSpecContext DSC,
ParsedAttributes &Attributes) {
DeclSpec::TST TagType;
+
+ if (TemplateParamsFromAlias) {
+ for (TemplateParameterList *TPL : *TemplateParamsFromAlias) {
+ for (NamedDecl *ND : *TPL) {
+ ND->setInvalidDecl(true);
+ if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(ND)) {
+ TTPD->setTypeForDecl(Actions.Context.IntTy.getTypePtr());
+ }
+ }
+ }
+ }
+
if (TagTokKind == tok::kw_struct)
TagType = DeclSpec::TST_struct;
else if (TagTokKind == tok::kw___interface)
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index eb8b1352d1be1..09c10b1d0cb5c 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -3417,6 +3417,17 @@ static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state,
}
}
+ if (auto *CRD = dyn_cast_or_null<CXXRecordDecl>(OwnedTagDecl)) {
+ if (auto *CTD = CRD->getDescribedClassTemplate()) {
+ for (const NamedDecl *ND : CTD->getTemplateParameters()->asArray()) {
+ if (ND->isInvalidDecl()) {
+ D.setInvalidType(true);
+ return T;
+ }
+ }
+ }
+ }
+
if (SemaRef.getLangOpts().CPlusPlus &&
OwnedTagDecl && OwnedTagDecl->isCompleteDefinition()) {
// Check the contexts where C++ forbids the declaration of a new class
More information about the cfe-commits
mailing list