diff options
author | David Tweed <david.tweed@arm.com> | 2014-03-27 16:34:11 +0000 |
---|---|---|
committer | David Tweed <david.tweed@arm.com> | 2014-03-27 16:34:11 +0000 |
commit | ababa8f95402795d9c256849570415dbf8ed26b2 (patch) | |
tree | 16df14d426b29374caec2097386695c7ff228242 /clang/lib/Sema/SemaDecl.cpp | |
parent | 30eb9f47c6fc1f3333cbed741b1f1323730fa1f1 (diff) | |
download | bcm5719-llvm-ababa8f95402795d9c256849570415dbf8ed26b2.tar.gz bcm5719-llvm-ababa8f95402795d9c256849570415dbf8ed26b2.zip |
Enforce the restriction that a parameter to a kernel function
cannot be a pointer to the private address space (as clarified
in the OpenCL 1.2 specification).
Patch by Fraser Cormack!
llvm-svn: 204941
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index bfbd870eefc..82579d89cd2 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -6378,6 +6378,7 @@ enum OpenCLParamType { ValidKernelParam, PtrPtrKernelParam, PtrKernelParam, + PrivatePtrKernelParam, InvalidKernelParam, RecordKernelParam }; @@ -6385,7 +6386,10 @@ enum OpenCLParamType { static OpenCLParamType getOpenCLKernelParameterType(QualType PT) { if (PT->isPointerType()) { QualType PointeeType = PT->getPointeeType(); - return PointeeType->isPointerType() ? PtrPtrKernelParam : PtrKernelParam; + if (PointeeType->isPointerType()) + return PtrPtrKernelParam; + return PointeeType.getAddressSpace() == 0 ? PrivatePtrKernelParam + : PtrKernelParam; } // TODO: Forbid the other integer types (size_t, ptrdiff_t...) when they can @@ -6430,6 +6434,14 @@ static void checkIsValidOpenCLKernelParameter( D.setInvalidType(); return; + case PrivatePtrKernelParam: + // OpenCL v1.2 s6.9.a: + // A kernel function argument cannot be declared as a + // pointer to the private address space. + S.Diag(Param->getLocation(), diag::err_opencl_private_ptr_kernel_param); + D.setInvalidType(); + return; + // OpenCL v1.2 s6.9.k: // Arguments to kernel functions in a program cannot be declared with the // built-in scalar types bool, half, size_t, ptrdiff_t, intptr_t, and @@ -6509,7 +6521,8 @@ static void checkIsValidOpenCLKernelParameter( // Arguments to kernel functions that are declared to be a struct or union // do not allow OpenCL objects to be passed as elements of the struct or // union. - if (ParamType == PtrKernelParam || ParamType == PtrPtrKernelParam) { + if (ParamType == PtrKernelParam || ParamType == PtrPtrKernelParam || + ParamType == PrivatePtrKernelParam) { S.Diag(Param->getLocation(), diag::err_record_with_pointers_kernel_param) << PT->isUnionType() |