On Oct 7, 2011, at 1:16 PM, Douglas Gregor wrote: > > 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. Sure. In r141415.
- Fariborz > > - Doug > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
