| // RUN: %clang_cc1 -fcxx-exceptions -fcuda-is-device -fsyntax-only -std=c++17 -verify %s |
| |
| #include "Inputs/cuda.h" |
| |
| // Error, instantiated on device. |
| inline __host__ __device__ void hasInvalid() { |
| throw NULL; |
| // expected-error@-1 2{{cannot use 'throw' in __host__ __device__ function}} |
| } |
| |
| inline __host__ __device__ void hasInvalid2() { |
| throw NULL; |
| // expected-error@-1 2{{cannot use 'throw' in __host__ __device__ function}} |
| } |
| |
| inline __host__ __device__ void hasInvalidDiscarded() { |
| // This is only used in the discarded statements below, so this should not diagnose. |
| throw NULL; |
| } |
| |
| static __device__ void use0() { |
| hasInvalid(); // expected-note {{called by 'use0'}} |
| hasInvalid(); // expected-note {{called by 'use0'}} |
| |
| if constexpr (true) { |
| hasInvalid2(); // expected-note {{called by 'use0'}} |
| } else { |
| hasInvalidDiscarded(); |
| } |
| |
| if constexpr (false) { |
| hasInvalidDiscarded(); |
| } else { |
| hasInvalid2(); // expected-note {{called by 'use0'}} |
| } |
| |
| if constexpr (false) { |
| hasInvalidDiscarded(); |
| } |
| } |
| |
| // To avoid excessive diagnostic messages, deferred diagnostics are only |
| // emitted the first time a function is called. |
| static __device__ void use1() { |
| use0(); // expected-note 4{{called by 'use1'}} |
| use0(); |
| } |
| |
| static __device__ void use2() { |
| use1(); // expected-note 4{{called by 'use2'}} |
| use1(); |
| } |
| |
| static __device__ void use3() { |
| use2(); // expected-note 4{{called by 'use3'}} |
| use2(); |
| } |
| |
| __global__ void use4() { |
| use3(); // expected-note 4{{called by 'use4'}} |
| use3(); |
| } |