
`Sema::getCurFunctionDecl(AllowLambda = false)` returns a nullptr when the lambda declaration is outside a function (for example, when assigning a lambda to a static constexpr variable). This triggered an assertion in `SemaAMDGPU::CheckAMDGCNBuiltinFunctionCall`. Using `Sema::getCurFunctionDecl(AllowLambda = true)` returns the declaration of the enclosing lambda. Stumbled with this issue when refactoring some code in CK.
35 lines
1.3 KiB
Plaintext
35 lines
1.3 KiB
Plaintext
// REQUIRES: amdgpu-registered-target
|
|
// RUN: %clang_cc1 -std=c++20 -triple amdgcn -target-cpu tahiti -emit-llvm -fcuda-is-device -verify=no-memrealtime -o - %s
|
|
// RUN: %clang_cc1 -std=c++20 -triple amdgcn -target-cpu gfx950 -emit-llvm -fcuda-is-device -o - %s
|
|
|
|
#define __device__ __attribute__((device))
|
|
#define __shared__ __attribute__((shared))
|
|
|
|
struct S {
|
|
static constexpr auto memrealtime_lambda = []() {
|
|
__builtin_amdgcn_s_memrealtime(); // no-memrealtime-error{{'__builtin_amdgcn_s_memrealtime' needs target feature s-memrealtime}}
|
|
};
|
|
};
|
|
|
|
__attribute__((target("s-memrealtime")))
|
|
__device__ void test_target_dependant_builtin_attr_fail() {
|
|
S::memrealtime_lambda();
|
|
}
|
|
|
|
constexpr auto memrealtime_lambda = []() {
|
|
__builtin_amdgcn_s_memrealtime(); // no-memrealtime-error{{'__builtin_amdgcn_s_memrealtime' needs target feature s-memrealtime}}
|
|
};
|
|
|
|
__attribute__((target("s-memrealtime")))
|
|
__device__ void global_test_target_dependant_builtin_attr_fail() {
|
|
memrealtime_lambda();
|
|
}
|
|
|
|
__attribute__((target("s-memrealtime")))
|
|
__device__ void local_test_target_dependant_builtin_attr_fail() {
|
|
static constexpr auto f = []() {
|
|
__builtin_amdgcn_s_memrealtime(); // no-memrealtime-error{{'__builtin_amdgcn_s_memrealtime' needs target feature s-memrealtime}}
|
|
};
|
|
f();
|
|
}
|