summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaOpenCL/func.cl
diff options
context:
space:
mode:
authorAnastasia Stulova <anastasia.stulova@arm.com>2016-10-28 12:59:39 +0000
committerAnastasia Stulova <anastasia.stulova@arm.com>2016-10-28 12:59:39 +0000
commit7c3053336233772ff33d4f908fc954566a7e6422 (patch)
treecaf102e9ecac012b5720553784d677689d37f5d7 /clang/test/SemaOpenCL/func.cl
parentc3ccf5d77baa8cf4237e3eb68858eda97155e037 (diff)
downloadbcm5719-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.cl26
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);
+}
OpenPOWER on IntegriCloud