forked from OSchip/llvm-project
[OpenCL] Add missing OpenCL LangOpts in address space compatibility checks
and test checking broken (due to CL specific diagnostics) C functionality M test/Sema/address_spaces.c M lib/Sema/SemaExpr.cpp llvm-svn: 248902
This commit is contained in:
parent
b926d01d2a
commit
e6e082348d
|
@ -7754,7 +7754,7 @@ static bool checkArithmeticBinOpPointerOperands(Sema &S, SourceLocation Loc,
|
|||
if (isRHSPointer) RHSPointeeTy = RHSExpr->getType()->getPointeeType();
|
||||
|
||||
// if both are pointers check if operation is valid wrt address spaces
|
||||
if (isLHSPointer && isRHSPointer) {
|
||||
if (S.getLangOpts().OpenCL && isLHSPointer && isRHSPointer) {
|
||||
const PointerType *lhsPtr = LHSExpr->getType()->getAs<PointerType>();
|
||||
const PointerType *rhsPtr = RHSExpr->getType()->getAs<PointerType>();
|
||||
if (!lhsPtr->isAddressSpaceOverlapping(*rhsPtr)) {
|
||||
|
@ -8783,12 +8783,14 @@ QualType Sema::CheckCompareOperands(ExprResult &LHS, ExprResult &RHS,
|
|||
diagnoseDistinctPointerComparison(*this, Loc, LHS, RHS, /*isError*/false);
|
||||
}
|
||||
if (LCanPointeeTy != RCanPointeeTy) {
|
||||
const PointerType *lhsPtr = LHSType->getAs<PointerType>();
|
||||
if (!lhsPtr->isAddressSpaceOverlapping(*RHSType->getAs<PointerType>())) {
|
||||
Diag(Loc,
|
||||
diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
|
||||
<< LHSType << RHSType << 0 /* comparison */
|
||||
<< LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
|
||||
if (getLangOpts().OpenCL) {
|
||||
const PointerType *LHSPtr = LHSType->getAs<PointerType>();
|
||||
if (!LHSPtr->isAddressSpaceOverlapping(*RHSType->getAs<PointerType>())) {
|
||||
Diag(Loc,
|
||||
diag::err_typecheck_op_on_nonoverlapping_address_space_pointers)
|
||||
<< LHSType << RHSType << 0 /* comparison */
|
||||
<< LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
|
||||
}
|
||||
}
|
||||
unsigned AddrSpaceL = LCanPointeeTy.getAddressSpace();
|
||||
unsigned AddrSpaceR = RCanPointeeTy.getAddressSpace();
|
||||
|
|
|
@ -67,3 +67,8 @@ void access_as_field()
|
|||
|
||||
typedef int PR4997 __attribute__((address_space(Foobar))); // expected-error {{use of undeclared identifier 'Foobar'}}
|
||||
__attribute__((address_space("12"))) int *i; // expected-error {{'address_space' attribute requires an integer constant}}
|
||||
|
||||
// Clang extension doesn't forbid operations on pointers to different address spaces.
|
||||
char* cmp(_AS1 char *x, _AS2 char *y) {
|
||||
return x < y ? x : y; // expected-warning {{pointer type mismatch ('__attribute__((address_space(1))) char *' and '__attribute__((address_space(2))) char *')}}
|
||||
}
|
Loading…
Reference in New Issue