http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56838
Jason Merrill <jason at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |jason at gcc dot gnu.org --- Comment #1 from Jason Merrill <jason at gcc dot gnu.org> 2013-04-04 13:46:04 UTC --- GCC 4.8.0 also accepts this testcase. The problem on the trunk is that G++ has started instantiating return types in order to cause a substitution failure if the return type is an abstract class. In this case, we've deduced template arguments for boost::bind(F, A1, A2) and are substituting them in to produce a candidate; we haven't selected a candidate yet. During the substitution, we instantiate boost::_bi::bind_t to determine whether it is abstract, and this leads to the error you're seeing. This is new behavior for G++, but it seems to be what the standard requires. But perhaps that's a defect. It certainly seems to be causing headaches.