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