From ffc6c45354d2c6fdb55d9c044fe11981dbb58530 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 28 Aug 2007 16:58:59 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127868 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/cp-tree.h | 1 + gcc/cp/pt.c | 5 +++++ gcc/cp/semantics.c | 19 +++++++++++++++++++ gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/ext/stmtexpr12.C | 7 +++++++ 6 files changed, 41 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ext/stmtexpr12.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c6b2aaf8265..a56349b5402 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -13,6 +13,12 @@ 2007-08-27 Jason Merrill + 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 d196ddca1e3..e07c0bd40b5 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 e33197c5c45..e1eda243c2d 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 583ce33a23b..9faa413b376 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 6254d202c49..64225d1d71c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -20,6 +20,9 @@ 2007-08-28 Jason Merrill + 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 00000000000..c35f41b0cc5 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/stmtexpr12.C @@ -0,0 +1,7 @@ +// PR c++/29000 +// { dg-options "" } + +template int foo() +{ + return ({foo;})==0; // { dg-error "insufficient context" } +} -- 2.11.4.GIT