[cfe-commits] r124609 - in /cfe/trunk: include/clang/Basic/DiagnosticGroups.td include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaObjCProperty.cpp test/SemaObjC/custom-atomic-property.m
jahanian
fjahanian at apple.com
Mon Jan 31 13:49:32 PST 2011
On Jan 31, 2011, at 1:34 PM, Argyrios Kyrtzidis wrote:
> Author: akirtzidis
> Date: Mon Jan 31 15:34:11 2011
> New Revision: 124609
>
> URL: http://llvm.org/viewvc/llvm-project?rev=124609&view=rev
> Log:
> Add -Wcustom-atomic-properties which warns if an atomic-by-default property has custom getter or setter.
>
> The rationale is that it is highly likely that the user's getter/setter isn't atomically implemented. Off by default.
> Addresses rdar://8782645.
>
> -Wcustom-atomic-properties and -Wimplicit-atomic-properties are under the -Watomic-properties group.
>
> Added:
> cfe/trunk/test/SemaObjC/custom-atomic-property.m
> Modified:
> cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> cfe/trunk/lib/Sema/SemaObjCProperty.cpp
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=124609&r1=124608&r2=124609&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Mon Jan 31 15:34:11 2011
> @@ -151,6 +151,9 @@
> def Reorder : DiagGroup<"reorder">;
> def UndeclaredSelector : DiagGroup<"undeclared-selector">;
> def ImplicitAtomic : DiagGroup<"implicit-atomic-properties">;
> +def CustomAtomic : DiagGroup<"custom-atomic-properties">;
> +def AtomicProperties : DiagGroup<"atomic-properties",
> + [ImplicitAtomic, CustomAtomic]>;
> def Selector : DiagGroup<"selector">;
> def NonfragileAbi2 : DiagGroup<"nonfragile-abi2">;
> def Protocol : DiagGroup<"protocol">;
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=124609&r1=124608&r2=124609&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Mon Jan 31 15:34:11 2011
> @@ -386,6 +386,10 @@
> def warn_atomic_property_rule : Warning<
> "writable atomic property %0 cannot pair a synthesized setter/getter "
> "with a user defined setter/getter">;
> +def warn_default_atomic_custom_getter_setter : Warning<
> + "atomic by default property %0 has a user defined setter/getter "
> + "(property should be marked 'atomic' if this is intended)">,
> + InGroup<CustomAtomic>, DefaultIgnore;
> def err_use_continuation_class : Error<
> "illegal redeclaration of property in continuation class %0"
> " (attribute must be 'readwrite', while its primary must be 'readonly')">;
>
> Modified: cfe/trunk/lib/Sema/SemaObjCProperty.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaObjCProperty.cpp?rev=124609&r1=124608&r2=124609&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaObjCProperty.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaObjCProperty.cpp Mon Jan 31 15:34:11 2011
> @@ -1081,7 +1081,32 @@
> E = IDecl->prop_end();
> I != E; ++I) {
> ObjCPropertyDecl *Property = (*I);
> + ObjCMethodDecl *GetterMethod = 0;
> + ObjCMethodDecl *SetterMethod = 0;
> + bool LookedUpGetterSetter = false;
> +
> unsigned Attributes = Property->getPropertyAttributes();
> + unsigned AttributesAsWrittern = Property->getPropertyAttributesAsWritten();
> +
> + if (!(AttributesAsWrittern & ObjCPropertyDecl::OBJC_PR_atomic) &&
> + !(AttributesAsWrittern & ObjCPropertyDecl::OBJC_PR_nonatomic)) {
> + GetterMethod = IMPDecl->getInstanceMethod(Property->getGetterName());
> + SetterMethod = IMPDecl->getInstanceMethod(Property->getSetterName());
> + LookedUpGetterSetter = true;
> + if (GetterMethod) {
> + Diag(GetterMethod->getLocation(),
> + diag::warn_default_atomic_custom_getter_setter)
> + << Property->getIdentifier();
> + Diag(Property->getLocation(), diag::note_property_declare);
> + }
> + if (SetterMethod) {
> + Diag(SetterMethod->getLocation(),
> + diag::warn_default_atomic_custom_getter_setter)
> + << Property->getIdentifier();
> + Diag(Property->getLocation(), diag::note_property_declare);
> + }
> + }
> +
> // We only care about readwrite atomic property.
> if ((Attributes & ObjCPropertyDecl::OBJC_PR_nonatomic) ||
> !(Attributes & ObjCPropertyDecl::OBJC_PR_readwrite))
> @@ -1090,10 +1115,11 @@
> = IMPDecl->FindPropertyImplDecl(Property->getIdentifier())) {
> if (PIDecl->getPropertyImplementation() == ObjCPropertyImplDecl::Dynamic)
> continue;
Why don't you warn if property is dynamic? They still have custom setter/getter.
> - ObjCMethodDecl *GetterMethod =
> - IMPDecl->getInstanceMethod(Property->getGetterName());
> - ObjCMethodDecl *SetterMethod =
> - IMPDecl->getInstanceMethod(Property->getSetterName());
> + if (!LookedUpGetterSetter) {
> + GetterMethod = IMPDecl->getInstanceMethod(Property->getGetterName());
> + SetterMethod = IMPDecl->getInstanceMethod(Property->getSetterName());
> + LookedUpGetterSetter = true;
> + }
> if ((GetterMethod && !SetterMethod) || (!GetterMethod && SetterMethod)) {
> SourceLocation MethodLoc =
> (GetterMethod ? GetterMethod->getLocation()
I think you don't want to warn if getter/setter are synthesized. Does this handle it?
>
> Added: cfe/trunk/test/SemaObjC/custom-atomic-property.m
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/custom-atomic-property.m?rev=124609&view=auto
> ==============================================================================
> --- cfe/trunk/test/SemaObjC/custom-atomic-property.m (added)
> +++ cfe/trunk/test/SemaObjC/custom-atomic-property.m Mon Jan 31 15:34:11 2011
> @@ -0,0 +1,10 @@
> +// RUN: %clang_cc1 -fsyntax-only -Wcustom-atomic-properties -verify %s
> +
> + at interface Foo
> + at property (assign) Foo *myProp; // expected-note {{property declared here}} expected-note {{property declared here}}
> + at end
> +
> + at implementation Foo
> + -(Foo*)myProp {return 0;} // expected-warning {{atomic by default property 'myProp' has a user defined setter/getter (property should be marked 'atomic' if this is intended)}}
> + -(void)setMyProp:(Foo*)e {} // expected-warning {{atomic by default property 'myProp' has a user defined setter/getter (property should be marked 'atomic' if this is intended)}}
It is better for diagnostic to say setter for setters and getter for getters, instead of setter/getter for both.
- Fariborz
> + at end
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list