diff --git a/clang/lib/Sema/SemaSYCL.cpp b/clang/lib/Sema/SemaSYCL.cpp index c86e49a1be33b..b9a5d202af373 100644 --- a/clang/lib/Sema/SemaSYCL.cpp +++ b/clang/lib/Sema/SemaSYCL.cpp @@ -6822,13 +6822,13 @@ class FreeFunctionPrinter { continue; } - TemplateName TN = TST->getTemplateName(); + TemplateName CTN = CTST->getTemplateName(); + CTN.getAsTemplateDecl()->printQualifiedName(ParmListOstream); + ParmListOstream << "<"; + auto SpecArgs = TST->template_arguments(); auto DeclArgs = CTST->template_arguments(); - TN.getAsTemplateDecl()->printQualifiedName(ParmListOstream); - ParmListOstream << "<"; - for (size_t I = 0, E = std::max(DeclArgs.size(), SpecArgs.size()), SE = SpecArgs.size(); I < E; ++I) { diff --git a/clang/test/CodeGenSYCL/free-function-kernel-type-alias-arg.cpp b/clang/test/CodeGenSYCL/free-function-kernel-type-alias-arg.cpp new file mode 100644 index 0000000000000..d605d8be537bf --- /dev/null +++ b/clang/test/CodeGenSYCL/free-function-kernel-type-alias-arg.cpp @@ -0,0 +1,63 @@ +// RUN: %clang_cc1 -fsycl-is-device -internal-isystem %S/Inputs -triple spir64-unknown-unknown -sycl-std=2020 -fsycl-int-header=%t.h %s +// RUN: FileCheck -input-file=%t.h %s +// +// The purpose of this test is to ensure that forward declarations of free +// function kernels are emitted properly. +// However, this test checks a specific scenario: +// - free function arguments are type aliases (through using or typedef) + +namespace ns { + +using IntUsing = int; +typedef int IntTypedef; + +template +struct Foo {}; + +using FooIntUsing = Foo; +typedef Foo FooIntTypedef; + +template +struct Bar {}; + +template +using BarUsing = Bar; + +class Baz { +public: + using type = BarUsing; +}; + +} // namespace ns + +[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]] +void int_using(ns::IntUsing Arg) {} + +// CHECK: void int_using(int Arg); + +[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]] +void int_typedef(ns::IntTypedef Arg) {} + +// CHECK: void int_typedef(int Arg); + +[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]] +void foo_using(ns::FooIntUsing Arg) {} + +// CHECK: void foo_using(ns::Foo Arg); + +[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]] +void foo_typedef(ns::FooIntTypedef Arg) {} + +// CHECK: void foo_typedef(ns::Foo Arg); + +template +[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]] +void bar_using(ns::BarUsing Arg) {} +template void bar_using(ns::BarUsing); + +// CHECK: template void bar_using(ns::Bar); + +[[__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);