This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/77337] New: [7 regression][c++1z] use before deduction of 'auto'
- From: "lucdanton at free dot fr" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 23 Aug 2016 04:43:11 +0000
- Subject: [Bug c++/77337] New: [7 regression][c++1z] use before deduction of 'auto'
- Auto-submitted: auto-generated
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77337
Bug ID: 77337
Summary: [7 regression][c++1z] use before deduction of 'auto'
Product: gcc
Version: 7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: lucdanton at free dot fr
Target Milestone: ---
The included program compiles on 6.1 and I think on the 6.2 branch (I would
need definite confirmation however), with either -std=c++14 or -std=c++1z.
On 7 trunk (rev. 239676) it compiles as well with the following:
$ g++-trunk -std=c++14 main.cpp
but it fails in c++1z mode:
$ g++-trunk -std=c++1z main.cpp
main.cpp: In instantiation of 'main()::<lambda(auto:1&)> [with auto:1 =
fix_type<main()::<lambda(auto:1&)> >]':
main.cpp:6:27: required from 'decltype(auto) fix_type<Functor>::operator()()
[with Functor = main()::<lambda(auto:1&)>]'
main.cpp:25:17: required from here
main.cpp:21:17: error: use of 'decltype(auto) fix_type<Functor>::operator()()
[with Functor = main()::<lambda(auto:1&)>]' before deduction of 'auto'
self();
~~~~^~
I'm not 100% sure that GCC should accept the program though. FWIW Clang accepts
it.
//------------------
template<typename Functor>
struct fix_type {
Functor functor;
decltype(auto) operator()()
{ return functor(*this); }
};
template<typename Functor>
fix_type<Functor> fix(Functor functor)
{ return { functor }; }
int main()
{
auto zero = fix(
[](auto& self) -> int // N.B. non-deduced, non-dependent return type
{
return 0;
// error: use of 'decltype(auto) fix_type<Functor>::operator()()
[with Functor = main()::<lambda(auto:1&)>]' before deduction of 'auto'
self();
}
);
return zero();
}