forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
// 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
 | 
						|
}
 |