"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 <[email protected]>
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);
+}