2011-06-14 Jason Merrill <jason@redhat.com>
+ PR c++/49389
+ * typeck2.c (build_m_component_ref): Preserve rvalueness.
+
PR c++/49369
* class.c (build_base_path): Fix cv-quals in unevaluated context.
if (TYPE_PTRMEM_P (ptrmem_type))
{
+ bool is_lval = real_lvalue_p (datum);
tree ptype;
/* Compute the type of the field, as described in [expr.ref].
datum = build2 (POINTER_PLUS_EXPR, ptype,
fold_convert (ptype, datum),
build_nop (sizetype, component));
- return cp_build_indirect_ref (datum, RO_NULL, tf_warning_or_error);
+ datum = cp_build_indirect_ref (datum, RO_NULL, tf_warning_or_error);
+ /* If the object expression was an rvalue, return an rvalue. */
+ if (!is_lval)
+ datum = move (datum);
+ return datum;
}
else
return build2 (OFFSET_REF, type, datum, component);
--- /dev/null
+// PR c++/49389
+// { dg-options -std=c++0x }
+
+template<class T> T&& val();
+
+struct A {};
+
+typedef decltype(val<A>().*val<int A::*>()) type;
+
+template<class> struct assert_type;
+template<> struct assert_type<int&&> {};
+
+assert_type<type> test;