r192819 - ObjectiveC++: support for passing C++11 style initialized temporaries to

Fariborz Jahanian fjahanian at apple.com
Wed Oct 16 10:51:43 PDT 2013


Author: fjahanian
Date: Wed Oct 16 12:51:43 2013
New Revision: 192819

URL: http://llvm.org/viewvc/llvm-project?rev=192819&view=rev
Log:
ObjectiveC++: support for passing C++11 style initialized temporaries to 
objc++ properties using property-dot syntax.
// rdar://14654207

Modified:
    cfe/trunk/lib/Sema/SemaPseudoObject.cpp
    cfe/trunk/test/SemaObjCXX/properties.mm

Modified: cfe/trunk/lib/Sema/SemaPseudoObject.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaPseudoObject.cpp?rev=192819&r1=192818&r2=192819&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaPseudoObject.cpp (original)
+++ cfe/trunk/lib/Sema/SemaPseudoObject.cpp Wed Oct 16 12:51:43 2013
@@ -730,6 +730,16 @@ ExprResult ObjCPropertyOpBuilder::buildS
       op = opResult.take();
       assert(op && "successful assignment left argument invalid?");
     }
+    else if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(op)) {
+      Expr *Initializer = OVE->getSourceExpr();
+      // passing C++11 style initialized temporaries to objc++ properties
+      // requires special treatment by removing OpaqueValueExpr so type
+      // conversion takes place and adding the OpaqueValueExpr later on.
+      if (isa<InitListExpr>(Initializer) &&
+          Initializer->getType()->isVoidType()) {
+        op = Initializer;
+      }
+    }
   }
 
   // Arguments.

Modified: cfe/trunk/test/SemaObjCXX/properties.mm
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/properties.mm?rev=192819&r1=192818&r2=192819&view=diff
==============================================================================
--- cfe/trunk/test/SemaObjCXX/properties.mm (original)
+++ cfe/trunk/test/SemaObjCXX/properties.mm Wed Oct 16 12:51:43 2013
@@ -172,3 +172,34 @@ namespace test10 {
 @implementation PropertyOfItself
 @synthesize x;
 @end
+
+// rdar://14654207
+struct CGSize {
+  double width;
+  double height;
+};
+typedef struct CGSize CGSize;
+
+struct CGRect {
+  CGSize origin;
+  CGSize size;
+};
+typedef struct CGRect CGRect;
+
+typedef CGRect NSRect;
+void HappySetFrame(NSRect frame) {}
+
+__attribute__((objc_root_class))
+ at interface NSObject 
+ at property CGRect frame;
+ at end
+
+ at implementation NSObject
+- (void) nothing
+{
+	HappySetFrame({{0,0}, {13,14}});
+	[self setFrame: {{0,0}, {13,14}}];
+        self.frame = {{0,0}, {13,14}};
+        self.frame = (CGRect){{3,5}, {13,14}};
+}
+ at end





More information about the cfe-commits mailing list