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

Reply via email to