[clang] [Clang] Instantiate Typedefs referenced by type alias deduction guides (PR #111804)
Younan Zhang via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 10 01:42:36 PDT 2024
https://github.com/zyn0217 created https://github.com/llvm/llvm-project/pull/111804
Fixes #111508
>From 1319a3c3220df06f5436fd3f135e50c998940296 Mon Sep 17 00:00:00 2001
From: Younan Zhang <zyn7109 at gmail.com>
Date: Thu, 10 Oct 2024 16:40:10 +0800
Subject: [PATCH] [Clang] Instantiate Typedefs referenced by type alias
deduction guides
---
clang/lib/Sema/SemaTemplateDeductionGuide.cpp | 21 ++++++++++++++++---
clang/test/SemaCXX/cxx20-ctad-type-alias.cpp | 13 ++++++++++++
2 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
index ca93c840f03215..871c705ab65421 100644
--- a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
+++ b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
@@ -70,8 +70,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) {
@@ -1215,10 +1215,25 @@ FunctionTemplateDecl *DeclareAggregateDeductionGuideForTypeAlias(
getRHSTemplateDeclAndArgs(SemaRef, AliasTemplate).first;
if (!RHSTemplate)
return nullptr;
+
+ llvm::SmallVector<TypedefNameDecl *, 4> 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 cfe-commits
mailing list