diff options
author | Jason Merrill <jason@redhat.com> | 2007-08-28 12:58:59 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2007-08-28 12:58:59 -0400 |
commit | c2acde1ee12b2e11765fb43c861c71663768eba4 (patch) | |
tree | cbbf22bab4a8353161a0cf07e3f3e790d18fc79c /gcc | |
parent | 0a8fc2475a662ae69dbc0e8d964fe9489a595fde (diff) | |
download | gcc-c2acde1ee12b2e11765fb43c861c71663768eba4.zip gcc-c2acde1ee12b2e11765fb43c861c71663768eba4.tar.gz gcc-c2acde1ee12b2e11765fb43c861c71663768eba4.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 1 | ||||
-rw-r--r-- | gcc/cp/pt.c | 5 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/stmtexpr12.C | 7 |
6 files changed, 41 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c6b2aaf..a56349b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -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. diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index d196ddc..e07c0bd 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -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); diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index e33197c..e1eda24 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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) diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 583ce33..9faa413 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6254d20..64225d1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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. diff --git a/gcc/testsuite/g++.dg/ext/stmtexpr12.C b/gcc/testsuite/g++.dg/ext/stmtexpr12.C new file mode 100644 index 0000000..c35f41b --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr12.C @@ -0,0 +1,7 @@ +// PR c++/29000 +// { dg-options "" } + +template<int> int foo() +{ + return ({foo;})==0; // { dg-error "insufficient context" } +} |