https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97214
Bug ID: 97214
Summary: ICE in lookup_template_class_1, at cp/pt.c:9896
Product: gcc
Version: 10.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: sfranzen85 at hotmail dot com
Target Milestone: ---
The following snippet reproduces an error I encountered with lambdas:
struct Foo {
// void operator()(int) {}
template<typename T>
void operator()(T, T)
{
auto bar = [this](auto&& v){ operator()(v); };
}
};
int main ()
{
Foo{}(0,1);
return 0;
}
Full error:
../src/main.cpp: In instantiation of ‘void Foo::operator()(T, T) [with T =
int]’:
../src/main.cpp:13:14: required from here
../src/main.cpp:7:38: internal compiler error: in lookup_template_class_1, at
cp/pt.c:9896
7 | auto bar = [this](auto&& v){ operator()(v); };
| ^~~~~~~~~~
Further observations:
* The error appears regardless of available operator()() overloads;
* It only appears if the function call is unqualified, e.g. (*this)(v) is fine
if the overload exists.
A possibly related error is given using a version of Foo without a function
template:
struct Foo {
void operator()(int) {}
void operator()(int a, int)
{
auto bar = [this](auto&& v){ operator()(v); };
bar(a);
}
};
../src/main.cpp: In instantiation of ‘Foo::operator()(int,
int)::<lambda(auto:1&&)> [with auto:1 = int&]’:
../src/main.cpp:8:14: required from here
../src/main.cpp:7:48: error: use of ‘Foo::operator()(int,
int)::<lambda(auto:1&&)> [with auto:1 = int&]’ before deduction of ‘auto’
7 | auto bar = [this](auto&& v){ operator()(v); };
| ~~~~~~~~~~^~~
This error similarly only appears with the unqualified call, and also
disappears if the lambda has '-> void'.