|
34 | 34 | #include "clang/Sema/SemaInternal.h"
|
35 | 35 | #include "clang/Sema/Template.h"
|
36 | 36 | #include "llvm/ADT/APInt.h"
|
| 37 | +#include "llvm/ADT/ArrayRef.h" |
37 | 38 | #include "llvm/ADT/FoldingSet.h"
|
38 | 39 | #include "llvm/ADT/PointerIntPair.h"
|
39 | 40 | #include "llvm/ADT/SmallString.h"
|
@@ -11003,16 +11004,29 @@ QualType Sema::DeduceTemplateSpecializationFromInitializer(
|
11003 | 11004 | dyn_cast_or_null<ClassTemplateDecl>(TemplateName.getAsTemplateDecl());
|
11004 | 11005 |
|
11005 | 11006 | TypeAliasTemplateDecl* AliasTemplate = nullptr;
|
| 11007 | + llvm::ArrayRef<TemplateArgument> AliasRhsTemplateArgs; |
11006 | 11008 | if (!Template) {
|
11007 |
| - if ((AliasTemplate = dyn_cast_or_null<TypeAliasTemplateDecl>( |
11008 |
| - TemplateName.getAsTemplateDecl()))) { |
| 11009 | + if (AliasTemplate = dyn_cast_or_null<TypeAliasTemplateDecl>( |
| 11010 | + TemplateName.getAsTemplateDecl()); AliasTemplate) { |
| 11011 | + llvm::errs() << "alias template decl\n"; |
11009 | 11012 | auto UnderlyingType = AliasTemplate->getTemplatedDecl()
|
11010 | 11013 | ->getUnderlyingType()
|
11011 | 11014 | .getDesugaredType(Context);
|
11012 | 11015 | if (const auto *TST =
|
11013 | 11016 | UnderlyingType->getAs<TemplateSpecializationType>()) {
|
| 11017 | + // normal cases: using AliasFoo = Foo<T, U>; |
11014 | 11018 | Template = dyn_cast_or_null<ClassTemplateDecl>(
|
11015 | 11019 | TST->getTemplateName().getAsTemplateDecl());
|
| 11020 | + AliasRhsTemplateArgs = TST->template_arguments(); |
| 11021 | + } else if (const auto *RT = UnderlyingType->getAs<RecordType>()) { |
| 11022 | + // cases where template arguments in the RHS of the alias are not |
| 11023 | + // dependent. e.g. |
| 11024 | + // using AliasFoo = Foo<bool>; |
| 11025 | + if (const auto *CTSD = llvm::dyn_cast<ClassTemplateSpecializationDecl>( |
| 11026 | + RT->getAsCXXRecordDecl())) { |
| 11027 | + Template = CTSD->getSpecializedTemplate(); |
| 11028 | + AliasRhsTemplateArgs = CTSD->getTemplateArgs().asArray(); |
| 11029 | + } |
11016 | 11030 | }
|
11017 | 11031 | }
|
11018 | 11032 | }
|
@@ -11098,15 +11112,10 @@ QualType Sema::DeduceTemplateSpecializationFromInitializer(
|
11098 | 11112 | //
|
11099 | 11113 | // The RHS of alias is f<int, U>, we deduced the template arguments of
|
11100 | 11114 | // the return type of the deduction guide from it: Y->int, X -> U
|
11101 |
| - const auto* AliasRhsTST = AliasTemplate->getTemplatedDecl() |
11102 |
| - ->getUnderlyingType() |
11103 |
| - .getDesugaredType(this->Context) |
11104 |
| - ->getAs<TemplateSpecializationType>(); |
11105 |
| - assert(AliasRhsTST); |
11106 |
| - |
11107 | 11115 | if (DeduceTemplateArguments(AliasTemplate->getTemplateParameters(),
|
11108 | 11116 | ReturnTST->template_arguments(),
|
11109 |
| - AliasRhsTST->template_arguments(), |
| 11117 | + //AliasRhsTST->template_arguments(), |
| 11118 | + AliasRhsTemplateArgs, |
11110 | 11119 | TDeduceInfo, DeduceResults,
|
11111 | 11120 | /*NumberOfArgumentsMustMatch*/ false)) {
|
11112 | 11121 | // FIXME: not all template arguments are deduced, we should continue
|
|
0 commit comments