Home | History | Annotate | Download | only in SemaCUDA
      1 // Test the Sema analysis of caller-callee relationships of host device
      2 // functions when compiling CUDA code. There are 4 permutations of this test as
      3 // host and device compilation are separate compilation passes, and clang has
      4 // an option to allow host calls from host device functions. __CUDA_ARCH__ is
      5 // defined when compiling for the device and TEST_WARN_HD when host calls are
      6 // allowed from host device functions. So for example, if __CUDA_ARCH__ is
      7 // defined and TEST_WARN_HD is not then device compilation is happening but
      8 // host device functions are not allowed to call device functions.
      9 
     10 // RUN: %clang_cc1 -fsyntax-only -verify %s
     11 // RUN: %clang_cc1 -fsyntax-only -fcuda-is-device -triple nvptx-unknown-cuda -verify %s
     12 // RUN: %clang_cc1 -fsyntax-only -fcuda-allow-host-calls-from-host-device -verify %s -DTEST_WARN_HD
     13 // RUN: %clang_cc1 -fsyntax-only -fcuda-is-device -triple nvptx-unknown-cuda -fcuda-allow-host-calls-from-host-device -verify %s -DTEST_WARN_HD
     14 
     15 #include "Inputs/cuda.h"
     16 
     17 __host__ void hd1h(void);
     18 #if defined(__CUDA_ARCH__) && !defined(TEST_WARN_HD)
     19 // expected-note@-2 {{candidate function not viable: call to __host__ function from __host__ __device__ function}}
     20 #endif
     21 __device__ void hd1d(void);
     22 #ifndef __CUDA_ARCH__
     23 // expected-note@-2 {{candidate function not viable: call to __device__ function from __host__ __device__ function}}
     24 #endif
     25 __host__ void hd1hg(void);
     26 __device__ void hd1dg(void);
     27 #ifdef __CUDA_ARCH__
     28 __host__ void hd1hig(void);
     29 #if !defined(TEST_WARN_HD)
     30 // expected-note@-2 {{candidate function not viable: call to __host__ function from __host__ __device__ function}}
     31 #endif
     32 #else
     33 __device__ void hd1dig(void); // expected-note {{candidate function not viable: call to __device__ function from __host__ __device__ function}}
     34 #endif
     35 __host__ __device__ void hd1hd(void);
     36 __global__ void hd1g(void); // expected-note {{'hd1g' declared here}}
     37 
     38 __host__ __device__ void hd1(void) {
     39 #if defined(TEST_WARN_HD) && defined(__CUDA_ARCH__)
     40 // expected-warning@-2 {{calling __host__ function hd1h from __host__ __device__ function hd1}}
     41 // expected-warning@-3 {{calling __host__ function hd1hig from __host__ __device__ function hd1}}
     42 #endif
     43   hd1d();
     44 #ifndef __CUDA_ARCH__
     45 // expected-error@-2 {{no matching function}}
     46 #endif
     47   hd1h();
     48 #if defined(__CUDA_ARCH__) && !defined(TEST_WARN_HD)
     49 // expected-error@-2 {{no matching function}}
     50 #endif
     51 
     52   // No errors as guarded
     53 #ifdef __CUDA_ARCH__
     54   hd1d();
     55 #else
     56   hd1h();
     57 #endif
     58 
     59   // Errors as incorrectly guarded
     60 #ifndef __CUDA_ARCH__
     61   hd1dig(); // expected-error {{no matching function}}
     62 #else
     63   hd1hig();
     64 #ifndef TEST_WARN_HD
     65 // expected-error@-2 {{no matching function}}
     66 #endif
     67 #endif
     68 
     69   hd1hd();
     70   hd1g<<<1, 1>>>(); // expected-error {{reference to __global__ function 'hd1g' in __host__ __device__ function}}
     71 }
     72