forked from OSchip/llvm-project
[OpenCL] Fix pipe builtin bugs
Summary: 1. Diag should be output if types are not the same. 2. Should compare using canonical type. 3. Refine the diag to be more clear. Reviewers: yaxunl, Anastasia Subscribers: MatsPetersson, pekka.jaaskelainen, cfe-commits Differential Revision: http://reviews.llvm.org/D17955 llvm-svn: 264825
This commit is contained in:
parent
62f0576c5c
commit
0a1c6c2ee5
|
@ -7776,7 +7776,7 @@ def err_opencl_builtin_pipe_first_arg : Error<
|
|||
def err_opencl_builtin_pipe_arg_num : Error<
|
||||
"invalid number of arguments to function: %0">;
|
||||
def err_opencl_builtin_pipe_invalid_arg : Error<
|
||||
"invalid argument type to function %0 (expecting %1)">;
|
||||
"invalid argument type to function %0 (expecting %1 having %2)">;
|
||||
def err_opencl_builtin_pipe_invalid_access_modifier : Error<
|
||||
"invalid pipe access modifier (expecting %0)">;
|
||||
|
||||
|
|
|
@ -325,10 +325,12 @@ static bool checkOpenCLPipePacketType(Sema &S, CallExpr *Call, unsigned Idx) {
|
|||
const PointerType *ArgTy = ArgIdx->getType()->getAs<PointerType>();
|
||||
// The Idx argument should be a pointer and the type of the pointer and
|
||||
// the type of pipe element should also be the same.
|
||||
if (!ArgTy || S.Context.hasSameType(EltTy, ArgTy->getPointeeType())) {
|
||||
if (!ArgTy ||
|
||||
!S.Context.hasSameType(
|
||||
EltTy, ArgTy->getPointeeType()->getCanonicalTypeInternal())) {
|
||||
S.Diag(Call->getLocStart(), diag::err_opencl_builtin_pipe_invalid_arg)
|
||||
<< Call->getDirectCallee() << S.Context.getPointerType(EltTy)
|
||||
<< ArgIdx->getSourceRange();
|
||||
<< ArgIdx->getType() << ArgIdx->getSourceRange();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -361,7 +363,7 @@ static bool SemaBuiltinRWPipe(Sema &S, CallExpr *Call) {
|
|||
if (!Call->getArg(1)->getType()->isReserveIDT()) {
|
||||
S.Diag(Call->getLocStart(), diag::err_opencl_builtin_pipe_invalid_arg)
|
||||
<< Call->getDirectCallee() << S.Context.OCLReserveIDTy
|
||||
<< Call->getArg(1)->getSourceRange();
|
||||
<< Call->getArg(1)->getType() << Call->getArg(1)->getSourceRange();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -371,7 +373,7 @@ static bool SemaBuiltinRWPipe(Sema &S, CallExpr *Call) {
|
|||
!Arg2->getType()->isUnsignedIntegerType()) {
|
||||
S.Diag(Call->getLocStart(), diag::err_opencl_builtin_pipe_invalid_arg)
|
||||
<< Call->getDirectCallee() << S.Context.UnsignedIntTy
|
||||
<< Arg2->getSourceRange();
|
||||
<< Arg2->getType() << Arg2->getSourceRange();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -405,7 +407,7 @@ static bool SemaBuiltinReserveRWPipe(Sema &S, CallExpr *Call) {
|
|||
!Call->getArg(1)->getType()->isUnsignedIntegerType()) {
|
||||
S.Diag(Call->getLocStart(), diag::err_opencl_builtin_pipe_invalid_arg)
|
||||
<< Call->getDirectCallee() << S.Context.UnsignedIntTy
|
||||
<< Call->getArg(1)->getSourceRange();
|
||||
<< Call->getArg(1)->getType() << Call->getArg(1)->getSourceRange();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -428,7 +430,7 @@ static bool SemaBuiltinCommitRWPipe(Sema &S, CallExpr *Call) {
|
|||
if (!Call->getArg(1)->getType()->isReserveIDT()) {
|
||||
S.Diag(Call->getLocStart(), diag::err_opencl_builtin_pipe_invalid_arg)
|
||||
<< Call->getDirectCallee() << S.Context.OCLReserveIDTy
|
||||
<< Call->getArg(1)->getSourceRange();
|
||||
<< Call->getArg(1)->getType() << Call->getArg(1)->getSourceRange();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -5,22 +5,27 @@ void test1(read_only pipe int p, global int* ptr){
|
|||
reserve_id_t rid;
|
||||
|
||||
// read/write_pipe
|
||||
read_pipe(p, &tmp);
|
||||
read_pipe(p, ptr);
|
||||
read_pipe(tmp, p); // expected-error {{first argument to 'read_pipe' must be a pipe type}}
|
||||
read_pipe(p); // expected-error {{invalid number of arguments to function: 'read_pipe'}}
|
||||
read_pipe(p, tmp, tmp, ptr); // expected-error {{invalid argument type to function 'read_pipe' (expecting 'reserve_id_t')}}
|
||||
read_pipe(p, rid, rid, ptr); // expected-error {{invalid argument type to function 'read_pipe' (expecting 'unsigned int')}}
|
||||
read_pipe(p, tmp); // expected-error {{invalid argument type to function 'read_pipe' (expecting 'int *')}}
|
||||
read_pipe(p, rid, tmp, ptr);
|
||||
read_pipe(p, tmp, tmp, ptr); // expected-error {{invalid argument type to function 'read_pipe' (expecting 'reserve_id_t' having 'int')}}
|
||||
read_pipe(p, rid, rid, ptr); // expected-error {{invalid argument type to function 'read_pipe' (expecting 'unsigned int' having 'reserve_id_t')}}
|
||||
read_pipe(p, tmp); // expected-error {{invalid argument type to function 'read_pipe' (expecting 'int *' having 'int')}}
|
||||
write_pipe(p, ptr); // expected-error {{invalid pipe access modifier (expecting write_only)}}
|
||||
write_pipe(p, rid, tmp, ptr); // expected-error {{invalid pipe access modifier (expecting write_only)}}
|
||||
|
||||
// reserve_read/write_pipe
|
||||
reserve_read_pipe(p, ptr); // expected-error{{invalid argument type to function 'reserve_read_pipe' (expecting 'unsigned int')}}
|
||||
reserve_read_pipe(p, tmp);
|
||||
reserve_read_pipe(p, ptr); // expected-error{{invalid argument type to function 'reserve_read_pipe' (expecting 'unsigned int' having '__global int *')}}
|
||||
work_group_reserve_read_pipe(tmp, tmp); // expected-error{{first argument to 'work_group_reserve_read_pipe' must be a pipe type}}
|
||||
sub_group_reserve_write_pipe(p, tmp); // expected-error{{invalid pipe access modifier (expecting write_only)}}
|
||||
|
||||
// commit_read/write_pipe
|
||||
commit_read_pipe(p, rid);
|
||||
commit_read_pipe(tmp, rid); // expected-error{{first argument to 'commit_read_pipe' must be a pipe type}}
|
||||
work_group_commit_read_pipe(p, tmp); // expected-error{{invalid argument type to function 'work_group_commit_read_pipe' (expecting 'reserve_id_t')}}
|
||||
work_group_commit_read_pipe(p, tmp); // expected-error{{invalid argument type to function 'work_group_commit_read_pipe' (expecting 'reserve_id_t' having 'int')}}
|
||||
sub_group_commit_write_pipe(p, tmp); // expected-error{{invalid pipe access modifier (expecting write_only)}}
|
||||
}
|
||||
|
||||
|
@ -29,22 +34,27 @@ void test2(write_only pipe int p, global int* ptr){
|
|||
reserve_id_t rid;
|
||||
|
||||
// read/write_pipe
|
||||
write_pipe(p, &tmp);
|
||||
write_pipe(p, ptr);
|
||||
write_pipe(tmp, p); // expected-error {{first argument to 'write_pipe' must be a pipe type}}
|
||||
write_pipe(p); // expected-error {{invalid number of arguments to function: 'write_pipe'}}
|
||||
write_pipe(p, tmp, tmp, ptr); // expected-error {{invalid argument type to function 'write_pipe' (expecting 'reserve_id_t')}}
|
||||
write_pipe(p, rid, rid, ptr); // expected-error {{invalid argument type to function 'write_pipe' (expecting 'unsigned int')}}
|
||||
write_pipe(p, tmp); // expected-error {{invalid argument type to function 'write_pipe' (expecting 'int *')}}
|
||||
write_pipe(p, rid, tmp, ptr);
|
||||
write_pipe(p, tmp, tmp, ptr); // expected-error {{invalid argument type to function 'write_pipe' (expecting 'reserve_id_t' having 'int')}}
|
||||
write_pipe(p, rid, rid, ptr); // expected-error {{invalid argument type to function 'write_pipe' (expecting 'unsigned int' having 'reserve_id_t')}}
|
||||
write_pipe(p, tmp); // expected-error {{invalid argument type to function 'write_pipe' (expecting 'int *' having 'int')}}
|
||||
read_pipe(p, ptr); // expected-error {{invalid pipe access modifier (expecting read_only)}}
|
||||
read_pipe(p, rid, tmp, ptr); // expected-error {{invalid pipe access modifier (expecting read_only)}}
|
||||
|
||||
// reserve_read/write_pipe
|
||||
reserve_write_pipe(p, ptr); // expected-error{{invalid argument type to function 'reserve_write_pipe' (expecting 'unsigned int')}}
|
||||
reserve_write_pipe(p, tmp);
|
||||
reserve_write_pipe(p, ptr); // expected-error{{invalid argument type to function 'reserve_write_pipe' (expecting 'unsigned int' having '__global int *')}}
|
||||
work_group_reserve_write_pipe(tmp, tmp); // expected-error{{first argument to 'work_group_reserve_write_pipe' must be a pipe type}}
|
||||
sub_group_reserve_read_pipe(p, tmp); // expected-error{{invalid pipe access modifier (expecting read_only)}}
|
||||
|
||||
// commit_read/write_pipe
|
||||
commit_write_pipe(p, rid);
|
||||
commit_write_pipe(tmp, rid); // expected-error{{first argument to 'commit_write_pipe' must be a pipe type}}
|
||||
work_group_commit_write_pipe(p, tmp); // expected-error{{invalid argument type to function 'work_group_commit_write_pipe' (expecting 'reserve_id_t')}}
|
||||
work_group_commit_write_pipe(p, tmp); // expected-error{{invalid argument type to function 'work_group_commit_write_pipe' (expecting 'reserve_id_t' having 'int')}}
|
||||
sub_group_commit_read_pipe(p, tmp); // expected-error{{invalid pipe access modifier (expecting read_only)}}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue