diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index ba08bb279d44f..fc5145a2805de 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -6814,13 +6814,18 @@ class FreeFunctionPrinter { QualType T = Param->getType(); QualType CT = T.getCanonicalType(); - auto *TST = dyn_cast(T.getTypePtr()); - auto *CTST = dyn_cast(CT.getTypePtr()); + const auto *TST = dyn_cast(T.getTypePtr()); + const auto *CTST = dyn_cast(CT.getTypePtr()); if (!TST || !CTST) { ParmListOstream << T.getAsString(Policy); continue; } + const TemplateSpecializationType *TSTAsNonAlias = + TST->getAsNonAliasTemplateSpecializationType(); + if (TSTAsNonAlias) + TST = TSTAsNonAlias; + TemplateName CTN = CTST->getTemplateName(); CTN.getAsTemplateDecl()->printQualifiedName(ParmListOstream); ParmListOstream << "<"; diff --git a/clang/test/CodeGenSYCL/free-function-kernel-type-alias-arg.cpp b/clang/test/CodeGenSYCL/free-function-kernel-type-alias-arg.cpp index d605d8be537bf..5d6ea216d7d38 100644 --- a/clang/test/CodeGenSYCL/free-function-kernel-type-alias-arg.cpp +++ b/clang/test/CodeGenSYCL/free-function-kernel-type-alias-arg.cpp @@ -23,11 +23,21 @@ struct Bar {}; template using BarUsing = Bar; +template +using BarUsing2 = Bar, T1>; + +template +using BarUsingBarUsing2 = BarUsing2; + class Baz { public: using type = BarUsing; }; +template , + typename T4 = BarUsing> +struct AliasAsDefaultArg {}; + } // namespace ns [[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]] @@ -57,7 +67,32 @@ template void bar_using(ns::BarUsing); // CHECK: template void bar_using(ns::Bar); +template +[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]] +void bar_using2(ns::BarUsing2 Arg) {} +template void bar_using2(ns::BarUsing2); + +// CHECK: template void bar_using2(ns::Bar, T1>); + +template +[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]] +void bar_using_bar_using2(ns::BarUsingBarUsing2 Arg) {} +template void bar_using_bar_using2(ns::BarUsingBarUsing2); + +// CHECK: template void bar_using_bar_using2(ns::Bar, T1>); + [[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]] void baz_type(ns::Baz::type Arg) {} // CHECK: void baz_type(ns::Bar Arg); + +#if 0 +// This test case fails, but it is added here in advance to add a record of a +// known bug. +template +[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]] +void alias_as_default_template_arg(ns::AliasAsDefaultArg Arg) {} +template void alias_as_default_template_arg(ns::AliasAsDefaultArg); + +// CHECK-DISABLED: template void alias_as_default_template_arg(ns::AliasAsDefaultArg, T1>, ns::Bar>); +#endif