https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67100
--- Comment #1 from tower120 <tower120 at gmail dot com> --- if change #define dispatch_forward_fn(fn_name, prefix) \ template<class Caller, class Me> \ struct Dispatcher<Caller, tstring(go_up), Me>{ /* Problem here tstring(go_up) */\ template<class ...Args, class ...ArgsRef> \ inline decltype(auto) operator() (ArgsRef&&... args) {\ return 0; \ } \ }; with: #define dispatch_forward_fn(fn_name, prefix) \ template<class Caller, class Me> \ using H_##fn_name = tstring(fn_name); \ struct Dispatcher<Caller, H_##fn_name, Me>{ \ template<class ...Args, class ...ArgsRef> \ inline decltype(auto) operator() (ArgsRef&&... args) {\ return 0; \ } \ }; ICE does not occurs.