Skip to content

Commit 8279993

Browse files
committed
add tests to verify handling of invalid alias resolution
1 parent b3abcbb commit 8279993

File tree

2 files changed

+28
-19
lines changed

2 files changed

+28
-19
lines changed

clang/lib/Sema/SemaDeclCXX.cpp

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11454,25 +11454,26 @@ bool Sema::CheckDeductionGuideDeclarator(Declarator &D, QualType &R,
1145411454
const TemplateSpecializationType *TST = RetTST.getTypePtr();
1145511455
while (TST && TST->isTypeAlias())
1145611456
TST = TST->getAliasedType()->getAs<TemplateSpecializationType>();
11457-
assert(TST && "failed to resolve type alias");
11458-
11459-
TemplateName SpecifiedName = TST->getTemplateName();
11460-
bool TemplateMatches = Context.hasSameTemplateName(
11461-
SpecifiedName, GuidedTemplate, /*IgnoreDeduced=*/true);
11462-
11463-
const QualifiedTemplateName *Qualifiers =
11464-
SpecifiedName.getAsQualifiedTemplateName();
11465-
assert(Qualifiers && "expected QualifiedTemplate");
11466-
bool SimplyWritten = !Qualifiers->hasTemplateKeyword() &&
11467-
Qualifiers->getQualifier() == nullptr;
11468-
if (SimplyWritten && TemplateMatches)
11469-
AcceptableReturnType = true;
11470-
else {
11471-
// This could still instantiate to the right type, unless we know it
11472-
// names the wrong class template.
11473-
auto *TD = SpecifiedName.getAsTemplateDecl();
11474-
MightInstantiateToSpecialization = !(TD && isa<ClassTemplateDecl>(TD) &&
11475-
!TemplateMatches);
11457+
11458+
if (TST) {
11459+
TemplateName SpecifiedName = TST->getTemplateName();
11460+
bool TemplateMatches = Context.hasSameTemplateName(
11461+
SpecifiedName, GuidedTemplate, /*IgnoreDeduced=*/true);
11462+
11463+
const QualifiedTemplateName *Qualifiers =
11464+
SpecifiedName.getAsQualifiedTemplateName();
11465+
assert(Qualifiers && "expected QualifiedTemplate");
11466+
bool SimplyWritten = !Qualifiers->hasTemplateKeyword() &&
11467+
Qualifiers->getQualifier() == nullptr;
11468+
if (SimplyWritten && TemplateMatches)
11469+
AcceptableReturnType = true;
11470+
else {
11471+
// This could still instantiate to the right type, unless we know it
11472+
// names the wrong class template.
11473+
auto *TD = SpecifiedName.getAsTemplateDecl();
11474+
MightInstantiateToSpecialization =
11475+
!(TD && isa<ClassTemplateDecl>(TD) && !TemplateMatches);
11476+
}
1147611477
}
1147711478
} else if (!RetTy.hasQualifiers() && RetTy->isDependentType()) {
1147811479
MightInstantiateToSpecialization = true;

clang/test/CXX/temp/temp.deduct.guide/p3.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,11 @@ namespace WrongScope {
7171
Local(int) -> Local<int>; // expected-error {{expected}}
7272
}
7373
}
74+
75+
namespace GH54909 {
76+
template <class T> struct A {};
77+
struct B {};
78+
79+
template <typename T> using C = B;
80+
template <typename T> A() -> C<T>; // expected-error {{deduced type 'C<T>' (aka 'GH54909::B') of deduction guide is not a specialization of template 'A'}}
81+
}

0 commit comments

Comments
 (0)