summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2018-12-12 23:46:06 +0000
committerReid Kleckner <rnk@google.com>2018-12-12 23:46:06 +0000
commit25b56024aa369df85e9c0d986ace6a5bac164664 (patch)
tree08b343d3128debe6359038d6fb9f5d2537edfe09
parente01c646ddaf76540880099402d7bbac4f188d10c (diff)
downloadbcm5719-llvm-25b56024aa369df85e9c0d986ace6a5bac164664.tar.gz
bcm5719-llvm-25b56024aa369df85e9c0d986ace6a5bac164664.zip
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. llvm-svn: 348991
-rw-r--r--clang/lib/CodeGen/CGCall.cpp5
-rw-r--r--clang/test/CodeGenCXX/inalloca-lambda.cpp11
2 files changed, 14 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp
index 4757cd2ffae..b2c1eba0664 100644
--- a/clang/lib/CodeGen/CGCall.cpp
+++ b/clang/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/clang/test/CodeGenCXX/inalloca-lambda.cpp b/clang/test/CodeGenCXX/inalloca-lambda.cpp
new file mode 100644
index 00000000000..ac85ee17526
--- /dev/null
+++ b/clang/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) {}; }
+
OpenPOWER on IntegriCloud