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
This commit is contained in:
Jason Merrill 2014-06-16 07:45:37 -04:00 committed by Jason Merrill
parent 2bd4bfee7e
commit 949bd6c8ce
3 changed files with 37 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2014-06-13 Jason Merrill <jason@redhat.com>
PR c++/61500
* tree.c (lvalue_kind): Handle MEMBER_REF and DOTSTAR_EXPR.
2014-06-15 Jan Hubicka <hubicka@ucw.cz>
* decl.c (grokvardecl): Fix pasto in previous patch.

View File

@ -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. */

View File

@ -0,0 +1,22 @@
// PR c++/61500
struct X {
int i;
int j;
int foo(int X::* ptr);
template <int X::* ptr>
int bar();
};
int X::foo(int X::* ptr) {
int* p = &(this->*ptr); // OK.
return *p;
}
template <int X::* ptr>
int X::bar() {
int* p = &(this->*ptr); // gcc 4.9.0: OK in C++98 mode, fails in C++11 mode.
return *p;
}