From: Jason Merrill Date: Mon, 16 Jun 2014 11:45:37 +0000 (-0400) Subject: re PR c++/61500 ([C++11] Can't take pointer to member referenced via member pointer... X-Git-Tag: upstream/12.2.0~62557 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=949bd6c8ce34292ed83d80294d609835084947c7;p=platform%2Fupstream%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: r211703 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9784a59..de0307d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2014-06-13 Jason Merrill + + PR c++/61500 + * tree.c (lvalue_kind): Handle MEMBER_REF and DOTSTAR_EXPR. + 2014-06-15 Jan Hubicka * decl.c (grokvardecl): Fix pasto in previous patch. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 587ae80..3616605 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -102,6 +102,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 0000000..8c63f9c --- /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; +}