xref: /aosp_15_r20/external/clang/test/SemaCUDA/vararg.cu (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // REQUIRES: x86-registered-target
2*67e74705SXin Li // REQUIRES: nvptx-registered-target
3*67e74705SXin Li // RUN: %clang_cc1 -triple nvptx64-nvidia-cuda -fcuda-is-device -fsyntax-only \
4*67e74705SXin Li // RUN:   -verify -DEXPECT_VA_ARG_ERR -DEXPECT_VARARG_ERR %s
5*67e74705SXin Li // RUN: %clang_cc1 -triple nvptx64-nvidia-cuda -fcuda-is-device -fsyntax-only \
6*67e74705SXin Li // RUN:   -fcuda-allow-variadic-functions -verify -DEXPECT_VA_ARG_ERR %s
7*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only -verify \
8*67e74705SXin Li // RUN:   -DEXPECT_VARARG_ERR %s
9*67e74705SXin Li 
10*67e74705SXin Li #include <stdarg.h>
11*67e74705SXin Li #include "Inputs/cuda.h"
12*67e74705SXin Li 
foo()13*67e74705SXin Li __device__ void foo() {
14*67e74705SXin Li   va_list list;
15*67e74705SXin Li   va_arg(list, int);
16*67e74705SXin Li #ifdef EXPECT_VA_ARG_ERR
17*67e74705SXin Li   // expected-error@-2 {{CUDA device code does not support va_arg}}
18*67e74705SXin Li #endif
19*67e74705SXin Li }
20*67e74705SXin Li 
bar()21*67e74705SXin Li void bar() {
22*67e74705SXin Li   va_list list;
23*67e74705SXin Li   va_arg(list, int);  // OK: host-only
24*67e74705SXin Li }
25*67e74705SXin Li 
baz()26*67e74705SXin Li __device__ void baz() {
27*67e74705SXin Li #if !defined(__CUDA_ARCH__)
28*67e74705SXin Li   va_list list;
29*67e74705SXin Li   va_arg(list, int);  // OK: only seen when compiling for host
30*67e74705SXin Li #endif
31*67e74705SXin Li }
32*67e74705SXin Li 
vararg(const char * x,...)33*67e74705SXin Li __device__ void vararg(const char* x, ...) {}
34*67e74705SXin Li #ifdef EXPECT_VARARG_ERR
35*67e74705SXin Li // expected-error@-2 {{CUDA device code does not support variadic functions}}
36*67e74705SXin Li #endif
37*67e74705SXin Li 
38*67e74705SXin Li template <typename T>
vararg(T t,...)39*67e74705SXin Li __device__ void vararg(T t, ...) {}
40*67e74705SXin Li #ifdef EXPECT_VARARG_ERR
41*67e74705SXin Li // expected-error@-2 {{CUDA device code does not support variadic functions}}
42*67e74705SXin Li #endif
43*67e74705SXin Li 
44*67e74705SXin Li extern "C" __device__ int printf(const char* fmt, ...);  // OK, special case.
45*67e74705SXin Li 
46*67e74705SXin Li // Definition of printf not allowed.
printf(const char * fmt,...)47*67e74705SXin Li extern "C" __device__ int printf(const char* fmt, ...) { return 0; }
48*67e74705SXin Li #ifdef EXPECT_VARARG_ERR
49*67e74705SXin Li // expected-error@-2 {{CUDA device code does not support variadic functions}}
50*67e74705SXin Li #endif
51*67e74705SXin Li 
52*67e74705SXin Li namespace ns {
53*67e74705SXin Li __device__ int printf(const char* fmt, ...);
54*67e74705SXin Li #ifdef EXPECT_VARARG_ERR
55*67e74705SXin Li // expected-error@-2 {{CUDA device code does not support variadic functions}}
56*67e74705SXin Li #endif
57*67e74705SXin Li }
58