Commit c2acde1e by Jason Merrill Committed by Jason Merrill

re PR c++/29000 (ICE on invalid use of template in statement-expr)

        PR c++/29000
        * pt.c (build_non_dependent_expr, type_dependent_expression_p):
        Look inside STMT_EXPR.
        * semantics.c (stmt_expr_value_expr): New fn.
        * cp-tree.h: Declare it.
        * g++.dg/ext/stmtexpr12.C: New test.

From-SVN: r127868
parent 0a8fc247
......@@ -13,6 +13,12 @@
2007-08-27 Jason Merrill <jason@redhat.com>
PR c++/29000
* pt.c (build_non_dependent_expr, type_dependent_expression_p):
Look inside STMT_EXPR.
* semantics.c (stmt_expr_value_expr): New fn.
* cp-tree.h: Declare it.
PR c++/28558
* decl.c (groktypename): Ignore attributes applied to class type.
......
......@@ -4609,6 +4609,7 @@ extern tree finish_non_static_data_member (tree, tree, tree);
extern tree begin_stmt_expr (void);
extern tree finish_stmt_expr_expr (tree, tree);
extern tree finish_stmt_expr (tree, bool);
extern tree stmt_expr_value_expr (tree);
extern tree perform_koenig_lookup (tree, tree);
extern tree finish_call_expr (tree, tree, bool, bool);
extern tree finish_increment_expr (tree, enum tree_code);
......
......@@ -15277,6 +15277,9 @@ type_dependent_expression_p (tree expression)
&& !DECL_TEMPLATE_TEMPLATE_PARM_P (expression))
return false;
if (TREE_CODE (expression) == STMT_EXPR)
expression = stmt_expr_value_expr (expression);
if (TREE_TYPE (expression) == unknown_type_node)
{
if (TREE_CODE (expression) == ADDR_EXPR)
......@@ -15617,6 +15620,8 @@ build_non_dependent_expr (tree expr)
/* Preserve OVERLOADs; the functions must be available to resolve
types. */
inner_expr = expr;
if (TREE_CODE (inner_expr) == STMT_EXPR)
inner_expr = stmt_expr_value_expr (inner_expr);
if (TREE_CODE (inner_expr) == ADDR_EXPR)
inner_expr = TREE_OPERAND (inner_expr, 0);
if (TREE_CODE (inner_expr) == COMPONENT_REF)
......
......@@ -1754,6 +1754,25 @@ finish_stmt_expr (tree stmt_expr, bool has_no_scope)
return result;
}
/* Returns the expression which provides the value of STMT_EXPR. */
tree
stmt_expr_value_expr (tree stmt_expr)
{
tree t = STMT_EXPR_STMT (stmt_expr);
if (TREE_CODE (t) == BIND_EXPR)
t = BIND_EXPR_BODY (t);
if (TREE_CODE (t) == STATEMENT_LIST)
t = STATEMENT_LIST_TAIL (t)->stmt;
if (TREE_CODE (t) == EXPR_STMT)
t = EXPR_STMT_EXPR (t);
return t;
}
/* Perform Koenig lookup. FN is the postfix-expression representing
the function (or functions) to call; ARGS are the arguments to the
call. Returns the functions to be considered by overload
......
......@@ -20,6 +20,9 @@
2007-08-28 Jason Merrill <jason@redhat.com>
PR c++/29000
* g++.dg/ext/stmtexpr12.C: New test.
PR c++/28558
* g++.dg/ext/attrib28.C: New test.
// PR c++/29000
// { dg-options "" }
template<int> int foo()
{
return ({foo;})==0; // { dg-error "insufficient context" }
}
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