Skip to content

Commit 7dc6a5e

Browse files
[SYCL] Fix one more bug in int-header generation (#20706)
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.
1 parent 5da1a25 commit 7dc6a5e

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

clang/lib/Sema/SemaSYCL.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6814,13 +6814,18 @@ class FreeFunctionPrinter {
68146814
QualType T = Param->getType();
68156815
QualType CT = T.getCanonicalType();
68166816

6817-
auto *TST = dyn_cast<TemplateSpecializationType>(T.getTypePtr());
6818-
auto *CTST = dyn_cast<TemplateSpecializationType>(CT.getTypePtr());
6817+
const auto *TST = dyn_cast<TemplateSpecializationType>(T.getTypePtr());
6818+
const auto *CTST = dyn_cast<TemplateSpecializationType>(CT.getTypePtr());
68196819
if (!TST || !CTST) {
68206820
ParmListOstream << T.getAsString(Policy);
68216821
continue;
68226822
}
68236823

6824+
const TemplateSpecializationType *TSTAsNonAlias =
6825+
TST->getAsNonAliasTemplateSpecializationType();
6826+
if (TSTAsNonAlias)
6827+
TST = TSTAsNonAlias;
6828+
68246829
TemplateName CTN = CTST->getTemplateName();
68256830
CTN.getAsTemplateDecl()->printQualifiedName(ParmListOstream);
68266831
ParmListOstream << "<";

clang/test/CodeGenSYCL/free-function-kernel-type-alias-arg.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,21 @@ struct Bar {};
2323
template<typename T1>
2424
using BarUsing = Bar<T1, float>;
2525

26+
template<typename T1, typename T2>
27+
using BarUsing2 = Bar<Foo<T2>, T1>;
28+
29+
template <typename T1>
30+
using BarUsingBarUsing2 = BarUsing2<T1, int>;
31+
2632
class Baz {
2733
public:
2834
using type = BarUsing<double>;
2935
};
3036

37+
template <typename T1, typename T2, typename T3 = BarUsing2<T1, T2>,
38+
typename T4 = BarUsing<T2>>
39+
struct AliasAsDefaultArg {};
40+
3141
} // namespace ns
3242

3343
[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]]
@@ -57,7 +67,32 @@ template void bar_using(ns::BarUsing<int>);
5767

5868
// CHECK: template <typename T> void bar_using(ns::Bar<T, float>);
5969

70+
template<typename T1, typename T2>
71+
[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]]
72+
void bar_using2(ns::BarUsing2<T1, T2> Arg) {}
73+
template void bar_using2(ns::BarUsing2<int, float>);
74+
75+
// CHECK: template <typename T1, typename T2> void bar_using2(ns::Bar<ns::Foo<T2>, T1>);
76+
77+
template<typename T1>
78+
[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]]
79+
void bar_using_bar_using2(ns::BarUsingBarUsing2<T1> Arg) {}
80+
template void bar_using_bar_using2(ns::BarUsingBarUsing2<int>);
81+
82+
// CHECK: template <typename T1> void bar_using_bar_using2(ns::Bar<ns::Foo<int>, T1>);
83+
6084
[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]]
6185
void baz_type(ns::Baz::type Arg) {}
6286

6387
// CHECK: void baz_type(ns::Bar<double, float> Arg);
88+
89+
#if 0
90+
// This test case fails, but it is added here in advance to add a record of a
91+
// known bug.
92+
template<typename T1, typename T2>
93+
[[__sycl_detail__::add_ir_attributes_function("sycl-nd-range-kernel", 2)]]
94+
void alias_as_default_template_arg(ns::AliasAsDefaultArg<T1, T2> Arg) {}
95+
template void alias_as_default_template_arg(ns::AliasAsDefaultArg<int, float>);
96+
97+
// CHECK-DISABLED: template <typename T1, typename T2> void alias_as_default_template_arg(ns::AliasAsDefaultArg<T1, T2, ns::Bar<ns::Foo<T2>, T1>, ns::Bar<T2, float>>);
98+
#endif

0 commit comments

Comments
 (0)