Improve error reporting of property and setter/getter

type mimatches.

llvm-svn: 60630
This commit is contained in:
Fariborz Jahanian 2008-12-06 21:48:16 +00:00
parent 8707e322cc
commit ff83998e31
3 changed files with 9 additions and 3 deletions

View File

@ -571,6 +571,8 @@ DIAG(warn_property_attr_mismatch, WARNING,
"property attribute in continuation class does not match the primary class")
DIAG(err_accessor_property_type_mismatch, ERROR,
"type of property %0 does not match type of accessor %1")
DIAG(note_declared_at, NOTE,
"declared at")
DIAG(err_setter_type_void, ERROR,
"type of setter must be void")
DIAG(warn_conflicting_types, WARNING,

View File

@ -933,21 +933,25 @@ Sema::diagnosePropertySetterGetterMismatch(ObjCPropertyDecl *property,
const ObjCMethodDecl *GetterMethod,
const ObjCMethodDecl *SetterMethod) {
if (GetterMethod &&
GetterMethod->getResultType() != property->getType())
GetterMethod->getResultType() != property->getType()) {
Diag(property->getLocation(),
diag::err_accessor_property_type_mismatch)
<< property->getDeclName()
<< GetterMethod->getSelector().getAsIdentifierInfo();
Diag(GetterMethod->getLocation(), diag::note_declared_at);
}
if (SetterMethod) {
if (SetterMethod->getResultType() != Context.VoidTy)
Diag(SetterMethod->getLocation(), diag::err_setter_type_void);
if (SetterMethod->getNumParams() != 1 ||
(SetterMethod->getParamDecl(0)->getType() != property->getType()))
(SetterMethod->getParamDecl(0)->getType() != property->getType())) {
Diag(property->getLocation(),
diag::err_accessor_property_type_mismatch)
<< property->getDeclName()
<< SetterMethod->getSelector().getAsIdentifierInfo();
Diag(SetterMethod->getLocation(), diag::note_declared_at);
}
}
}

View File

@ -1,7 +1,7 @@
// RUN: clang -fsyntax-only -verify %s
@interface A
-(float) x;
-(float) x; // expected-note {{declared at}}
@property int x; // expected-error {{type of property 'x' does not match type of accessor 'x'}}
@end