diff mbox

C++ PATCHes for c++/61488, 61500 (PMF/template issues)

Message ID 539ED9EC.1080005@redhat.com
State New
Headers show

Commit Message

Jason Merrill June 16, 2014, 11:50 a.m. UTC
A couple of small bugs involving pointers to member functions in 
templates.  In 61500, we were failing to handle MEMBER_REF in 
lvalue_kind.  In 61488, we were failing to handle unlowered PMF syntax 
used as a template argument.

Tested x86_64-pc-linux-gnu, applying to trunk.
diff mbox

Patch

commit 7a2deb52336c87960d6c75439978302d0facdda8
Author: jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Date:   Mon Jun 16 11:45:37 2014 +0000

    	PR c++/61500
    	* tree.c (lvalue_kind): Handle MEMBER_REF and DOTSTAR_EXPR.
    
    git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@211703 138bc75d-0d04-0410-961f-82ee72b054a4

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;
+}