[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

Douglas Gregor dgregor at apple.com
Fri Oct 7 13:16:15 PDT 2011


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.

	- Doug




More information about the cfe-commits mailing list