Clang Project

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