re PR c++/80176 (cannot bind reference to static member function using object access...
authorJakub Jelinek <jakub@redhat.com>
Mon, 10 Apr 2017 20:49:11 +0000 (22:49 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 10 Apr 2017 20:49:11 +0000 (22:49 +0200)
PR c++/80176
* tree.c (lvalue_kind): For COMPONENT_REF with BASELINK second
operand, if it is a static member function, recurse on the
BASELINK.

* g++.dg/init/ref23.C: New test.

From-SVN: r246825

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/ref23.C [new file with mode: 0644]

index 0a19eaafbbe3e0b81f4d35bc563981c93170a2ed..b7cbca58e95d0351dcaea35bca91024813430840 100644 (file)
@@ -1,3 +1,10 @@
+2017-04-10  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/80176
+       * tree.c (lvalue_kind): For COMPONENT_REF with BASELINK second
+       operand, if it is a static member function, recurse on the
+       BASELINK.
+
 2017-04-10  Marek Polacek  <polacek@redhat.com>
 
        PR sanitizer/80348
index 99391352e3a2072422258d1b6d04a540267dd1d1..acb9b8eef0529888c383a579e173d810ff23d475 100644 (file)
@@ -105,6 +105,17 @@ lvalue_kind (const_tree ref)
       return op1_lvalue_kind;
 
     case COMPONENT_REF:
+      if (BASELINK_P (TREE_OPERAND (ref, 1)))
+       {
+         tree fn = BASELINK_FUNCTIONS (TREE_OPERAND (ref, 1));
+
+         /* For static member function recurse on the BASELINK, we can get
+            here e.g. from reference_binding.  If BASELINK_FUNCTIONS is
+            OVERLOAD, the overload is resolved first if possible through
+            resolve_address_of_overloaded_function.  */
+         if (TREE_CODE (fn) == FUNCTION_DECL && DECL_STATIC_FUNCTION_P (fn))
+           return lvalue_kind (TREE_OPERAND (ref, 1));
+       }
       op1_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 0));
       /* Look at the member designator.  */
       if (!op1_lvalue_kind)
index b0228bd9fa53ce47b9dfdfb191e86c129d12a2cd..746150b60c5562b80c3fa6c2527eeaf6a71fdb2f 100644 (file)
@@ -1,3 +1,8 @@
+2017-04-10  Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/80176
+       * g++.dg/init/ref23.C: New test.
+
 2017-04-10  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR tree-optimization/80304
diff --git a/gcc/testsuite/g++.dg/init/ref23.C b/gcc/testsuite/g++.dg/init/ref23.C
new file mode 100644 (file)
index 0000000..12b8851
--- /dev/null
@@ -0,0 +1,15 @@
+// PR c++/80176
+// { dg-do compile }
+
+struct X { static void foo(); static void baz(int); static int baz(double); } x;
+struct Y { void o(unsigned char); static void o(int); void o(double); } y;
+void X::foo() {}
+static void bar() {}
+void (&r1)() = x.foo;
+void (&r2)() = X::foo;
+void (&r3)() = bar;
+void (&r4)(int) = x.baz;
+int (&r5)(double) = x.baz;
+void (&r6)(int) = X::baz;
+int (&r7)(double) = X::baz;
+void (&r8)(int) = y.o;