re PR c++/45282 (wrong decltype result for .*)

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

From-SVN: r197130
This commit is contained in:
Jason Merrill 2013-03-26 23:01:34 -04:00 committed by Jason Merrill
parent a323d79533
commit 845367eb3b
3 changed files with 19 additions and 2 deletions

View 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> 2013-03-26 Gabriel Dos Reis <gdr@integrable-solutions.net>
* cp-gimplify.c (cp_genericize_r): Use VAR_OR_FUNCTION_DECL_P. * cp-gimplify.c (cp_genericize_r): Use VAR_OR_FUNCTION_DECL_P.

View File

@ -1671,7 +1671,7 @@ build_m_component_ref (tree datum, tree component, tsubst_flags_t complain)
if (TYPE_PTRDATAMEM_P (ptrmem_type)) if (TYPE_PTRDATAMEM_P (ptrmem_type))
{ {
bool is_lval = real_lvalue_p (datum); cp_lvalue_kind kind = lvalue_kind (datum);
tree ptype; tree ptype;
/* Compute the type of the field, as described in [expr.ref]. /* 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; return error_mark_node;
/* If the object expression was an rvalue, return an rvalue. */ /* 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); datum = move (datum);
return datum; return datum;
} }

View File

@ -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;