On Oct 6, 2011, at 11:38 AM, Fariborz Jahanian wrote: > Author: fjahanian > Date: Thu Oct 6 13:38:18 2011 > New Revision: 141302 > > URL: http://llvm.org/viewvc/llvm-project?rev=141302&view=rev > Log: > objc++: For atomic properties of c++ class objec typet, appropriate > operator= is called. Issue a warning for non-trivial case until > runtime support is provided. // rdar://6137845 > > Modified: > cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > cfe/trunk/lib/Sema/SemaObjCProperty.cpp > cfe/trunk/test/SemaObjCXX/property-reference.mm > cfe/trunk/test/SemaObjCXX/property-synthesis-error.mm > > Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=141302&r1=141301&r2=141302&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Oct 6 13:38:18 > 2011 > @@ -501,6 +501,9 @@ > "writable atomic property %0 cannot pair a synthesized setter/getter " > "with a user defined setter/getter">, > InGroup<DiagGroup<"atomic-property-with-user-defined-accessor">>; > +def warn_atomic_property_nontrivial_assign_op : Warning< > + "atomic property of type %0 synthesizing setter using non-trivial > assignment" > + "operator">, InGroup<DiagGroup<"objc-property-atomic-setter-synthesis">>;\
Missing a space after "assignment". > def warn_ownin_getter_rule : Warning< > "property's synthesized getter follows Cocoa naming" > " convention for returning 'owned' objects">, > > Modified: cfe/trunk/lib/Sema/SemaObjCProperty.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaObjCProperty.cpp?rev=141302&r1=141301&r2=141302&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaObjCProperty.cpp (original) > +++ cfe/trunk/lib/Sema/SemaObjCProperty.cpp Thu Oct 6 13:38:18 2011 > @@ -16,6 +16,7 @@ > #include "clang/Sema/Initialization.h" > #include "clang/AST/DeclObjC.h" > #include "clang/AST/ExprObjC.h" > +#include "clang/AST/ExprCXX.h" > #include "llvm/ADT/DenseSet.h" > > using namespace clang; > @@ -800,6 +801,20 @@ > VK_LValue, SourceLocation()); > ExprResult Res = BuildBinOp(S, lhs->getLocEnd(), > BO_Assign, lhs, rhs); > + if (property->getPropertyAttributes() & > + ObjCPropertyDecl::OBJC_PR_atomic) { > + Expr *callExpr = Res.takeAs<Expr>(); > + if (const CXXOperatorCallExpr *CXXCE = > + dyn_cast_or_null<CXXOperatorCallExpr>(callExpr)) { > + const CallExpr *CE = cast<CallExpr>(CXXCE); This cast to CallExpr is unnecessary, since the CXXOperatorCallExpr CXXCE is already also a CallExpr. > Modified: cfe/trunk/test/SemaObjCXX/property-synthesis-error.mm > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/property-synthesis-error.mm?rev=141302&r1=141301&r2=141302&view=diff > ============================================================================== > --- cfe/trunk/test/SemaObjCXX/property-synthesis-error.mm (original) > +++ cfe/trunk/test/SemaObjCXX/property-synthesis-error.mm Thu Oct 6 13:38:18 > 2011 > @@ -30,3 +30,32 @@ > { > return 0; > } > + > +// rdar://6137845 > +class TCPPObject > +{ > +public: > + TCPPObject(const TCPPObject& inObj); > + TCPPObject(); > + ~TCPPObject(); > + TCPPObject& operator=(const TCPPObject& inObj); > +private: > + void* fData; > +}; > + > +@interface MyDocument > +{ > +@private > + TCPPObject _cppObject; > + TCPPObject _ncppObject; > +} > +@property (assign, readwrite) const TCPPObject& cppObject; > +@property (assign, readwrite, nonatomic) const TCPPObject& ncppObject; > +@end > + > +@implementation MyDocument > + > +@synthesize cppObject = _cppObject; // expected-warning {{atomic property of > type 'const TCPPObject &' synthesizing setter using non-trivial > assignmentoperator}} > +@synthesize ncppObject = _ncppObject; > + > +@end It would be good to write a test verifying that we *don't* warn when synthesizing an atomic property for a class with a trivial copy assignment operator. - Doug _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
