]> granicus.if.org Git - clang/commitdiff
objective-C modern translation: Fix another random translation bug
authorFariborz Jahanian <fjahanian@apple.com>
Fri, 8 Feb 2013 18:57:50 +0000 (18:57 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Fri, 8 Feb 2013 18:57:50 +0000 (18:57 +0000)
involving property getter expressions on rhs of property setter.
// rdar://13138459

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174729 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Rewrite/Frontend/RewriteModernObjC.cpp
test/Rewriter/objc-modern-property-bitfield.m [new file with mode: 0644]

index 4803bfa3971eb2f246847a1a0d086030e4271e49..ba5d669f0835900e8fa98ad2fce06befcae5c5e4 100644 (file)
@@ -5660,6 +5660,8 @@ Stmt *RewriteModernObjC::RewriteFunctionBodyOrGlobalInitializer(Stmt *S) {
   } else if (ObjCIvarRefExpr *IvarRefExpr = dyn_cast<ObjCIvarRefExpr>(S)) {
     return RewriteObjCIvarRefExpr(IvarRefExpr);
   }
+  else if (isa<OpaqueValueExpr>(S))
+    S = cast<OpaqueValueExpr>(S)->getSourceExpr();
 
   SourceRange OrigStmtRange = S->getSourceRange();
 
diff --git a/test/Rewriter/objc-modern-property-bitfield.m b/test/Rewriter/objc-modern-property-bitfield.m
new file mode 100644 (file)
index 0000000..583fa37
--- /dev/null
@@ -0,0 +1,43 @@
+// RUN: %clang_cc1 -x objective-c++ -Wno-return-type -fms-extensions -rewrite-objc %s -o %t-modern-rw.cpp
+// RUN: %clang_cc1 -fsyntax-only -Wno-address-of-temporary -D"Class=void*" -D"id=void*" -D"SEL=void*" -D"__declspec(X)=" %t-modern-rw.cpp
+// rdar://13138459
+
+void *sel_registerName(const char *);
+extern void abort();
+
+@interface NSObject 
++ alloc;
+- init;
+@end
+
+typedef unsigned char BOOL;
+
+@interface Foo : NSObject {
+
+   BOOL  _field1 : 5;
+   BOOL  _field2    : 3;
+}
+
+@property BOOL field1;
+@property BOOL field2;
+@end
+
+@implementation Foo
+
+@synthesize field1 = _field1;
+@synthesize field2 = _field2;
+
+@end
+
+int main()
+{
+  Foo *f = (Foo*)[[Foo alloc] init];
+  f.field1 = 0xF;
+  f.field2 = 0x3;
+  f.field1 = f.field1 & f.field2;
+  if (f.field1 != 0x3)
+    abort ();
+  return 0; 
+}
+
+