Commit b447b28c by Jakub Jelinek Committed by Jakub Jelinek

re PR c++/80176 (cannot bind reference to static member function using object access expression)

	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
parent 3bbd6768
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> 2017-04-10 Marek Polacek <polacek@redhat.com>
PR sanitizer/80348 PR sanitizer/80348
......
...@@ -105,6 +105,17 @@ lvalue_kind (const_tree ref) ...@@ -105,6 +105,17 @@ lvalue_kind (const_tree ref)
return op1_lvalue_kind; return op1_lvalue_kind;
case COMPONENT_REF: 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)); op1_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 0));
/* Look at the member designator. */ /* Look at the member designator. */
if (!op1_lvalue_kind) 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> 2017-04-10 Thomas Koenig <tkoenig@gcc.gnu.org>
PR tree-optimization/80304 PR tree-optimization/80304
......
// 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment