[Bug c++/87377] New: error with generic lambda accessing static field through argument within return type
comexk at gmail dot com
gcc-bugzilla@gcc.gnu.org
Fri Sep 21 12:58:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87377
Bug ID: 87377
Summary: error with generic lambda accessing static field
through argument within return type
Product: gcc
Version: 9.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: comexk at gmail dot com
Target Milestone: ---
…that's a mouthful. Here's the code:
template <auto _val>
struct const_val {
static constexpr auto val = _val;
};
int main() {
auto lambda = [](auto i) -> const_val<i.val> { while (1); };
lambda(const_val<5>());
}
Currently, GCC trunk rejects this:
% /tmp/gcct/bin/g++ b.cpp -std=c++2a
b.cpp: In function ‘int main()’:
b.cpp:6:48: error: template argument 1 is invalid
6 | auto lambda = [](auto i) -> const_val<i.val> { while (1); };
|
However, Clang accepts it.
I think this is a bug in GCC, because GCC does accept i.val as a constant
expression within the function body; for example, the example compiles if the
definition of 'lambda' is changed to:
auto lambda = [](auto i) {
const_val<i.val> c;
while (1);
};
It also accepts this:
auto lambda = [](auto i) -> const_val<decltype(i)::val> { while (1); };
More information about the Gcc-bugs
mailing list