[Bug c++/98326] New: ICE: in create_tmp_var, at gimple-expr.c:482, converting stateless generic-lambda to function pointer
leni536 at gmail dot com
gcc-bugzilla@gcc.gnu.org
Wed Dec 16 18:17:41 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98326
Bug ID: 98326
Summary: ICE: in create_tmp_var, at gimple-expr.c:482,
converting stateless generic-lambda to function
pointer
Product: gcc
Version: 10.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: leni536 at gmail dot com
Target Milestone: ---
version: g++ (Compiler-Explorer-Build) 10.2.0
arguments: -O2 -std=c++17 -pedantic-errors
```
struct A {
A() = default;
A(const A&) {}
};
void (*fptr)(A) = [](auto){};
```
<source>: In static member function 'static constexpr decltype
(((const<lambda(auto:1)>*)0)->operator()<auto:1>(static_cast<auto:1&&>(<anonymous>)))<lambda(auto:1)>::_FUN(auto:1)
[with auto:1 = A]':
<source>:6:28: internal compiler error: in create_tmp_var, at gimple-expr.c:482
6 | void (*fptr)(A) = [](auto){};
| ^
The ICE seems to happen when the by-value parameter's type is not trivially
copyable. It can also be reproduced with a non-trivial destructor.
If the copy-constructor is deleted then it fails to compile with a non-ice
error.
Related: PR 86943
In my understanding gcc tries to copy/move the by-value parameter in the free
function to pass it to `closure{}(args)`. I don't think that copying/moving the
by-value argument is correct. The effect of calling the resulting function
pointer should be equivalent to calling the operator() on the closure object,
it's not expressed in terms of forwarding the parameters:
https://timsong-cpp.github.io/cppwp/n4659/expr.prim.lambda.closure#8
It's more precisely spelled out in C++20, as there it can be expressed it in
terms of a default constructed object of the closure type:
http://eel.is/c++draft/expr.prim.lambda.closure#10.sentence-1
More information about the Gcc-bugs
mailing list