Patchwork C++ PATCH for c++/45282 (wrong decltype of .*)

login
register
mail settings
Submitter Jason Merrill
Date March 27, 2013, 2:58 a.m.
Message ID <51526049.2050003@redhat.com>
Download mbox | patch
Permalink /patch/231585/
State New
Headers show

Comments

Jason Merrill - March 27, 2013, 2:58 a.m.
A while back I fixed build_m_component_ref so that a .* with an xvalue 
lhs would be an xvalue, but we need to handle class prvalues correctly too.

Tested x86_64-pc-linux-gnu, applying to trunk and 4.8.

Patch

commit 7ef69238ed9acd48a12a0bd31307100b41db9f0e
Author: Jason Merrill <jason@redhat.com>
Date:   Tue Mar 26 14:07:56 2013 -0400

    	PR c++/45282
    	* typeck2.c (build_m_component_ref): Handle prvalue object.

diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index ca31610..72dccb4 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -1671,7 +1671,7 @@  build_m_component_ref (tree datum, tree component, tsubst_flags_t complain)
 
   if (TYPE_PTRDATAMEM_P (ptrmem_type))
     {
-      bool is_lval = real_lvalue_p (datum);
+      cp_lvalue_kind kind = lvalue_kind (datum);
       tree ptype;
 
       /* Compute the type of the field, as described in [expr.ref].
@@ -1701,7 +1701,9 @@  build_m_component_ref (tree datum, tree component, tsubst_flags_t complain)
 	return error_mark_node;
 
       /* If the object expression was an rvalue, return an rvalue.  */
-      if (!is_lval)
+      if (kind & clk_class)
+	datum = rvalue (datum);
+      else if (kind & clk_rvalueref)
 	datum = move (datum);
       return datum;
     }
diff --git a/gcc/testsuite/g++.dg/cpp0x/decltype49.C b/gcc/testsuite/g++.dg/cpp0x/decltype49.C
new file mode 100644
index 0000000..c317498
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/decltype49.C
@@ -0,0 +1,10 @@ 
+// PR c++/45282
+// { dg-require-effective-target c++11 }
+
+struct A { int i; };
+int A::*ipm = &A::i;
+
+template <class T, class U> class assert_same_type;
+template <class T> class assert_same_type<T,T> { };
+
+assert_same_type<decltype(A().*ipm),int> x2;