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 <[email protected]> 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 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
