forked from OSchip/llvm-project
tweak some pointer sema checking stuff (which was added to implement PR4175) to
avoid emitting a warning on "someptr > 0". This is obviously questionable (they could use != instead) but is reasonable, and the warning "ordered comparison between pointer and integer" didn't make a ton of sense because 0 is a valid null pointer constant. Just silence the warning in this case, it is unlikely to indicate a bug. llvm-svn: 79743
This commit is contained in:
parent
0939595711
commit
f8344dbfdd
|
@ -4350,31 +4350,33 @@ QualType Sema::CheckCompareOperands(Expr *&lex, Expr *&rex, SourceLocation Loc,
|
|||
return ResultTy;
|
||||
}
|
||||
if (lType->isObjCObjectPointerType() && rType->isObjCObjectPointerType()) {
|
||||
if (!Context.areComparableObjCPointerTypes(lType, rType)) {
|
||||
if (!Context.areComparableObjCPointerTypes(lType, rType))
|
||||
Diag(Loc, diag::ext_typecheck_comparison_of_distinct_pointers)
|
||||
<< lType << rType << lex->getSourceRange() << rex->getSourceRange();
|
||||
}
|
||||
ImpCastExprToType(rex, lType);
|
||||
return ResultTy;
|
||||
}
|
||||
}
|
||||
if (lType->isAnyPointerType() && rType->isIntegerType()) {
|
||||
if (isRelational)
|
||||
Diag(Loc, diag::ext_typecheck_ordered_comparison_of_pointer_integer)
|
||||
<< lType << rType << lex->getSourceRange() << rex->getSourceRange();
|
||||
else if (!RHSIsNull)
|
||||
Diag(Loc, diag::ext_typecheck_comparison_of_pointer_integer)
|
||||
if (!RHSIsNull) {
|
||||
unsigned DiagID = isRelational
|
||||
? diag::ext_typecheck_ordered_comparison_of_pointer_integer
|
||||
: diag::ext_typecheck_comparison_of_pointer_integer;
|
||||
Diag(Loc, DiagID)
|
||||
<< lType << rType << lex->getSourceRange() << rex->getSourceRange();
|
||||
}
|
||||
ImpCastExprToType(rex, lType); // promote the integer to pointer
|
||||
return ResultTy;
|
||||
}
|
||||
if (lType->isIntegerType() && rType->isAnyPointerType()) {
|
||||
if (isRelational)
|
||||
Diag(Loc, diag::ext_typecheck_ordered_comparison_of_pointer_integer)
|
||||
<< lType << rType << lex->getSourceRange() << rex->getSourceRange();
|
||||
else if (!LHSIsNull)
|
||||
Diag(Loc, diag::ext_typecheck_comparison_of_pointer_integer)
|
||||
if (!LHSIsNull) {
|
||||
unsigned DiagID = isRelational
|
||||
? diag::ext_typecheck_ordered_comparison_of_pointer_integer
|
||||
: diag::ext_typecheck_comparison_of_pointer_integer;
|
||||
|
||||
Diag(Loc, DiagID)
|
||||
<< lType << rType << lex->getSourceRange() << rex->getSourceRange();
|
||||
}
|
||||
ImpCastExprToType(lex, rType); // promote the integer to pointer
|
||||
return ResultTy;
|
||||
}
|
||||
|
|
|
@ -8,8 +8,7 @@ int test(char *C) { // nothing here should warn.
|
|||
return C != 0;
|
||||
}
|
||||
|
||||
int equal(char *a, const char *b)
|
||||
{
|
||||
int equal(char *a, const char *b) {
|
||||
return a == b;
|
||||
}
|
||||
|
||||
|
@ -18,21 +17,18 @@ int arrays(char (*a)[5], char(*b)[10], char(*c)[5]) {
|
|||
return a == b; // expected-warning {{comparison of distinct pointer types}}
|
||||
}
|
||||
|
||||
int pointers(int *a)
|
||||
{
|
||||
return a > 0; // expected-warning {{ordered comparison between pointer and integer}}
|
||||
int pointers(int *a) {
|
||||
return a > 0; // no warning. rdar://7163039
|
||||
return a > (void *)0; // expected-warning {{comparison of distinct pointer types}}
|
||||
}
|
||||
|
||||
int function_pointers(int (*a)(int), int (*b)(int))
|
||||
{
|
||||
int function_pointers(int (*a)(int), int (*b)(int)) {
|
||||
return a > b; // expected-warning {{ordered comparison of function pointers}}
|
||||
return function_pointers > function_pointers; // expected-warning {{ordered comparison of function pointers}}
|
||||
return a == (void *) 0;
|
||||
return a == (void *) 1; // expected-warning {{comparison of distinct pointer types}}
|
||||
}
|
||||
|
||||
int void_pointers(void *foo)
|
||||
{
|
||||
int void_pointers(void *foo) {
|
||||
return foo == NULL;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue