Emit a proper diagnostic when attempting to forward inalloca arguments
authorReid Kleckner <rnk@google.com>
Wed, 12 Dec 2018 23:46:06 +0000 (23:46 +0000)
committerReid Kleckner <rnk@google.com>
Wed, 12 Dec 2018 23:46:06 +0000 (23:46 +0000)
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

clang/lib/CodeGen/CGCall.cpp
clang/test/CodeGenCXX/inalloca-lambda.cpp [new file with mode: 0644]

index 4757cd2ffae622e22fdab8b4ed0d59aa3dd4df59..b2c1eba06647fd271d1005604f6c8d08cc383c63 100644 (file)
@@ -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 (file)
index 0000000..ac85ee1
--- /dev/null
@@ -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) {}; }
+