diff options
author | Jason Merrill <jason@redhat.com> | 2014-06-16 07:45:37 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2014-06-16 07:45:37 -0400 |
commit | 949bd6c8ce34292ed83d80294d609835084947c7 (patch) | |
tree | 6c91b255dc662ea5fa28035e32d737c726d4ba23 /gcc | |
parent | 2bd4bfee7e16cf608ae6e16c669e265bce635d48 (diff) | |
download | gcc-949bd6c8ce34292ed83d80294d609835084947c7.zip gcc-949bd6c8ce34292ed83d80294d609835084947c7.tar.gz gcc-949bd6c8ce34292ed83d80294d609835084947c7.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/tree.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/ptrmem27.C | 22 |
3 files changed, 37 insertions, 0 deletions
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 <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. 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 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; +} |