+2014-10-20 Jason Merrill <jason@redhat.com>
+
+ PR c++/63601
+ * lambda.c (current_nonlambda_function): New.
+ * semantics.c (finish_this_expr): Use it.
+ * cp-tree.h: Declare it.
+
2014-10-17 Alan Modra <amodra@gmail.com>
PR middle-end/61848
extern void register_capture_members (tree);
extern tree lambda_expr_this_capture (tree, bool);
extern tree maybe_resolve_dummy (tree, bool);
+extern tree current_nonlambda_function (void);
extern tree nonlambda_method_basetype (void);
extern void maybe_add_lambda_conv_op (tree);
extern bool is_lambda_ignored_entity (tree);
return object;
}
+/* Returns the innermost non-lambda function. */
+
+tree
+current_nonlambda_function (void)
+{
+ tree fn = current_function_decl;
+ while (fn && LAMBDA_FUNCTION_P (fn))
+ fn = decl_function_context (fn);
+ return fn;
+}
+
/* Returns the method basetype of the innermost non-lambda function, or
NULL_TREE if none. */
tree
finish_this_expr (void)
{
- tree result;
+ tree result = NULL_TREE;
if (current_class_ptr)
{
else
result = current_class_ptr;
}
- else if (current_function_decl
- && DECL_STATIC_FUNCTION_P (current_function_decl))
- {
- error ("%<this%> is unavailable for static member functions");
- result = error_mark_node;
- }
- else
- {
- if (current_function_decl)
- error ("invalid use of %<this%> in non-member function");
- else
- error ("invalid use of %<this%> at top level");
- result = error_mark_node;
- }
- /* The keyword 'this' is a prvalue expression. */
- result = rvalue (result);
+ if (result)
+ /* The keyword 'this' is a prvalue expression. */
+ return rvalue (result);
- return result;
+ tree fn = current_nonlambda_function ();
+ if (fn && DECL_STATIC_FUNCTION_P (fn))
+ error ("%<this%> is unavailable for static member functions");
+ else if (fn)
+ error ("invalid use of %<this%> in non-member function");
+ else
+ error ("invalid use of %<this%> at top level");
+ return error_mark_node;
}
/* Finish a pseudo-destructor expression. If SCOPE is NULL, the