[cfe-commits] r60430 - in /cfe/trunk: include/clang/Basic/DiagnosticKinds.def lib/Sema/Sema.h lib/Sema/SemaDeclObjC.cpp
Fariborz Jahanian
fjahanian at apple.com
Tue Dec 2 10:39:49 PST 2008
Author: fjahanian
Date: Tue Dec 2 12:39:49 2008
New Revision: 60430
URL: http://llvm.org/viewvc/llvm-project?rev=60430&view=rev
Log:
More type-checking of setter/getter methods. This is still
work in prgress.
Modified:
cfe/trunk/include/clang/Basic/DiagnosticKinds.def
cfe/trunk/lib/Sema/Sema.h
cfe/trunk/lib/Sema/SemaDeclObjC.cpp
Modified: cfe/trunk/include/clang/Basic/DiagnosticKinds.def
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticKinds.def?rev=60430&r1=60429&r2=60430&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticKinds.def (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticKinds.def Tue Dec 2 12:39:49 2008
@@ -569,6 +569,10 @@
"use contination class to override 'readonly' property with 'readwrite'")
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(err_setter_type_void, ERROR,
+ "type of setter must be void")
/// C++ parser diagnostics
DIAG(err_expected_unqualified_id, ERROR,
Modified: cfe/trunk/lib/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.h?rev=60430&r1=60429&r2=60430&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/Sema.h (original)
+++ cfe/trunk/lib/Sema/Sema.h Tue Dec 2 12:39:49 2008
@@ -1032,6 +1032,9 @@
void CheckObjCPropertyAttributes(QualType PropertyTy,
SourceLocation Loc,
unsigned &Attributes);
+ void diagnosePropertySetterGetterMismatch(ObjCPropertyDecl *property,
+ const ObjCMethodDecl *GetterMethod,
+ const ObjCMethodDecl *SetterMethod);
void DiagnosePropertyMismatch(ObjCPropertyDecl *Property,
ObjCPropertyDecl *SuperProperty,
const IdentifierInfo *Name);
Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=60430&r1=60429&r2=60430&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Tue Dec 2 12:39:49 2008
@@ -855,6 +855,33 @@
}
}
+/// diagnosePropertySetterGetterMismatch - Make sure that use-defined
+/// setter/getter methods have the property type and issue diagnostics
+/// if they don't.
+///
+void
+Sema::diagnosePropertySetterGetterMismatch(ObjCPropertyDecl *property,
+ const ObjCMethodDecl *GetterMethod,
+ const ObjCMethodDecl *SetterMethod) {
+ if (GetterMethod &&
+ GetterMethod->getResultType() != property->getType())
+ Diag(property->getLocation(),
+ diag::err_accessor_property_type_mismatch)
+ << property->getDeclName()
+ << GetterMethod->getSelector().getAsIdentifierInfo();
+
+ if (SetterMethod) {
+ if (SetterMethod->getResultType() != Context.VoidPtrTy)
+ Diag(SetterMethod->getLocation(), diag::err_setter_type_void);
+ if (SetterMethod->getNumParams() != 1 ||
+ (SetterMethod->getParamDecl(0)->getType() != property->getType()))
+ Diag(property->getLocation(),
+ diag::err_accessor_property_type_mismatch)
+ << property->getDeclName()
+ << SetterMethod->getSelector().getAsIdentifierInfo();
+ }
+}
+
// Note: For class/category implemenations, allMethods/allProperties is
// always null.
void Sema::ActOnAtEnd(SourceLocation AtEndLoc, DeclTy *classDecl,
@@ -940,15 +967,21 @@
ComparePropertiesInBaseAndSuper(I);
MergeProtocolPropertiesIntoClass(I, I);
for (ObjCInterfaceDecl::classprop_iterator i = I->classprop_begin(),
- e = I->classprop_end(); i != e; ++i)
+ e = I->classprop_end(); i != e; ++i) {
+ diagnosePropertySetterGetterMismatch((*i), InsMap[(*i)->getGetterName()],
+ InsMap[(*i)->getSetterName()]);
I->addPropertyMethods(Context, *i, insMethods, InsMap);
+ }
I->addMethods(&insMethods[0], insMethods.size(),
&clsMethods[0], clsMethods.size(), AtEndLoc);
} else if (ObjCProtocolDecl *P = dyn_cast<ObjCProtocolDecl>(ClassDecl)) {
for (ObjCProtocolDecl::classprop_iterator i = P->classprop_begin(),
- e = P->classprop_end(); i != e; ++i)
+ e = P->classprop_end(); i != e; ++i) {
+ diagnosePropertySetterGetterMismatch((*i), InsMap[(*i)->getGetterName()],
+ InsMap[(*i)->getSetterName()]);
P->addPropertyMethods(Context, *i, insMethods, InsMap);
+ }
P->addMethods(&insMethods[0], insMethods.size(),
&clsMethods[0], clsMethods.size(), AtEndLoc);
}
@@ -958,8 +991,11 @@
// FIXME: If we merge properties into class we should probably
// merge them into category as well?
for (ObjCCategoryDecl::classprop_iterator i = C->classprop_begin(),
- e = C->classprop_end(); i != e; ++i)
+ e = C->classprop_end(); i != e; ++i) {
+ diagnosePropertySetterGetterMismatch((*i), InsMap[(*i)->getGetterName()],
+ InsMap[(*i)->getSetterName()]);
C->addPropertyMethods(Context, *i, insMethods, InsMap);
+ }
C->addMethods(&insMethods[0], insMethods.size(),
&clsMethods[0], clsMethods.size(), AtEndLoc);
}
More information about the cfe-commits
mailing list