diff options
| author | Egor Churaev <egor.churaev@gmail.com> | 2016-12-13 14:07:23 +0000 |
|---|---|---|
| committer | Egor Churaev <egor.churaev@gmail.com> | 2016-12-13 14:07:23 +0000 |
| commit | de82a65053defb2c9da800f727b432b6013d0c48 (patch) | |
| tree | 0623a1a3a524976aadfb2ad3d91b6998761fb882 /clang/lib/Sema/SemaDecl.cpp | |
| parent | 24939d479e4a9bc76c4bfa85053067a7e426c287 (diff) | |
| download | bcm5719-llvm-de82a65053defb2c9da800f727b432b6013d0c48.tar.gz bcm5719-llvm-de82a65053defb2c9da800f727b432b6013d0c48.zip | |
[OpenCL] Improve address space diagnostics.
Reviewers: Anastasia
Subscribers: bader, yaxunl, cfe-commits
Differential Revision: https://reviews.llvm.org/D27671
llvm-svn: 289536
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index ad6d6ef2ac2..15c664a062e 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -7586,7 +7586,7 @@ enum OpenCLParamType { ValidKernelParam, PtrPtrKernelParam, PtrKernelParam, - PrivatePtrKernelParam, + InvalidAddrSpacePtrKernelParam, InvalidKernelParam, RecordKernelParam }; @@ -7596,8 +7596,10 @@ static OpenCLParamType getOpenCLKernelParameterType(Sema &S, QualType PT) { QualType PointeeType = PT->getPointeeType(); if (PointeeType->isPointerType()) return PtrPtrKernelParam; - return PointeeType.getAddressSpace() == 0 ? PrivatePtrKernelParam - : PtrKernelParam; + if (PointeeType.getAddressSpace() == LangAS::opencl_generic || + PointeeType.getAddressSpace() == 0) + return InvalidAddrSpacePtrKernelParam; + return PtrKernelParam; } // TODO: Forbid the other integer types (size_t, ptrdiff_t...) when they can @@ -7645,11 +7647,12 @@ 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); + case InvalidAddrSpacePtrKernelParam: + // OpenCL v1.0 s6.5: + // __kernel function arguments declared to be a pointer of a type can point + // to one of the following address spaces only : __global, __local or + // __constant. + S.Diag(Param->getLocation(), diag::err_kernel_arg_address_space); D.setInvalidType(); return; @@ -7736,7 +7739,7 @@ static void checkIsValidOpenCLKernelParameter( // do not allow OpenCL objects to be passed as elements of the struct or // union. if (ParamType == PtrKernelParam || ParamType == PtrPtrKernelParam || - ParamType == PrivatePtrKernelParam) { + ParamType == InvalidAddrSpacePtrKernelParam) { S.Diag(Param->getLocation(), diag::err_record_with_pointers_kernel_param) << PT->isUnionType() |

