@@ -5474,18 +5474,15 @@ TagType *ASTContext::getTagTypeInternal(ElaboratedTypeKeyword Keyword,
5474
5474
return T;
5475
5475
}
5476
5476
5477
- static bool getNonInjectedClassName(const TagDecl *& TD) {
5477
+ static const TagDecl * getNonInjectedClassName(const TagDecl *TD) {
5478
5478
if (const auto *RD = dyn_cast<CXXRecordDecl>(TD);
5479
- RD && RD->isInjectedClassName()) {
5480
- TD = cast<TagDecl>(RD->getDeclContext());
5481
- return true;
5482
- }
5483
- return false;
5479
+ RD && RD->isInjectedClassName())
5480
+ return cast<TagDecl>(RD->getDeclContext());
5481
+ return TD;
5484
5482
}
5485
5483
5486
5484
CanQualType ASTContext::getCanonicalTagType(const TagDecl *TD) const {
5487
- ::getNonInjectedClassName(TD);
5488
- TD = TD->getCanonicalDecl();
5485
+ TD = ::getNonInjectedClassName(TD)->getCanonicalDecl();
5489
5486
if (TD->TypeForDecl)
5490
5487
return TD->TypeForDecl->getCanonicalTypeUnqualified();
5491
5488
@@ -5501,40 +5498,42 @@ CanQualType ASTContext::getCanonicalTagType(const TagDecl *TD) const {
5501
5498
QualType ASTContext::getTagType(ElaboratedTypeKeyword Keyword,
5502
5499
NestedNameSpecifier Qualifier,
5503
5500
const TagDecl *TD, bool OwnsTag) const {
5501
+
5502
+ const TagDecl *NonInjectedTD = ::getNonInjectedClassName(TD);
5503
+ bool IsInjected = TD != NonInjectedTD;
5504
+
5504
5505
ElaboratedTypeKeyword PreferredKeyword =
5505
- getLangOpts().CPlusPlus
5506
- ? ElaboratedTypeKeyword::None
5507
- : KeywordHelpers::getKeywordForTagTypeKind(TD ->getTagKind());
5506
+ getLangOpts().CPlusPlus ? ElaboratedTypeKeyword::None
5507
+ : KeywordHelpers::getKeywordForTagTypeKind(
5508
+ NonInjectedTD ->getTagKind());
5508
5509
5509
5510
if (Keyword == PreferredKeyword && !Qualifier && !OwnsTag) {
5510
5511
if (const Type *T = TD->TypeForDecl; T && !T->isCanonicalUnqualified())
5511
5512
return QualType(T, 0);
5512
5513
5513
- bool IsInjected = ::getNonInjectedClassName(TD);
5514
- const Type *CanonicalType = getCanonicalTagType(TD).getTypePtr();
5514
+ const Type *CanonicalType = getCanonicalTagType(NonInjectedTD).getTypePtr();
5515
5515
const Type *T =
5516
5516
getTagTypeInternal(Keyword,
5517
- /*Qualifier=*/std::nullopt, TD ,
5517
+ /*Qualifier=*/std::nullopt, NonInjectedTD ,
5518
5518
/*OwnsTag=*/false, IsInjected, CanonicalType,
5519
5519
/*WithFoldingSetNode=*/false);
5520
5520
TD->TypeForDecl = T;
5521
5521
return QualType(T, 0);
5522
5522
}
5523
5523
5524
- bool IsInjected = ::getNonInjectedClassName(TD);
5525
-
5526
5524
llvm::FoldingSetNodeID ID;
5527
- TagTypeFoldingSetPlaceholder::Profile(ID, Keyword, Qualifier, TD, OwnsTag ,
5528
- IsInjected);
5525
+ TagTypeFoldingSetPlaceholder::Profile(ID, Keyword, Qualifier, NonInjectedTD ,
5526
+ OwnsTag, IsInjected);
5529
5527
5530
5528
void *InsertPos = nullptr;
5531
5529
if (TagTypeFoldingSetPlaceholder *T =
5532
5530
TagTypes.FindNodeOrInsertPos(ID, InsertPos))
5533
5531
return QualType(T->getTagType(), 0);
5534
5532
5535
- const Type *CanonicalType = getCanonicalTagType(TD).getTypePtr();
5536
- TagType *T = getTagTypeInternal(Keyword, Qualifier, TD, OwnsTag, IsInjected,
5537
- CanonicalType, /*WithFoldingSetNode=*/true);
5533
+ const Type *CanonicalType = getCanonicalTagType(NonInjectedTD).getTypePtr();
5534
+ TagType *T =
5535
+ getTagTypeInternal(Keyword, Qualifier, NonInjectedTD, OwnsTag, IsInjected,
5536
+ CanonicalType, /*WithFoldingSetNode=*/true);
5538
5537
TagTypes.InsertNode(TagTypeFoldingSetPlaceholder::fromTagType(T), InsertPos);
5539
5538
return QualType(T, 0);
5540
5539
}
@@ -10447,6 +10446,12 @@ TemplateName ASTContext::getQualifiedTemplateName(NestedNameSpecifier Qualifier,
10447
10446
assert(Template.getKind() == TemplateName::Template ||
10448
10447
Template.getKind() == TemplateName::UsingTemplate);
10449
10448
10449
+ if (Template.getAsTemplateDecl()->getKind() == Decl::TemplateTemplateParm) {
10450
+ assert(!Qualifier && "unexpected qualified template template parameter");
10451
+ assert(TemplateKeyword == false);
10452
+ return Template;
10453
+ }
10454
+
10450
10455
// FIXME: Canonicalization?
10451
10456
llvm::FoldingSetNodeID ID;
10452
10457
QualifiedTemplateName::Profile(ID, Qualifier, TemplateKeyword, Template);
0 commit comments