re PR c++/63601 (Segfault on usage of 'this' in unevaluated context inside lambda)

PR c++/63601
	* lambda.c (current_nonlambda_function): New.
	* semantics.c (finish_this_expr): Use it.
	* cp-tree.h: Declare it.

From-SVN: r216488
This commit is contained in:
Jason Merrill 2014-10-20 13:29:02 -04:00 committed by Jason Merrill
parent 64dbfdec39
commit 2bf492a1a4
5 changed files with 36 additions and 19 deletions

View File

@ -1,3 +1,10 @@
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

View File

@ -5961,6 +5961,7 @@ extern bool is_normal_capture_proxy (tree);
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);

View File

@ -777,6 +777,17 @@ maybe_resolve_dummy (tree object, bool add_capture_p)
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. */

View File

@ -2438,7 +2438,7 @@ finish_increment_expr (tree expr, enum tree_code code)
tree
finish_this_expr (void)
{
tree result;
tree result = NULL_TREE;
if (current_class_ptr)
{
@ -2450,25 +2450,19 @@ finish_this_expr (void)
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;
}
if (result)
/* The keyword 'this' is a prvalue expression. */
return rvalue (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
{
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);
return result;
error ("invalid use of %<this%> at top level");
return error_mark_node;
}
/* Finish a pseudo-destructor expression. If SCOPE is NULL, the

View File

@ -0,0 +1,4 @@
// PR c++/63601
// { dg-do compile { target c++11 } }
auto f = []{ sizeof(this); }; // { dg-error "this" }