https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69139
Bug ID: 69139 Summary: [4.9/5/6 Regression] deduction failure with trailing return type in function template argument Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: rs2740 at gmail dot com Target Milestone: --- Test case (modified from http://stackoverflow.com/q/31229359/2756719): auto get(int) -> int { return {}; } template <class R> int f(auto (*)(int) -> R) { return {}; } int i = f(get); Compiles on 4.8.2, fails on 4.9 and later: prog.cc:3:14: error: no matching function for call to 'f(int (&)(int))' int i = f(get); ^ prog.cc:2:24: note: candidate: template<class R, class auto:1> int f(auto:1 (*)(int)) template <class R> int f(auto (*)(int) -> R) { return {}; } ^ prog.cc:2:24: note: template argument deduction/substitution failed: prog.cc:3:14: note: couldn't deduce template parameter 'R' int i = f(get); ^ It seems as if the 'auto' indicating the trailing return type is being treated as introducing another template parameter, as if in abbreviated function templates, and then the trailing return type is just ignored.