From: Xiuli Pan Date: Thu, 25 Feb 2016 03:34:20 +0000 (+0000) Subject: [OpenCL] Add Sema checks for types X-Git-Tag: llvmorg-3.9.0-rc1~13296 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=379554ac5b15a4c76719d1241dd149b294f93331;p=platform%2Fupstream%2Fllvm.git [OpenCL] Add Sema checks for types Summary: Add Sema checks for opencl type: image, pipe.... This patch is partitioned from http://reviews.llvm.org/D16047 Reviewers: Anastasia, yaxunl Subscribers: pekka.jaaskelainen, cfe-commits Differential Revision: http://reviews.llvm.org/D17437 llvm-svn: 261818 --- diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 53c0a31236b3..70a841711abe 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -7720,6 +7720,10 @@ def err_opencl_invalid_type_array : Error< "array of %0 type is invalid in OpenCL">; def err_opencl_ternary_with_block : Error< "block type cannot be used as expression in ternary expression in OpenCL">; +def err_opencl_pointer_to_type : Error< + "pointer to type %0 is invalid in OpenCL">; +def err_opencl_type_can_only_be_used_as_function_parameter : Error < + "type %0 can only be used as a function parameter in OpenCL">; // OpenCL v2.0 s6.13.6 -- Builtin Pipe Functions def err_opencl_builtin_pipe_first_arg : Error< diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 378abe94e877..61ec1a775290 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -5710,6 +5710,17 @@ Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, QualType R = TInfo->getType(); DeclarationName Name = GetNameForDeclarator(D).getName(); + // OpenCL v2.0 s6.9.b - Image type can only be used as a function argument. + // OpenCL v2.0 s6.13.16.1 - Pipe type can only be used as a function + // argument. + if (getLangOpts().OpenCL && (R->isImageType() || R->isPipeType())) { + Diag(D.getIdentifierLoc(), + diag::err_opencl_type_can_only_be_used_as_function_parameter) + << R; + D.setInvalidType(); + return nullptr; + } + DeclSpec::SCS SCSpec = D.getDeclSpec().getStorageClassSpec(); StorageClass SC = StorageClassSpecToVarDeclStorageClass(D.getDeclSpec()); @@ -10737,7 +10748,17 @@ ParmVarDecl *Sema::CheckParameter(DeclContext *DC, SourceLocation StartLoc, Diag(NameLoc, diag::err_arg_with_address_space); New->setInvalidDecl(); } - } + } + + // OpenCL v2.0 s6.9b - Pointer to image/sampler cannot be used. + // OpenCL v2.0 s6.13.16.1 - Pointer to pipe cannot be used. + if (getLangOpts().OpenCL && T->isPointerType()) { + const QualType PTy = T->getPointeeType(); + if (PTy->isImageType() || PTy->isSamplerT() || PTy->isPipeType()) { + Diag(NameLoc, diag::err_opencl_pointer_to_type) << PTy; + New->setInvalidDecl(); + } + } return New; } diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 5c3b7ab3349a..fb37743a7109 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -2176,9 +2176,12 @@ QualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM, } // OpenCL v2.0 s6.12.5 - Arrays of blocks are not supported. + // OpenCL v2.0 s6.16.13.1 - Arrays of pipe type are not supported. + // OpenCL v2.0 s6.9.b - Arrays of image/sampler type are not supported. if (getLangOpts().OpenCL) { const QualType ArrType = Context.getBaseElementType(T); - if (ArrType->isBlockPointerType()) { + if (ArrType->isBlockPointerType() || ArrType->isPipeType() || + ArrType->isSamplerT() || ArrType->isImageType()) { Diag(Loc, diag::err_opencl_invalid_type_array) << ArrType; return QualType(); } diff --git a/clang/test/CodeGenOpenCL/opencl_types.cl b/clang/test/CodeGenOpenCL/opencl_types.cl index 5f4ebb8a283e..6fb39cb78e9d 100644 --- a/clang/test/CodeGenOpenCL/opencl_types.cl +++ b/clang/test/CodeGenOpenCL/opencl_types.cl @@ -36,5 +36,5 @@ kernel void foo(image1d_t img) { // CHECK: call {{.*}}void @fnc4smp(i32 } -void __attribute__((overloadable)) bad1(image1d_t *b, image2d_t *c, image2d_t *d) {} -// CHECK-LABEL: @{{_Z4bad1P11ocl_image1dP11ocl_image2dS2_|"\\01\?bad1@@\$\$J0YAXPE?APAUocl_image1d@@PE?APAUocl_image2d@@1@Z"}} +void __attribute__((overloadable)) bad1(image1d_t b, image2d_t c, image2d_t d) {} +// CHECK-LABEL: @{{_Z4bad111ocl_image1d11ocl_image2dS0_|"\\01\?bad1@@\$\$J0YAXPAUocl_image1d@@PAUocl_image2d@@1@Z"}} diff --git a/clang/test/SemaOpenCL/invalid-image.cl b/clang/test/SemaOpenCL/invalid-image.cl new file mode 100644 index 000000000000..2ef7abf4cdb2 --- /dev/null +++ b/clang/test/SemaOpenCL/invalid-image.cl @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -verify %s + +void test1(image1d_t *i){} // expected-error {{pointer to type 'image1d_t' is invalid in OpenCL}} + +void test2(image1d_t i) { + image1d_t ti; // expected-error {{type 'image1d_t' can only be used as a function parameter}} + image1d_t ai[] = {i,i};// expected-error {{array of 'image1d_t' type is invalid in OpenCL}} +} diff --git a/clang/test/SemaOpenCL/invalid-pipes-cl2.0.cl b/clang/test/SemaOpenCL/invalid-pipes-cl2.0.cl index ee36892b93d4..0e44855fb021 100644 --- a/clang/test/SemaOpenCL/invalid-pipes-cl2.0.cl +++ b/clang/test/SemaOpenCL/invalid-pipes-cl2.0.cl @@ -6,3 +6,6 @@ void test2(pipe p){// expected-error {{missing actual type specifier for pipe}} } void test3(int pipe p){// expected-error {{cannot combine with previous 'int' declaration specifier}} } +void test4() { + pipe int p; // expected-error {{type 'pipe' can only be used as a function parameter}} +} diff --git a/clang/test/SemaOpenCL/sampler_t.cl b/clang/test/SemaOpenCL/sampler_t.cl index 96f6dbf086b7..82fb347bc002 100644 --- a/clang/test/SemaOpenCL/sampler_t.cl +++ b/clang/test/SemaOpenCL/sampler_t.cl @@ -10,4 +10,7 @@ void kernel ker(sampler_t argsmp) { foo(glb_smp); foo(const_smp); foo(5); // expected-error {{sampler_t variable required - got 'int'}} + sampler_t sa[] = {argsmp, const_smp}; // expected-error {{array of 'sampler_t' type is invalid in OpenCL}} } + +void bad(sampler_t*); // expected-error {{pointer to type 'sampler_t' is invalid in OpenCL}}