summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorfroydnj <froydnj@138bc75d-0d04-0410-961f-82ee72b054a4>2011-04-14 15:13:26 +0000
committerfroydnj <froydnj@138bc75d-0d04-0410-961f-82ee72b054a4>2011-04-14 15:13:26 +0000
commite45c9c5559efedcd9915fb58d7baa9573addc763 (patch)
treefc965b46ea0d94f0b61f89e0efa758b5a4ba1979 /gcc
parent884a66e43cc9ffde85050b758f03604fbeaee8e0 (diff)
downloadgcc-e45c9c5559efedcd9915fb58d7baa9573addc763.tar.gz
* cp-tree.def (FOR_STMT, RANGE_FOR_STMT): Add an extra operand.
* cp-objcp-common.c (cp_common_init_ts): Mark them as TS_TYPED. * cp-tree.h (FOR_SCOPE, RANGE_FOR_SCOPE): Define. * semantics.c (begin_for_stmt): Pass an extra arg to build_stmt. Use FOR_SCOPE instead of TREE_CHAIN. (begin_range_for_stmt): Likewise, with RANGE_FOR_SCOPE. (finish_for_stmt): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@172436 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog10
-rw-r--r--gcc/cp/cp-objcp-common.c4
-rw-r--r--gcc/cp/cp-tree.def8
-rw-r--r--gcc/cp/cp-tree.h4
-rw-r--r--gcc/cp/semantics.c16
5 files changed, 29 insertions, 13 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 33502e5dab6..719b1a1c5a7 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,13 @@
+2011-04-14 Nathan Froyd <froydnj@codesourcery.com>
+
+ * cp-tree.def (FOR_STMT, RANGE_FOR_STMT): Add an extra operand.
+ * cp-objcp-common.c (cp_common_init_ts): Mark them as TS_TYPED.
+ * cp-tree.h (FOR_SCOPE, RANGE_FOR_SCOPE): Define.
+ * semantics.c (begin_for_stmt): Pass an extra arg to build_stmt.
+ Use FOR_SCOPE instead of TREE_CHAIN.
+ (begin_range_for_stmt): Likewise, with RANGE_FOR_SCOPE.
+ (finish_for_stmt): Likewise.
+
2011-04-14 Jason Merrill <jason@redhat.com>
* parser.c (cp_parser_postfix_expression): Fix flags passed to
diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c
index 6a7f4008266..38d341595d9 100644
--- a/gcc/cp/cp-objcp-common.c
+++ b/gcc/cp/cp-objcp-common.c
@@ -236,7 +236,6 @@ cp_common_init_ts (void)
MARK_TS_COMMON (TEMPLATE_PARM_INDEX);
MARK_TS_COMMON (OVERLOAD);
MARK_TS_COMMON (TEMPLATE_INFO);
- MARK_TS_COMMON (FOR_STMT);
MARK_TS_COMMON (TYPENAME_TYPE);
MARK_TS_COMMON (TYPEOF_TYPE);
MARK_TS_COMMON (IF_STMT);
@@ -247,8 +246,9 @@ cp_common_init_ts (void)
MARK_TS_COMMON (DECLTYPE_TYPE);
MARK_TS_COMMON (BOUND_TEMPLATE_TEMPLATE_PARM);
MARK_TS_COMMON (UNBOUND_CLASS_TEMPLATE);
- MARK_TS_COMMON (RANGE_FOR_STMT);
+ MARK_TS_TYPED (FOR_STMT);
+ MARK_TS_TYPED (RANGE_FOR_STMT);
MARK_TS_TYPED (AGGR_INIT_EXPR);
MARK_TS_TYPED (EXPR_STMT);
MARK_TS_TYPED (EH_SPEC_BLOCK);
diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def
index 509d5e7ee46..fdfe9b5110e 100644
--- a/gcc/cp/cp-tree.def
+++ b/gcc/cp/cp-tree.def
@@ -291,12 +291,12 @@ DEFTREECODE (IF_STMT, "if_stmt", tcc_statement, 3)
/* Used to represent a `for' statement. The operands are
FOR_INIT_STMT, FOR_COND, FOR_EXPR, and FOR_BODY, respectively. */
-DEFTREECODE (FOR_STMT, "for_stmt", tcc_statement, 4)
+DEFTREECODE (FOR_STMT, "for_stmt", tcc_statement, 5)
/* Used to represent a range-based `for' statement. The operands are
- RANGE_FOR_DECL, RANGE_FOR_EXPR, RANGE_FOR_BODY, respectively. Only used
- in templates. */
-DEFTREECODE (RANGE_FOR_STMT, "range_for_stmt", tcc_statement, 3)
+ RANGE_FOR_DECL, RANGE_FOR_EXPR, RANGE_FOR_BODY, and RANGE_FOR_SCOPE,
+ respectively. Only used in templates. */
+DEFTREECODE (RANGE_FOR_STMT, "range_for_stmt", tcc_statement, 4)
/* Used to represent a 'while' statement. The operands are WHILE_COND
and WHILE_BODY, respectively. */
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 3ca44c2681e..aab05b62e2d 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -3810,12 +3810,14 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
#define FOR_COND(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 1)
#define FOR_EXPR(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 2)
#define FOR_BODY(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 3)
+#define FOR_SCOPE(NODE) TREE_OPERAND (FOR_STMT_CHECK (NODE), 4)
/* RANGE_FOR_STMT accessors. These give access to the declarator,
- expression and body of the statement, respectively. */
+ expression, body, and scope of the statement, respectively. */
#define RANGE_FOR_DECL(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 0)
#define RANGE_FOR_EXPR(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 1)
#define RANGE_FOR_BODY(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 2)
+#define RANGE_FOR_SCOPE(NODE) TREE_OPERAND (RANGE_FOR_STMT_CHECK (NODE), 3)
#define SWITCH_STMT_COND(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 0)
#define SWITCH_STMT_BODY(NODE) TREE_OPERAND (SWITCH_STMT_CHECK (NODE), 1)
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 738375cf031..b0dcb2b775a 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -856,7 +856,7 @@ begin_for_stmt (tree scope, tree init)
tree r;
r = build_stmt (input_location, FOR_STMT, NULL_TREE, NULL_TREE,
- NULL_TREE, NULL_TREE);
+ NULL_TREE, NULL_TREE, NULL_TREE);
if (scope == NULL_TREE)
{
@@ -865,7 +865,7 @@ begin_for_stmt (tree scope, tree init)
scope = begin_for_scope (&init);
}
FOR_INIT_STMT (r) = init;
- TREE_CHAIN (r) = scope;
+ FOR_SCOPE (r) = scope;
return r;
}
@@ -940,8 +940,12 @@ finish_for_stmt (tree for_stmt)
/* Pop the scope for the body of the loop. */
if (flag_new_for_scope > 0)
{
- tree scope = TREE_CHAIN (for_stmt);
- TREE_CHAIN (for_stmt) = NULL;
+ tree scope;
+ tree *scope_ptr = (TREE_CODE (for_stmt) == RANGE_FOR_STMT
+ ? &RANGE_FOR_SCOPE (for_stmt)
+ : &FOR_SCOPE (for_stmt));
+ scope = *scope_ptr;
+ *scope_ptr = NULL;
add_stmt (do_poplevel (scope));
}
@@ -959,7 +963,7 @@ begin_range_for_stmt (tree scope, tree init)
tree r;
r = build_stmt (input_location, RANGE_FOR_STMT,
- NULL_TREE, NULL_TREE, NULL_TREE);
+ NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE);
if (scope == NULL_TREE)
{
@@ -972,7 +976,7 @@ begin_range_for_stmt (tree scope, tree init)
pop it now. */
if (init)
pop_stmt_list (init);
- TREE_CHAIN (r) = scope;
+ RANGE_FOR_SCOPE (r) = scope;
return r;
}