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.
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))
result = error_mark_node;
}
+ /* The keyword 'this' is a prvalue expression. */
+ result = rvalue (result);
+
return result;
}
{
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
--- /dev/null
+// PR c++/56701
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+ void f(){ A*&& a = this; }
+};