diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def
index 1abc77bfcad3e609342d5d6c1e581cc2f35c24fe..00f2aa1db487c714b1a41e27ad626f0e9831f366 100644
--- a/gcc/cp/cp-tree.def
+++ b/gcc/cp/cp-tree.def
@@ -31,10 +31,8 @@ Boston, MA 02111-1307, USA.  */
       BASELINK, or TEMPLATE_ID_EXPR (corresponding to `m').
 
       The expression is a pointer-to-member if its address is taken,
-      but simply denotes a member of the object if its address isnot
-      taken.  In the latter case, resolve_offset_ref is used to
-      convert it to a representation of the member referred to by the
-      OFFSET_REF.
+      but simply denotes a member of the object if its address is not
+      taken.
       
       This form is only used during the parsing phase; once semantic
       analysis has taken place they are eliminated.
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 69089fe82691e2d8a4f7f0aaef697e3795284429..726309acc6a092baee72b851e58b2e2d808f8791 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -1551,9 +1551,6 @@ build_offset_ref (tree type, tree name, bool address_p)
       return member;
     }
 
-  /* In member functions, the form `type::name' is no longer
-     equivalent to `this->type::name', at least not until
-     resolve_offset_ref.  */
   member = build2 (OFFSET_REF, TREE_TYPE (member), decl, member);
   PTRMEM_OK_P (member) = 1;
   return member;
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index a3bf1c0281f7fd802cb60db0adb805342138fcba..272dc86891fc18d89e540614c3051074acb0dd11 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -4026,6 +4026,29 @@ build_unary_op (enum tree_code code, tree xarg, int noconvert)
 	  arg = OVL_CURRENT (arg);
 	  break;
 
+	case OFFSET_REF:
+	  /* Turn a reference to a non-static data member into a
+	     pointer-to-member.  */
+	  {
+	    tree type;
+	    tree t;
+
+	    if (!PTRMEM_OK_P (arg))
+	      return build_unary_op (code, arg, 0);
+	    
+	    t = TREE_OPERAND (arg, 1);
+	    if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
+	      {
+		error ("cannot create pointer to reference member %qD", t);
+		return error_mark_node;
+	      }
+	    
+	    type = build_ptrmem_type (context_for_name_lookup (t), 
+				      TREE_TYPE (t));
+	    t = make_ptrmem_cst (type, TREE_OPERAND (arg, 1));
+	    return t;
+	  }
+
 	default:
 	  break;
 	}
@@ -4182,52 +4205,7 @@ unary_complex_lvalue (enum tree_code code, tree arg)
   if (TREE_CODE (TREE_TYPE (arg)) == FUNCTION_TYPE
       || TREE_CODE (TREE_TYPE (arg)) == METHOD_TYPE
       || TREE_CODE (arg) == OFFSET_REF)
-    {
-      tree t;
-
-      gcc_assert (TREE_CODE (arg) != SCOPE_REF);
-
-      if (TREE_CODE (arg) != OFFSET_REF)
-	return 0;
-
-      t = TREE_OPERAND (arg, 1);
-
-      /* Check all this code for right semantics.  */	
-      if (TREE_CODE (t) == FUNCTION_DECL)
-	{
-	  if (DECL_DESTRUCTOR_P (t))
-	    error ("taking address of destructor");
-	  return build_unary_op (ADDR_EXPR, t, 0);
-	}
-      if (TREE_CODE (t) == VAR_DECL)
-	return build_unary_op (ADDR_EXPR, t, 0);
-      else
-	{
-	  tree type;
-
-	  if (TREE_OPERAND (arg, 0)
-	      && ! is_dummy_object (TREE_OPERAND (arg, 0))
-	      && TREE_CODE (t) != FIELD_DECL)
-	    {
-	      error ("taking address of bound pointer-to-member expression");
-	      return error_mark_node;
-	    }
-	  if (!PTRMEM_OK_P (arg))
-	    return build_unary_op (code, arg, 0);
-	  
-	  if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
-	    {
-	      error ("cannot create pointer to reference member %qD", t);
-	      return error_mark_node;
-	    }
-
-	  type = build_ptrmem_type (context_for_name_lookup (t), 
-				    TREE_TYPE (t));
-	  t = make_ptrmem_cst (type, TREE_OPERAND (arg, 1));
-	  return t;
-	}
-    }
-
+    return NULL_TREE;
   
   /* We permit compiler to make function calls returning
      objects of aggregate type look like lvalues.  */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3a61f76bc5cfbf84a519d92c2452eca61216a058..3c3678a2523f0ae6a44e6c22f278db9de4b59ae9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-04-05  Mark Mitchell  <mark@codesourcery.com>
+
+	PR c++/20734
+	* g++.dg/template/ptrmem13.C: New test.
+
 2005-04-05  Per Bothner  <per@bothner.com>
 
 	* lib/gcc.exp: Always add -fno-show-column, for now.
diff --git a/gcc/testsuite/g++.dg/template/ptrmem13.C b/gcc/testsuite/g++.dg/template/ptrmem13.C
new file mode 100644
index 0000000000000000000000000000000000000000..84374ea05fc0a05842c25262ab6daac9f7e9feec
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ptrmem13.C
@@ -0,0 +1,11 @@
+// PR c++/20734
+
+struct A;
+void blah(int A::*);
+struct A{
+  int a;
+};
+template<typename T>
+void hoho(){
+  blah(&A::a);
+}