// REQUIRES: x86-registered-target // REQUIRES: nvptx-registered-target // RUN: %clang_cc1 -triple nvptx64-nvidia-cuda -fcuda-is-device -fsyntax-only \ // RUN: -verify -DEXPECT_VA_ARG_ERR -DEXPECT_VARARG_ERR %s // RUN: %clang_cc1 -triple nvptx64-nvidia-cuda -fcuda-is-device -fsyntax-only \ // RUN: -fcuda-allow-variadic-functions -verify -DEXPECT_VA_ARG_ERR %s // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fsyntax-only -verify \ // RUN: -DEXPECT_VARARG_ERR %s #include <stdarg.h> #include "Inputs/cuda.h" __device__ void foo() { va_list list; va_arg(list, int); #ifdef EXPECT_VA_ARG_ERR // expected-error@-2 {{CUDA device code does not support va_arg}} #endif } void bar() { va_list list; va_arg(list, int); // OK: host-only } __device__ void baz() { #if !defined(__CUDA_ARCH__) va_list list; va_arg(list, int); // OK: only seen when compiling for host #endif } __device__ void vararg(const char* x, ...) {} #ifdef EXPECT_VARARG_ERR // expected-error@-2 {{CUDA device code does not support variadic functions}} #endif template <typename T> __device__ void vararg(T t, ...) {} #ifdef EXPECT_VARARG_ERR // expected-error@-2 {{CUDA device code does not support variadic functions}} #endif extern "C" __device__ int printf(const char* fmt, ...); // OK, special case. // Definition of printf not allowed. extern "C" __device__ int printf(const char* fmt, ...) { return 0; } #ifdef EXPECT_VARARG_ERR // expected-error@-2 {{CUDA device code does not support variadic functions}} #endif namespace ns { __device__ int printf(const char* fmt, ...); #ifdef EXPECT_VARARG_ERR // expected-error@-2 {{CUDA device code does not support variadic functions}} #endif }