summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2014-03-14 15:40:54 +0000
committerFariborz Jahanian <fjahanian@apple.com>2014-03-14 15:40:54 +0000
commita5a469efbdcbde01a2525f3b1b4b9a0bf8b20575 (patch)
tree258f9da02f7a552c73b716da5ffa12308c6bdd64
parent8f66a3afe01ce6e3494374dce43d5b0a7e90bbab (diff)
downloadbcm5719-llvm-a5a469efbdcbde01a2525f3b1b4b9a0bf8b20575.tar.gz
bcm5719-llvm-a5a469efbdcbde01a2525f3b1b4b9a0bf8b20575.zip
Objective-C++ IRGen. Due to change to AST for initialization of c++11’s
data members by addition of CXXDefaultInitExpr node to the initializer expression, it has broken treatment of arc code for such initializations. Reviewed by John McCall. // rdar://16299964 llvm-svn: 203935
-rw-r--r--clang/lib/CodeGen/CGDecl.cpp5
-rw-r--r--clang/test/CodeGenObjCXX/arc-cxx11-member-init.mm32
2 files changed, 36 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp
index d0380a025d4..1f0dd8535a3 100644
--- a/clang/lib/CodeGen/CGDecl.cpp
+++ b/clang/lib/CodeGen/CGDecl.cpp
@@ -571,7 +571,10 @@ void CodeGenFunction::EmitScalarInit(const Expr *init,
EmitStoreThroughLValue(RValue::get(value), lvalue, true);
return;
}
-
+
+ if (const CXXDefaultInitExpr *DIE = dyn_cast<CXXDefaultInitExpr>(init))
+ init = DIE->getExpr();
+
// If we're emitting a value with lifetime, we have to do the
// initialization *before* we leave the cleanup scopes.
if (const ExprWithCleanups *ewc = dyn_cast<ExprWithCleanups>(init)) {
diff --git a/clang/test/CodeGenObjCXX/arc-cxx11-member-init.mm b/clang/test/CodeGenObjCXX/arc-cxx11-member-init.mm
new file mode 100644
index 00000000000..213e7a1b7b5
--- /dev/null
+++ b/clang/test/CodeGenObjCXX/arc-cxx11-member-init.mm
@@ -0,0 +1,32 @@
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fobjc-arc -std=c++11 -emit-llvm -o - %s | FileCheck %s
+// rdar://16299964
+
+@interface NSObject
++ (id)new;
+@end
+
+@interface NSMutableDictionary : NSObject
+@end
+
+class XClipboardDataSet
+{
+ NSMutableDictionary* mClipData = [NSMutableDictionary new];
+};
+
+@interface AppDelegate @end
+
+@implementation AppDelegate
+- (void)applicationDidFinishLaunching
+{
+ XClipboardDataSet clip;
+}
+@end
+
+// CHECK: [[mClipData:%.*]] = getelementptr inbounds %class.XClipboardDataSet*
+// CHECK: [[ZERO:%.*]] = load %struct._class_t** @"\01L_OBJC_CLASSLIST_REFERENCES_$_"
+// CHECK: [[ONE:%.*]] = load i8** @"\01L_OBJC_SELECTOR_REFERENCES_"
+// CHECK: [[TWO:%.*]] = bitcast %struct._class_t* [[ZERO]] to i8*
+// CHECK: [[CALL:%.*]] = call i8* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to i8* (i8*, i8*)*)(i8* [[TWO]], i8* [[ONE]])
+// CHECK: [[THREE:%.*]] = bitcast i8* [[CALL]] to [[T:%.*]]*
+// CHECK: store [[T]]* [[THREE]], [[T]]** [[mClipData]], align 8
+
OpenPOWER on IntegriCloud