From 7704715f8c1ed3a017b9808dd7d0f8bf514d09ca Mon Sep 17 00:00:00 2001 From: George Burgess IV Date: Wed, 22 Feb 2017 22:38:25 +0000 Subject: [PATCH] [CodeGen] Add param info for ctors with ABI args. 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 | 12 +++++++++++- test/CodeGenObjCXX/arc-attrs-abi.mm | 15 +++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 test/CodeGenObjCXX/arc-attrs-abi.mm diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 98056f5d6e..85b2e258f6 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -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 index 0000000000..7570038b1b --- /dev/null +++ b/test/CodeGenObjCXX/arc-attrs-abi.mm @@ -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) {} -- 2.40.0