12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- // RUN: %clang_cc1 -std=c++11 -fcuda-is-device -fsyntax-only -verify %s
- // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
- #include "Inputs/cuda.h"
- #ifndef __CUDA_ARCH__
- // expected-no-diagnostics
- #endif
- // When compiling for device, foo()'s call to host_fn() is an error, because
- // foo() is known-emitted.
- //
- // The trickiness here comes from the fact that the FunctionDecl bar() sees
- // foo() does not have the "inline" keyword, so we might incorrectly think that
- // foo() is a priori known-emitted. This would prevent us from marking foo()
- // as known-emitted when we see the call from bar() to foo(), which would
- // prevent us from emitting an error for foo()'s call to host_fn() when we
- // eventually see it.
- void host_fn() {}
- #ifdef __CUDA_ARCH__
- // expected-note@-2 {{declared here}}
- #endif
- __host__ __device__ void foo();
- __device__ void bar() {
- foo();
- #ifdef __CUDA_ARCH__
- // expected-note@-2 {{called by 'bar'}}
- #endif
- }
- inline __host__ __device__ void foo() {
- host_fn();
- #ifdef __CUDA_ARCH__
- // expected-error@-2 {{reference to __host__ function}}
- #endif
- }
- // This is similar to the above, except there's no error here. This code used
- // to trip an assertion due to us noticing, when emitting the definition of
- // boom(), that T::operator S() was (incorrectly) considered a priori
- // known-emitted.
- struct S {};
- struct T {
- __device__ operator S() const;
- };
- __device__ inline T::operator S() const { return S(); }
- __device__ T t;
- __device__ void boom() {
- S s = t;
- }
|