Commit 374b2837 by Jason Merrill Committed by Jason Merrill

re PR c++/56701 ([C++11] The *this* pointer fails to bind to rvalue reference to pointer type)

	PR c++/56701
	* semantics.c (finish_this_expr): 'this' is an rvalue.
	* typeck.c (cp_build_indirect_ref): Handle NOP_EXPR of 'this'.

From-SVN: r197212
parent fad882c6
2013-03-28 Jason Merrill <jason@redhat.com>
PR c++/56701
* semantics.c (finish_this_expr): 'this' is an rvalue.
* typeck.c (cp_build_indirect_ref): Handle NOP_EXPR of 'this'.
PR c++/56710
* semantics.c (finish_member_declaration): Don't push closure
members.
......
......@@ -2297,7 +2297,6 @@ finish_this_expr (void)
result = lambda_expr_this_capture (CLASSTYPE_LAMBDA_EXPR (type));
else
result = current_class_ptr;
}
else if (current_function_decl
&& DECL_STATIC_FUNCTION_P (current_function_decl))
......@@ -2314,6 +2313,9 @@ finish_this_expr (void)
result = error_mark_node;
}
/* The keyword 'this' is a prvalue expression. */
result = rvalue (result);
return result;
}
......
......@@ -2843,7 +2843,11 @@ cp_build_indirect_ref (tree ptr, ref_operator errorstring,
{
tree pointer, type;
if (ptr == current_class_ptr)
if (ptr == current_class_ptr
|| (TREE_CODE (ptr) == NOP_EXPR
&& TREE_OPERAND (ptr, 0) == current_class_ptr
&& (same_type_ignoring_top_level_qualifiers_p
(TREE_TYPE (ptr), TREE_TYPE (current_class_ptr)))))
return current_class_ref;
pointer = (TREE_CODE (TREE_TYPE (ptr)) == REFERENCE_TYPE
......
// PR c++/56701
// { dg-require-effective-target c++11 }
struct A
{
void f(){ A*&& a = this; }
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment