From 9a01c127a8d47c08eab55c4b9b75fceddc6c2605 Mon Sep 17 00:00:00 2001 From: Alexey Sachkov Date: Thu, 20 Nov 2025 15:45:21 +0100 Subject: [PATCH 1/2] [SYCL] Fix one more bug in int-header generation When free function kernel defined as a template has an argument whose type is an alias, we need to look into the underlying type, or otherwise we emit nonsense. --- clang/lib/Sema/SemaSYCL.cpp | 9 +++++-- .../free-function-kernel-type-alias-arg.cpp | 25 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) 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..ca18c4c50abb8 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,18 @@ struct Bar {}; template using BarUsing = Bar; +template +using BarUsing2 = Bar, T1>; + 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 +64,25 @@ 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>); + [[__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 From 99174d62ca92a454e8dabba9cac8290dd8f3a059 Mon Sep 17 00:00:00 2001 From: Alexey Sachkov Date: Fri, 21 Nov 2025 11:14:28 +0100 Subject: [PATCH 2/2] Add one more test case --- .../free-function-kernel-type-alias-arg.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 ca18c4c50abb8..5d6ea216d7d38 100644 --- a/clang/test/CodeGenSYCL/free-function-kernel-type-alias-arg.cpp +++ b/clang/test/CodeGenSYCL/free-function-kernel-type-alias-arg.cpp @@ -26,6 +26,9 @@ using BarUsing = Bar; template using BarUsing2 = Bar, T1>; +template +using BarUsingBarUsing2 = BarUsing2; + class Baz { public: using type = BarUsing; @@ -71,6 +74,13 @@ 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) {}