aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2007-08-28 12:58:59 -0400
committerJason Merrill <jason@gcc.gnu.org>2007-08-28 12:58:59 -0400
commitc2acde1ee12b2e11765fb43c861c71663768eba4 (patch)
treecbbf22bab4a8353161a0cf07e3f3e790d18fc79c
parent0a8fc2475a662ae69dbc0e8d964fe9489a595fde (diff)
downloadgcc-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
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/cp-tree.h1
-rw-r--r--gcc/cp/pt.c5
-rw-r--r--gcc/cp/semantics.c19
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/ext/stmtexpr12.C7
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" }
+}