mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-30 00:38:54 -04:00

Summary: Previously we had to split out a lot of our tests into a test that checked only immediate errors and a test that checked only deferred errors. This was because, if you emitted any immediate errors, we wouldn't run codegen, where the deferred errors were emitted. We've fixed this, and now emit deferred errors during sema. This lets us merge a bunch of tests, and lets us convert some other tests to -fsyntax-only. Reviewers: tra Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D25755 llvm-svn: 284553
107 lines
2.4 KiB
Plaintext
107 lines
2.4 KiB
Plaintext
// RUN: %clang_cc1 -std=c++11 -fcuda-is-device -verify -fsyntax-only -verify-ignore-unexpected=warning -verify-ignore-unexpected=note %s
|
|
// RUN: %clang_cc1 -std=c++11 -verify -fsyntax-only -verify-ignore-unexpected=warning -verify-ignore-unexpected=note %s
|
|
|
|
#include "Inputs/cuda.h"
|
|
|
|
__device__ void device_fn() {
|
|
auto f1 = [&] {};
|
|
f1(); // implicitly __device__
|
|
|
|
auto f2 = [&] __device__ {};
|
|
f2();
|
|
|
|
auto f3 = [&] __host__ {};
|
|
f3(); // expected-error {{no matching function}}
|
|
|
|
auto f4 = [&] __host__ __device__ {};
|
|
f4();
|
|
|
|
// Now do it all again with '()'s in the lambda declarations: This is a
|
|
// different parse path.
|
|
auto g1 = [&]() {};
|
|
g1(); // implicitly __device__
|
|
|
|
auto g2 = [&]() __device__ {};
|
|
g2();
|
|
|
|
auto g3 = [&]() __host__ {};
|
|
g3(); // expected-error {{no matching function}}
|
|
|
|
auto g4 = [&]() __host__ __device__ {};
|
|
g4();
|
|
|
|
// Once more, with the '()'s in a different place.
|
|
auto h1 = [&]() {};
|
|
h1(); // implicitly __device__
|
|
|
|
auto h2 = [&] __device__ () {};
|
|
h2();
|
|
|
|
auto h3 = [&] __host__ () {};
|
|
h3(); // expected-error {{no matching function}}
|
|
|
|
auto h4 = [&] __host__ __device__ () {};
|
|
h4();
|
|
}
|
|
|
|
// Behaves identically to device_fn.
|
|
__global__ void kernel_fn() {
|
|
auto f1 = [&] {};
|
|
f1(); // implicitly __device__
|
|
|
|
auto f2 = [&] __device__ {};
|
|
f2();
|
|
|
|
auto f3 = [&] __host__ {};
|
|
f3(); // expected-error {{no matching function}}
|
|
|
|
auto f4 = [&] __host__ __device__ {};
|
|
f4();
|
|
|
|
// No need to re-test all the parser contortions we test in the device
|
|
// function.
|
|
}
|
|
|
|
__host__ void host_fn() {
|
|
auto f1 = [&] {};
|
|
f1(); // implicitly __host__ (i.e., no magic)
|
|
|
|
auto f2 = [&] __device__ {};
|
|
f2(); // expected-error {{no matching function}}
|
|
|
|
auto f3 = [&] __host__ {};
|
|
f3();
|
|
|
|
auto f4 = [&] __host__ __device__ {};
|
|
f4();
|
|
}
|
|
|
|
__host__ __device__ void hd_fn() {
|
|
auto f1 = [&] {};
|
|
f1(); // implicitly __host__ __device__
|
|
|
|
auto f2 = [&] __device__ {};
|
|
f2();
|
|
#ifndef __CUDA_ARCH__
|
|
// expected-error@-2 {{reference to __device__ function}}
|
|
#endif
|
|
|
|
auto f3 = [&] __host__ {};
|
|
f3();
|
|
#ifdef __CUDA_ARCH__
|
|
// expected-error@-2 {{reference to __host__ function}}
|
|
#endif
|
|
|
|
auto f4 = [&] __host__ __device__ {};
|
|
f4();
|
|
}
|
|
|
|
// The special treatment above only applies to lambdas.
|
|
__device__ void foo() {
|
|
struct X {
|
|
void foo() {}
|
|
};
|
|
X x;
|
|
x.foo(); // expected-error {{reference to __host__ function 'foo' in __device__ function}}
|
|
}
|