forked from OSchip/llvm-project
Improve the diagnostic in ARC mode when a conditional with an Objective-C type and void* is used. <rdar://problem/10486347>.
llvm-svn: 151416
This commit is contained in:
parent
60f7a8e710
commit
8a78a58188
|
@ -3622,6 +3622,8 @@ def ext_typecheck_comparison_of_distinct_pointers : ExtWarn<
|
|||
"comparison of distinct pointer types (%0 and %1)">;
|
||||
def ext_typecheck_cond_incompatible_operands : ExtWarn<
|
||||
"incompatible operand types (%0 and %1)">;
|
||||
def err_cond_voidptr_arc : Error <
|
||||
"operands to conditional of types %0 and %1 are incompatible in ARC mode">;
|
||||
def err_typecheck_comparison_of_distinct_pointers : Error<
|
||||
"comparison of distinct pointer types (%0 and %1)">;
|
||||
def ext_typecheck_comparison_of_distinct_pointers_nonstandard : ExtWarn<
|
||||
|
|
|
@ -4728,6 +4728,14 @@ QualType Sema::FindCompositeObjCPointerType(ExprResult &LHS, ExprResult &RHS,
|
|||
}
|
||||
// Check Objective-C object pointer types and 'void *'
|
||||
if (LHSTy->isVoidPointerType() && RHSTy->isObjCObjectPointerType()) {
|
||||
if (getLangOptions().ObjCAutoRefCount) {
|
||||
// ARC forbids the implicit conversion of object pointers to 'void *',
|
||||
// so these types are not compatible.
|
||||
Diag(QuestionLoc, diag::err_cond_voidptr_arc) << LHSTy << RHSTy
|
||||
<< LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
|
||||
LHS = RHS = true;
|
||||
return QualType();
|
||||
}
|
||||
QualType lhptee = LHSTy->getAs<PointerType>()->getPointeeType();
|
||||
QualType rhptee = RHSTy->getAs<ObjCObjectPointerType>()->getPointeeType();
|
||||
QualType destPointee
|
||||
|
@ -4740,6 +4748,14 @@ QualType Sema::FindCompositeObjCPointerType(ExprResult &LHS, ExprResult &RHS,
|
|||
return destType;
|
||||
}
|
||||
if (LHSTy->isObjCObjectPointerType() && RHSTy->isVoidPointerType()) {
|
||||
if (getLangOptions().ObjCAutoRefCount) {
|
||||
// ARC forbids the implicit conversion of object pointers to 'void *',
|
||||
// so these types are not compatible.
|
||||
Diag(QuestionLoc, diag::err_cond_voidptr_arc) << LHSTy << RHSTy
|
||||
<< LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
|
||||
LHS = RHS = true;
|
||||
return QualType();
|
||||
}
|
||||
QualType lhptee = LHSTy->getAs<ObjCObjectPointerType>()->getPointeeType();
|
||||
QualType rhptee = RHSTy->getAs<PointerType>()->getPointeeType();
|
||||
QualType destPointee
|
||||
|
|
|
@ -90,3 +90,9 @@ void ownership_transfer_in_cast(void *vp, Block *pblk) {
|
|||
(void)(Block)&lv; // expected-error {{cast of an indirect pointer to an Objective-C pointer to 'Block'}}
|
||||
(void)(Block*)lv; // expected-error {{cast of an Objective-C pointer to '__strong Block *'}}
|
||||
}
|
||||
|
||||
// <rdar://problem/10486347>
|
||||
void conversion_in_conditional(id a, void* b) {
|
||||
id c = 1 ? a : b; // expected-error {{operands to conditional of types 'id' and 'void *' are incompatible in ARC mode}}
|
||||
id d = 1 ? b : a; // expected-error {{operands to conditional of types 'void *' and 'id' are incompatible in ARC mode}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue