[cfe-commits] r141302 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaObjCProperty.cpp test/SemaObjCXX/property-reference.mm test/SemaObjCXX/property-synthesis-error.mm
jahanian
fjahanian at apple.com
Fri Oct 7 14:10:41 PDT 2011
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;
>> +};
>> +
>> + at interface MyDocument
>> +{
>> + at private
>> + TCPPObject _cppObject;
>> + TCPPObject _ncppObject;
>> +}
>> + at property (assign, readwrite) const TCPPObject& cppObject;
>> + at property (assign, readwrite, nonatomic) const TCPPObject& ncppObject;
>> + at end
>> +
>> + at implementation MyDocument
>> +
>> + at synthesize cppObject = _cppObject; // expected-warning {{atomic property of type 'const TCPPObject &' synthesizing setter using non-trivial assignmentoperator}}
>> + at synthesize ncppObject = _ncppObject;
>> +
>> + at 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
>
More information about the cfe-commits
mailing list