re PR c++/45282 (wrong decltype result for .*)
authorJason Merrill <jason@redhat.com>
Wed, 27 Mar 2013 03:01:34 +0000 (23:01 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 27 Mar 2013 03:01:34 +0000 (23:01 -0400)
PR c++/45282
* typeck2.c (build_m_component_ref): Handle prvalue object.

From-SVN: r197130

gcc/cp/ChangeLog
gcc/cp/typeck2.c
gcc/testsuite/g++.dg/cpp0x/decltype49.C [new file with mode: 0644]

index 8bddaf2..0c5bcee 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-26  Jason Merrill  <jason@redhat.com>
+
+       PR c++/45282
+       * typeck2.c (build_m_component_ref): Handle prvalue object.
+
 2013-03-26  Gabriel Dos Reis  <gdr@integrable-solutions.net>
 
        * cp-gimplify.c (cp_genericize_r): Use VAR_OR_FUNCTION_DECL_P.
index ca31610..72dccb4 100644 (file)
@@ -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 (file)
index 0000000..c317498
--- /dev/null
@@ -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;