]> granicus.if.org Git - clang/commitdiff
[CodeGen] Add param info for ctors with ABI args.
authorGeorge Burgess IV <george.burgess.iv@gmail.com>
Wed, 22 Feb 2017 22:38:25 +0000 (22:38 +0000)
committerGeorge Burgess IV <george.burgess.iv@gmail.com>
Wed, 22 Feb 2017 22:38:25 +0000 (22:38 +0000)
This fixes a few assertion failures. Please see the added test case.

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

lib/CodeGen/CGCall.cpp
test/CodeGenObjCXX/arc-attrs-abi.mm [new file with mode: 0644]

index 98056f5d6e92db059ce64d3895e1f8d28c9440f2..85b2e258f61662490ade9f9594bc12dcf360c6ad 100644 (file)
@@ -288,7 +288,17 @@ CodeGenTypes::arrangeCXXStructorDeclaration(const CXXMethodDecl *MD,
   if (PassParams)
     appendParameterTypes(*this, argTypes, paramInfos, FTP, MD);
 
-  TheCXXABI.buildStructorSignature(MD, Type, argTypes);
+  CGCXXABI::AddedStructorArgs AddedArgs =
+      TheCXXABI.buildStructorSignature(MD, Type, argTypes);
+  if (!paramInfos.empty()) {
+    // Note: prefix implies after the first param.
+    if (AddedArgs.Prefix)
+      paramInfos.insert(paramInfos.begin() + 1, AddedArgs.Prefix,
+                        FunctionProtoType::ExtParameterInfo{});
+    if (AddedArgs.Suffix)
+      paramInfos.append(AddedArgs.Suffix,
+                        FunctionProtoType::ExtParameterInfo{});
+  }
 
   RequiredArgs required =
       (PassParams && MD->isVariadic() ? RequiredArgs(argTypes.size())
diff --git a/test/CodeGenObjCXX/arc-attrs-abi.mm b/test/CodeGenObjCXX/arc-attrs-abi.mm
new file mode 100644 (file)
index 0000000..7570038
--- /dev/null
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -triple x86_64-apple -emit-llvm -fobjc-arc -o - %s
+// RUN: %clang_cc1 -triple x86_64-windows -emit-llvm -fobjc-arc -o - %s
+//
+// Test caess where we weren't properly adding parameter infos declarations,
+// which caused assertions to fire. Hence, no CHECKs.
+
+struct VirtualBase {
+  VirtualBase(__attribute__((ns_consumed)) id x);
+};
+struct WithVirtualBase : virtual VirtualBase {
+  WithVirtualBase(__attribute__((ns_consumed)) id x);
+};
+
+WithVirtualBase::WithVirtualBase(__attribute__((ns_consumed)) id x)
+    : VirtualBase(x) {}