Skip to content

Commit da2b415

Browse files
committed
[clang] Add tracking source deduction guide for the explicitly-written
deduction guide. We miss this case in the original f94c481 commit.
1 parent 070e129 commit da2b415

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

clang/lib/Sema/SemaTemplateDeductionGuide.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1227,11 +1227,14 @@ void DeclareImplicitDeductionGuidesForTypeAlias(
12271227
NewParam->setScopeInfo(0, I);
12281228
FPTL.setParam(I, NewParam);
12291229
}
1230-
auto *Transformed = cast<FunctionDecl>(buildDeductionGuide(
1230+
auto *Transformed = cast<CXXDeductionGuideDecl>(buildDeductionGuide(
12311231
SemaRef, AliasTemplate, /*TemplateParams=*/nullptr,
12321232
/*Constructor=*/nullptr, DG->getExplicitSpecifier(), FunctionType,
12331233
AliasTemplate->getBeginLoc(), AliasTemplate->getLocation(),
12341234
AliasTemplate->getEndLoc(), DG->isImplicit()));
1235+
Transformed->setSourceDeductionGuide(DG);
1236+
Transformed->setSourceDeductionGuideKind(
1237+
CXXDeductionGuideDecl::SourceDeductionGuideKind::Alias);
12351238

12361239
// FIXME: Here the synthesized deduction guide is not a templated
12371240
// function. Per [dcl.decl]p4, the requires-clause shall be present only

clang/unittests/AST/ASTImporterTest.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8193,6 +8193,29 @@ TEST_P(ImportFunctions, CTADAliasTemplate) {
81938193
EXPECT_TRUE(ToD->getSourceDeductionGuide());
81948194
}
81958195

8196+
TEST_P(ImportFunctions, CTADAliasTemplateWithExplicitSourceDeductionGuide) {
8197+
Decl *TU = getTuDecl(
8198+
R"(
8199+
template <typename T> struct A {
8200+
A(T);
8201+
};
8202+
template<typename T>
8203+
using B = A<T>;
8204+
A(int) -> A<double>; // explicit
8205+
B b{(int)0};
8206+
)",
8207+
Lang_CXX20, "input.cc");
8208+
auto *FromD = FirstDeclMatcher<CXXDeductionGuideDecl>().match(
8209+
TU, cxxDeductionGuideDecl(hasParameter(0, hasType(asString("int"))),
8210+
hasName("<deduction guide for B>"),
8211+
hasReturnTypeLoc(loc(asString("A<double>")))));
8212+
auto *ToD = Import(FromD, Lang_CXX20);
8213+
ASSERT_TRUE(ToD);
8214+
EXPECT_TRUE(ToD->getSourceDeductionGuideKind() ==
8215+
CXXDeductionGuideDecl::SourceDeductionGuideKind::Alias);
8216+
EXPECT_TRUE(ToD->getSourceDeductionGuide());
8217+
}
8218+
81968219
TEST_P(ImportFunctions, ParmVarDeclDeclContext) {
81978220
constexpr auto FromTUCode = R"(
81988221
void f(int P);

0 commit comments

Comments
 (0)