r348991 - Emit a proper diagnostic when attempting to forward inalloca arguments

Reid Kleckner via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 12 15:46:06 PST 2018


Author: rnk
Date: Wed Dec 12 15:46:06 2018
New Revision: 348991

URL: http://llvm.org/viewvc/llvm-project?rev=348991&view=rev
Log:
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.

Added:
    cfe/trunk/test/CodeGenCXX/inalloca-lambda.cpp
Modified:
    cfe/trunk/lib/CodeGen/CGCall.cpp

Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=348991&r1=348990&r2=348991&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Wed Dec 12 15:46:06 2018
@@ -3076,8 +3076,9 @@ void CodeGenFunction::EmitDelegateCallAr
 
   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.

Added: cfe/trunk/test/CodeGenCXX/inalloca-lambda.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/inalloca-lambda.cpp?rev=348991&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/inalloca-lambda.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/inalloca-lambda.cpp Wed Dec 12 15:46:06 2018
@@ -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) {}; }
+




More information about the cfe-commits mailing list