From 78a206201251470e441b452f7e2cb078ef382073 Mon Sep 17 00:00:00 2001 From: Erich Keane Date: Tue, 2 Mar 2021 06:32:58 -0800 Subject: [PATCH 1/3] [SYCL] Fix a crash with __bulitin_unique_stable_name A placeholder expression inside a unique-stable-name(at this point, an unresolved lookup expression) was not properly being transformed during template instantation. This patch ensures that it gets instantiated. --- clang/lib/Sema/SemaTemplateInstantiate.cpp | 6 ++++ .../unique-stable-name-placeholder-crash.cpp | 29 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 clang/test/CodeGenSYCL/unique-stable-name-placeholder-crash.cpp diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index 491d77c7dc502..e256830ac455a 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -1460,6 +1460,12 @@ static ExprResult TransformUniqueStableName(TemplateInstantiator &TI, if (SubExpr.isInvalid()) return ExprError(); + SubExpr = TI.getSema().CheckPlaceholderExpr(SubExpr.get()); + + if (SubExpr.isInvalid()) + return ExprError(); + + if (!TI.getDerived().AlwaysRebuild() && SubExpr.get() == E->getExpr()) return E; diff --git a/clang/test/CodeGenSYCL/unique-stable-name-placeholder-crash.cpp b/clang/test/CodeGenSYCL/unique-stable-name-placeholder-crash.cpp new file mode 100644 index 0000000000000..5b11afa467858 --- /dev/null +++ b/clang/test/CodeGenSYCL/unique-stable-name-placeholder-crash.cpp @@ -0,0 +1,29 @@ +// RUN: %clang_cc1 -triple spir64-unknown-unknown-sycldevice -std=c++17 -sycl-std=2020 -fsycl -fsycl-is-device -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s + +template +[[clang::sycl_kernel]] void kernel_single_task(const KernelType &kernelFunc) { + kernelFunc(); +} + +struct A { + int a = 0; + A() = default; +}; +constexpr A THE_NAME; + +template void temp() {} +template void foo(const char *out) { + out = __builtin_unique_stable_name(temp); +} + +int main() { + kernel_single_task( + []() { + const char *c; + foo(c); + }); +} + +// Note: the mangling here is actually the 'typeinfo name for void ()'. That is +// because the type of temp is actually the function type (which is void()). +// CHECK: @__builtin_unique_stable_name._Z3fooIL_ZL8THE_NAMEEEvPKc = private unnamed_addr addrspace(1) constant [9 x i8] c"_ZTSFvvE\00", align 1 From 0d4af0b17e2f273b18372221516d8acf2bc71983 Mon Sep 17 00:00:00 2001 From: Erich Keane Date: Tue, 2 Mar 2021 06:36:29 -0800 Subject: [PATCH 2/3] remove extranious newline --- clang/lib/Sema/SemaTemplateInstantiate.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/clang/lib/Sema/SemaTemplateInstantiate.cpp b/clang/lib/Sema/SemaTemplateInstantiate.cpp index e256830ac455a..e59200cfdd657 100644 --- a/clang/lib/Sema/SemaTemplateInstantiate.cpp +++ b/clang/lib/Sema/SemaTemplateInstantiate.cpp @@ -1465,7 +1465,6 @@ static ExprResult TransformUniqueStableName(TemplateInstantiator &TI, if (SubExpr.isInvalid()) return ExprError(); - if (!TI.getDerived().AlwaysRebuild() && SubExpr.get() == E->getExpr()) return E; From b9086a4b1e463e3ea0933d5def0efd0b285ac088 Mon Sep 17 00:00:00 2001 From: Erich Keane Date: Tue, 2 Mar 2021 07:50:28 -0800 Subject: [PATCH 3/3] Change to use the mock header --- .../CodeGenSYCL/unique-stable-name-placeholder-crash.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/clang/test/CodeGenSYCL/unique-stable-name-placeholder-crash.cpp b/clang/test/CodeGenSYCL/unique-stable-name-placeholder-crash.cpp index 5b11afa467858..ba28e35ae00af 100644 --- a/clang/test/CodeGenSYCL/unique-stable-name-placeholder-crash.cpp +++ b/clang/test/CodeGenSYCL/unique-stable-name-placeholder-crash.cpp @@ -1,9 +1,8 @@ -// RUN: %clang_cc1 -triple spir64-unknown-unknown-sycldevice -std=c++17 -sycl-std=2020 -fsycl -fsycl-is-device -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple spir64-unknown-unknown-sycldevice -internal-isystem %S/Inputs -std=c++17 -sycl-std=2020 -fsycl -fsycl-is-device -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s -template -[[clang::sycl_kernel]] void kernel_single_task(const KernelType &kernelFunc) { - kernelFunc(); -} +#include + +using namespace cl::sycl; struct A { int a = 0;