https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69222

            Bug ID: 69222
           Summary: C++14 template code working in GCC 5.1 stops working
                    in 5.2 and 5.3
           Product: gcc
           Version: 5.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: wuyongwei at gmail dot com
  Target Milestone: ---

Created attachment 37299
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=37299&action=edit
Test C++ file

I have an implementation of Y Combinator in C++, which works in GCC 4.9 to 5.1
as well as Clang 3.5 (in C++14 mode). It stops working in GCC 5.2 and 5.3, so I
think it is regression. I think GCC is being too eager in template
instantiation. As I also tried using the GCC 5.1 C++ header files with GCC 5.2
and got the same errors, I guess it is a C++ front end problem.

The test program is supposed to apply the Y combinator to a non-recursive
function almost_fac to get a factorial function. It should compile well and
output two lines of "120", but now it fails the compilation at the
"fix_curry(almost_fac)" line.

I tested on Windows and OS X. The Windows error output is:

In file included from test_gcc.cpp:1:0:
C:/mingw64/x86_64-w64-mingw32/include/c++/functional: In substitution of
'template<class _Functor, class> std::function<_Res(_ArgTypes
...)>::function(_Functor) [with _Functor =
std::function<std::function<int(int)>(self_ref_func<std::function<int(int)>
>)>; <template-parameter-1-2> = <missing>]':
C:/mingw64/x86_64-w64-mingw32/include/c++/functional:1981:45:   recursively
required by substitution of 'template<class _Functor, class>
std::function<_Res(_ArgTypes ...)>::function(_Functor) [with _Functor =
std::function<std::function<int(int)>(self_ref_func<std::function<int(int)>
>)>; <template-parameter-1-2> = <missing>]'
C:/mingw64/x86_64-w64-mingw32/include/c++/functional:1981:45:   required by
substitution of 'template<class _Functor, class> std::function<_Res(_ArgTypes
...)>::function(_Functor) [with _Functor =
std::function<std::function<int(int)>(self_ref_func<std::function<int(int)>
>)>; <template-parameter-1-2> = <missing>]'
test_gcc.cpp:47:51:   required from
'fix_curry(std::function<std::function<_Rs(_Tp)>(std::function<_Rs(_Tp)>)>)::<lambda(fn_self_ref)>::<lambda(_Tp&&)>
[with _Rs = int; _Tp = int]'
test_gcc.cpp:45:34:   required from 'struct
fix_curry(std::function<std::function<_Rs(_Tp)>(std::function<_Rs(_Tp)>)>)::<lambda(fn_self_ref)>
[with _Rs = int; _Tp = int; fn_self_ref = self_ref_func<std::function<int(int)>
>]::<lambda(int&&)>'
test_gcc.cpp:45:21:   required from
'fix_curry(std::function<std::function<_Rs(_Tp)>(std::function<_Rs(_Tp)>)>)::<lambda(fn_self_ref)>
[with _Rs = int; _Tp = int; fn_self_ref = self_ref_func<std::function<int(int)>
>]'
test_gcc.cpp:43:10:   required from 'struct
fix_curry(std::function<std::function<_Rs(_Tp)>(std::function<_Rs(_Tp)>)>)
[with _Rs = int; _Tp = int]::<lambda(fn_self_ref)>'
test_gcc.cpp:50:5:   required from 'std::function<_Rs(_Tp)>
fix_curry(std::function<std::function<_Rs(_Tp)>(std::function<_Rs(_Tp)>)>)
[with _Rs = int; _Tp = int]'
test_gcc.cpp:69:43:   required from here
C:/mingw64/x86_64-w64-mingw32/include/c++/functional:1981:69: fatal error:
template instantiation depth exceeds maximum of 900 (use -ftemplate-depth= to
increase the maximum)
  using _Invoke = decltype(__callable_functor(std::declval<_Functor&>())
                                                                     ^
compilation terminated.

Reply via email to