+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
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)
+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
--- /dev/null
+// 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;