From: Jason Merrill Date: Mon, 30 Jun 2014 15:05:32 +0000 (-0400) Subject: re PR c++/61500 ([C++11] Can't take pointer to member referenced via member pointer... X-Git-Tag: releases/gcc-4.8.4~383 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c4d7cfc886e18a8cd3a5a0895908b74db52e38f2;p=thirdparty%2Fgcc.git re PR c++/61500 ([C++11] Can't take pointer to member referenced via member pointer template parameter.) PR c++/61500 * tree.c (lvalue_kind): Handle MEMBER_REF and DOTSTAR_EXPR. From-SVN: r212152 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c89da1356e10..80c7fd81662a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2014-06-30 Jason Merrill + + PR c++/61500 + * tree.c (lvalue_kind): Handle MEMBER_REF and DOTSTAR_EXPR. + 2014-06-17 Jason Merrill PR c++/60605 diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index c7502d6207b7..ed4bff6c5aa3 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -97,6 +97,16 @@ lvalue_kind (const_tree ref) case IMAGPART_EXPR: return lvalue_kind (TREE_OPERAND (ref, 0)); + case MEMBER_REF: + case DOTSTAR_EXPR: + if (TREE_CODE (ref) == MEMBER_REF) + op1_lvalue_kind = clk_ordinary; + else + op1_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 0)); + if (TYPE_PTRMEMFUNC_P (TREE_TYPE (TREE_OPERAND (ref, 1)))) + op1_lvalue_kind = clk_none; + return op1_lvalue_kind; + case COMPONENT_REF: op1_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 0)); /* Look at the member designator. */ diff --git a/gcc/testsuite/g++.dg/template/ptrmem27.C b/gcc/testsuite/g++.dg/template/ptrmem27.C new file mode 100644 index 000000000000..8c63f9c2974e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem27.C @@ -0,0 +1,22 @@ +// PR c++/61500 + +struct X { + int i; + int j; + + int foo(int X::* ptr); + + template + int bar(); +}; + +int X::foo(int X::* ptr) { + int* p = &(this->*ptr); // OK. + return *p; +} + +template +int X::bar() { + int* p = &(this->*ptr); // gcc 4.9.0: OK in C++98 mode, fails in C++11 mode. + return *p; +}