diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index e671183522565..aa57b995a6433 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -390,6 +390,7 @@ Bug Fixes to C++ Support - Clang no longer crashes when trying to unify the types of arrays with certain differences in qualifiers (this could happen during template argument deduction or when building a ternary operator). (#GH97005) +- Fixed type alias CTAD issues involving default template arguments. (#GH134471) - The initialization kind of elements of structured bindings direct-list-initialized from an array is corrected to direct-initialization. - Clang no longer crashes when a coroutine is declared ``[[noreturn]]``. (#GH127327) diff --git a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp index b4863cefc3fb4..29c5736a9bf9e 100644 --- a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp +++ b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp @@ -690,6 +690,26 @@ SmallVector TemplateParamsReferencedInTemplateArgumentList( SemaRef.MarkUsedTemplateParameters( DeducedArgs, TemplateParamsList->getDepth(), ReferencedTemplateParams); + auto MarkDefaultArgs = [&](auto *Param) { + if (!Param->hasDefaultArgument()) + return; + SemaRef.MarkUsedTemplateParameters( + Param->getDefaultArgument().getArgument(), + TemplateParamsList->getDepth(), ReferencedTemplateParams); + }; + + for (unsigned Index = 0; Index < TemplateParamsList->size(); ++Index) { + if (!ReferencedTemplateParams[Index]) + continue; + auto *Param = TemplateParamsList->getParam(Index); + if (auto *TTPD = dyn_cast(Param)) + MarkDefaultArgs(TTPD); + else if (auto *NTTPD = dyn_cast(Param)) + MarkDefaultArgs(NTTPD); + else + MarkDefaultArgs(cast(Param)); + } + SmallVector Results; for (unsigned Index = 0; Index < TemplateParamsList->size(); ++Index) { if (ReferencedTemplateParams[Index]) diff --git a/clang/test/SemaTemplate/deduction-guide.cpp b/clang/test/SemaTemplate/deduction-guide.cpp index 6db132ca37c7e..066c917537947 100644 --- a/clang/test/SemaTemplate/deduction-guide.cpp +++ b/clang/test/SemaTemplate/deduction-guide.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -std=c++2a -verify -ast-dump -ast-dump-decl-types -ast-dump-filter "deduction guide" %s | FileCheck %s --strict-whitespace +// RUN: %clang_cc1 -std=c++2a -verify -ast-dump -ast-dump-decl-types -ast-dump-filter "deduction guide" %s | FileCheck %s --strict-whitespace -dump-input=always template struct X {}; template typename> struct Y {}; @@ -771,3 +771,118 @@ D d(24); // CHECK-NEXT: `-ParmVarDecl {{.+}} 'U' } // namespace GH132616_DeductionGuide + +namespace GH133132 { + +template +struct A {}; + +template +using AA = A; + +AA a{}; + +// CHECK-LABEL: Dumping GH133132::: +// CHECK-NEXT: FunctionTemplateDecl {{.+}} implicit +// CHECK-NEXT: |-TemplateTypeParmDecl {{.+}} class depth 0 index 0 T +// CHECK-NEXT: | `-TemplateArgument type 'int' +// CHECK-NEXT: | `-BuiltinType {{.+}} 'int' +// CHECK-NEXT: |-TemplateTypeParmDecl {{.+}} class depth 0 index 1 U +// CHECK-NEXT: | `-TemplateArgument type 'T':'type-parameter-0-0' +// CHECK-NEXT: | `-TemplateTypeParmType {{.+}} 'T' dependent depth 0 index 0 +// CHECK-NEXT: | `-TemplateTypeParm {{.+}} 'T' +// CHECK-NEXT: |-TypeTraitExpr {{.+}} 'bool' __is_deducible +// CHECK-NEXT: | |-DeducedTemplateSpecializationType {{.+}} 'GH133132::AA' dependent +// CHECK-NEXT: | | `-name: 'GH133132::AA' +// CHECK-NEXT: | | `-TypeAliasTemplateDecl {{.+}} AA +// CHECK-NEXT: | `-TemplateSpecializationType {{.+}} 'A' dependent +// CHECK-NEXT: | |-name: 'A':'GH133132::A' qualified +// CHECK-NEXT: | | `-ClassTemplateDecl {{.+}} A +// CHECK-NEXT: | `-TemplateArgument type 'U':'type-parameter-0-1' +// CHECK-NEXT: | `-SubstTemplateTypeParmType {{.+}} 'U' sugar dependent class depth 0 index 0 _Ty +// CHECK-NEXT: | |-FunctionTemplate {{.+}} '' +// CHECK-NEXT: | `-TemplateTypeParmType {{.+}} 'U' dependent depth 0 index 1 +// CHECK-NEXT: | `-TemplateTypeParm {{.+}} 'U' +// CHECK-NEXT: |-CXXDeductionGuideDecl {{.+}} implicit 'auto () -> A' +// CHECK-NEXT: `-CXXDeductionGuideDecl {{.+}} implicit used 'auto () -> A' implicit_instantiation +// CHECK-NEXT: |-TemplateArgument type 'int' +// CHECK-NEXT: | `-BuiltinType {{.+}} 'int' +// CHECK-NEXT: `-TemplateArgument type 'int' +// CHECK-NEXT: `-BuiltinType {{.+}} 'int' + +template