"complain" can be non-zero but not call for any diagnostics. Tested x86_64-pc-linux-gnu, applying to trunk.
commit 63a7ba56bc105e90e64a8c273d0422d96752ad73 Author: Jason Merrill <ja...@redhat.com> Date: Thu Jul 14 14:02:57 2016 -0400
PR c++/71495 - spurious note during SFINAE. * call.c (convert_like_real): Mask complain. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 9b02814..a3c5008 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -6634,7 +6634,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, expr = decay_conversion (expr, complain); if (expr == error_mark_node) { - if (complain) + if (complain & tf_error) { maybe_print_user_conv_context (convs); if (fn) diff --git a/gcc/testsuite/g++.dg/cpp0x/sfinae57.C b/gcc/testsuite/g++.dg/cpp0x/sfinae57.C new file mode 100644 index 0000000..975a330 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/sfinae57.C @@ -0,0 +1,16 @@ +// PR c++/71495 +// { dg-do compile { target c++11 } } + +struct A; +template <class T> void f(T); // { dg-bogus "initializing" } +template <class T> T&& declval(); +struct B +{ + template <class T, class U> static decltype(f<T>(declval<U>())) g(int); + template <class T, class U> void g(...); +} b; + +int main() +{ + b.g<A,A>(42); +}