From feb1567e07573100ea14f9aea02f81463e791496 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Wed, 12 Dec 2018 23:46:06 +0000 Subject: [PATCH] Emit a proper diagnostic when attempting to forward inalloca arguments The previous assertion was relatively easy to trigger, and likely will be easy to trigger going forward. EmitDelegateCallArg is relatively popular. This cleanly diagnoses PR28299 while I work on a proper solution. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@348991 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGCall.cpp | 5 +++-- test/CodeGenCXX/inalloca-lambda.cpp | 11 +++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 test/CodeGenCXX/inalloca-lambda.cpp diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index 4757cd2ffa..b2c1eba066 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -3076,8 +3076,9 @@ void CodeGenFunction::EmitDelegateCallArg(CallArgList &args, QualType type = param->getType(); - assert(!isInAllocaArgument(CGM.getCXXABI(), type) && - "cannot emit delegate call arguments for inalloca arguments!"); + if (isInAllocaArgument(CGM.getCXXABI(), type)) { + CGM.ErrorUnsupported(param, "forwarded non-trivially copyable parameter"); + } // GetAddrOfLocalVar returns a pointer-to-pointer for references, // but the argument needs to be the original pointer. diff --git a/test/CodeGenCXX/inalloca-lambda.cpp b/test/CodeGenCXX/inalloca-lambda.cpp new file mode 100644 index 0000000000..ac85ee1752 --- /dev/null +++ b/test/CodeGenCXX/inalloca-lambda.cpp @@ -0,0 +1,11 @@ +// RUN: not %clang_cc1 -triple i686-windows-msvc -emit-llvm -o /dev/null %s 2>&1 | FileCheck %s + +// PR28299 +// CHECK: error: cannot compile this forwarded non-trivially copyable parameter yet + +class A { + A(const A &); +}; +typedef void (*fptr_t)(A); +fptr_t fn1() { return [](A) {}; } + -- 2.50.1