PR c++/82030 - ICE inheriting from multiple lambdas
authorJason Merrill <jason@redhat.com>
Wed, 30 Aug 2017 22:19:33 +0000 (18:19 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 30 Aug 2017 22:19:33 +0000 (18:19 -0400)
PR c++/80767
* call.c (compare_ics): Handle null candidate.

From-SVN: r251549

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv12.C [new file with mode: 0644]

index 10ae08ae18693965c93f982338e3c5a43d0c65a8..a8c13672b5f3b0557188f454f67af9afafe200b0 100644 (file)
@@ -1,3 +1,9 @@
+2017-08-30  Jason Merrill  <jason@redhat.com>
+
+       PR c++/82030 - ICE inheriting from multiple lambdas
+       PR c++/80767
+       * call.c (compare_ics): Handle null candidate.
+
 2017-08-30  Ville Voutilainen  <ville.voutilainen@gmail.com>
 
        Make taking the address of an overloaded function a non-deduced context
index c446057cfba7b1b193dd137b1c29e7ba7e3d6300..9e4a5c1b9aee55ed2033639112b758b6530a0d05 100644 (file)
@@ -9561,7 +9561,9 @@ compare_ics (conversion *ics1, conversion *ics2)
        return 0;
       else if (t1->kind == ck_user)
        {
-         if (t1->cand->fn != t2->cand->fn)
+         tree f1 = t1->cand ? t1->cand->fn : t1->type;
+         tree f2 = t2->cand ? t2->cand->fn : t2->type;
+         if (f1 != f2)
            return 0;
        }
       else
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv12.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-conv12.C
new file mode 100644 (file)
index 0000000..16adee6
--- /dev/null
@@ -0,0 +1,18 @@
+// PR c++/80767
+// { dg-do compile { target c++11 } }
+
+template <typename T, typename U = T> struct A { using type = U; };
+template <typename F, typename... G> struct B : B<F>::type, B<G...>::type {
+  using type = B;
+  using B<F>::type::operator();
+};
+template <typename F> struct B<F> { using type = F; };
+struct {
+  template <typename... F,
+            typename Overload = typename B<typename A<F>::type...>::type>
+  Overload operator()(F...){}
+} a;
+int main() {
+  auto f = a([](int) {}, [](float) {});
+  f({});
+}