// RUN: %clang_cc1 -fcxx-exceptions -fcuda-is-device -fsyntax-only -verify %s // RUN: %clang_cc1 -fcxx-exceptions -fsyntax-only -verify %s #include "Inputs/cuda.h" void host() { throw NULL; try {} catch(void*) {} } __device__ void device() { throw NULL; // expected-error@-1 {{cannot use 'throw' in __device__ function}} try {} catch(void*) {} // expected-error@-1 {{cannot use 'try' in __device__ function}} } __global__ void kernel() { throw NULL; // expected-error@-1 {{cannot use 'throw' in __global__ function}} try {} catch(void*) {} // expected-error@-1 {{cannot use 'try' in __global__ function}} } // Check that it's an error to use 'try' and 'throw' from a __host__ __device__ // function if and only if it's codegen'ed for device. __host__ __device__ void hd1() { throw NULL; try {} catch(void*) {} #ifdef __CUDA_ARCH__ // expected-error@-3 {{cannot use 'throw' in __host__ __device__ function}} // expected-error@-3 {{cannot use 'try' in __host__ __device__ function}} #endif } // No error, never instantiated on device. inline __host__ __device__ void hd2() { throw NULL; try {} catch(void*) {} } void call_hd2() { hd2(); } // Error, instantiated on device. inline __host__ __device__ void hd3() { throw NULL; try {} catch(void*) {} #ifdef __CUDA_ARCH__ // expected-error@-3 {{cannot use 'throw' in __host__ __device__ function}} // expected-error@-3 {{cannot use 'try' in __host__ __device__ function}} #endif } __device__ void call_hd3() { hd3(); } #ifdef __CUDA_ARCH__ // expected-note@-2 {{called by 'call_hd3'}} #endif