[llvm-branch-commits] [clang] 19c571a - [Clang] Instantiate Typedefs referenced by type alias deduction guides (#111804)
Tobias Hieta via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Oct 29 01:53:21 PDT 2024
Author: Younan Zhang
Date: 2024-10-29T09:52:13+01:00
New Revision: 19c571a631d962f05264c539f035f5e7fc5c166b
URL: https://github.com/llvm/llvm-project/commit/19c571a631d962f05264c539f035f5e7fc5c166b
DIFF: https://github.com/llvm/llvm-project/commit/19c571a631d962f05264c539f035f5e7fc5c166b.diff
LOG: [Clang] Instantiate Typedefs referenced by type alias deduction guides (#111804)
TypedefNameDecl referenced by a synthesized CTAD guide for type aliases
was not transformed previously, resulting in a substitution failure in
BuildDeductionGuideForTypeAlias() when substituting into the
right-hand-side deduction guide.
This patch fixes it in the way we have been doing since
https://reviews.llvm.org/D80743. We transform all the function
parameters, parenting referenced TypedefNameDecls with the
CXXDeductionGuideDecl. Then we instantiate these declarations in
FindInstantiatedDecl() as we build up the eventual deduction guide,
using the mechanism introduced in D80743
Fixes #111508
(cherry picked from commit 0bc02b999a9686ba240b7a68d3f1cbbf037d2170)
Added:
Modified:
clang/lib/Sema/SemaTemplateDeductionGuide.cpp
clang/test/SemaCXX/cxx20-ctad-type-alias.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
index 0602d07c6b9b0d..1bf82b31def977 100644
--- a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
+++ b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
@@ -69,8 +69,8 @@ class ExtractTypeForDeductionGuide
ExtractTypeForDeductionGuide(
Sema &SemaRef,
llvm::SmallVectorImpl<TypedefNameDecl *> &MaterializedTypedefs,
- ClassTemplateDecl *NestedPattern,
- const MultiLevelTemplateArgumentList *OuterInstantiationArgs)
+ ClassTemplateDecl *NestedPattern = nullptr,
+ const MultiLevelTemplateArgumentList *OuterInstantiationArgs = nullptr)
: Base(SemaRef), MaterializedTypedefs(MaterializedTypedefs),
NestedPattern(NestedPattern),
OuterInstantiationArgs(OuterInstantiationArgs) {
@@ -1263,10 +1263,25 @@ FunctionTemplateDecl *DeclareAggregateDeductionGuideForTypeAlias(
getRHSTemplateDeclAndArgs(SemaRef, AliasTemplate).first;
if (!RHSTemplate)
return nullptr;
+
+ llvm::SmallVector<TypedefNameDecl *> TypedefDecls;
+ llvm::SmallVector<QualType> NewParamTypes;
+ ExtractTypeForDeductionGuide TypeAliasTransformer(SemaRef, TypedefDecls);
+ for (QualType P : ParamTypes) {
+ QualType Type = TypeAliasTransformer.TransformType(P);
+ if (Type.isNull())
+ return nullptr;
+ NewParamTypes.push_back(Type);
+ }
+
auto *RHSDeductionGuide = SemaRef.DeclareAggregateDeductionGuideFromInitList(
- RHSTemplate, ParamTypes, Loc);
+ RHSTemplate, NewParamTypes, Loc);
if (!RHSDeductionGuide)
return nullptr;
+
+ for (TypedefNameDecl *TD : TypedefDecls)
+ TD->setDeclContext(RHSDeductionGuide->getTemplatedDecl());
+
return BuildDeductionGuideForTypeAlias(SemaRef, AliasTemplate,
RHSDeductionGuide, Loc);
}
diff --git a/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp b/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp
index 5392573fcdb9d5..675c32a81f1ae8 100644
--- a/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp
+++ b/clang/test/SemaCXX/cxx20-ctad-type-alias.cpp
@@ -481,3 +481,16 @@ struct Out {
Out<float>::B out(100); // deduced to Out<float>::A<float>;
static_assert(__is_same(decltype(out), Out<float>::A<float>));
}
+
+namespace GH111508 {
+
+template <typename V> struct S {
+ using T = V;
+ T Data;
+};
+
+template <typename V> using Alias = S<V>;
+
+Alias A(42);
+
+} // namespace GH111508
More information about the llvm-branch-commits
mailing list