diff options
author | Anastasia Stulova <anastasia.stulova@arm.com> | 2016-10-28 12:59:39 +0000 |
---|---|---|
committer | Anastasia Stulova <anastasia.stulova@arm.com> | 2016-10-28 12:59:39 +0000 |
commit | 7c3053336233772ff33d4f908fc954566a7e6422 (patch) | |
tree | caf102e9ecac012b5720553784d677689d37f5d7 /clang/test/SemaOpenCL/func.cl | |
parent | c3ccf5d77baa8cf4237e3eb68858eda97155e037 (diff) | |
download | bcm5719-llvm-7c3053336233772ff33d4f908fc954566a7e6422.tar.gz bcm5719-llvm-7c3053336233772ff33d4f908fc954566a7e6422.zip |
[OpenCL] Diagnose variadic arguments
OpenCL disallows using variadic arguments (s6.9.e and s6.12.5 OpenCL v2.0)
apart from some exceptions:
- printf
- enqueue_kernel
This change adds error diagnostic for variadic functions but accepts printf
and any compiler internal function (which should cover __enqueue_kernel_XXX cases).
It also unifies diagnostic with block prototype and adds missing uncaught cases for blocks.
llvm-svn: 285395
Diffstat (limited to 'clang/test/SemaOpenCL/func.cl')
-rw-r--r-- | clang/test/SemaOpenCL/func.cl | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/clang/test/SemaOpenCL/func.cl b/clang/test/SemaOpenCL/func.cl new file mode 100644 index 00000000000..ea3bab6c514 --- /dev/null +++ b/clang/test/SemaOpenCL/func.cl @@ -0,0 +1,26 @@ +// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only + +// Variadic functions +void vararg_f(int, ...); // expected-error {{invalid prototype, variadic arguments are not allowed in OpenCL}} +void __vararg_f(int, ...); +typedef void (*vararg_fptr_t)(int, ...); // expected-error {{invalid prototype, variadic arguments are not allowed in OpenCL}} +int printf(__constant const char *st, ...); // expected-error {{invalid prototype, variadic arguments are not allowed in OpenCL}} + +//Function pointer +void foo(void*); + +void bar() +{ + // declaring a function pointer is an error + void (*fptr)(int); // expected-error{{pointers to functions are not allowed}} + + // taking the address of a function is an error + foo((void*)foo); // expected-error{{taking address of function is not allowed}} + foo(&foo); // expected-error{{taking address of function is not allowed}} + + // initializing an array with the address of functions is an error + void* vptrarr[2] = {foo, &foo}; // expected-error{{taking address of function is not allowed}} expected-error{{taking address of function is not allowed}} + + // just calling a function is correct + foo(0); +} |