|  | // 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 |