aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-iterator.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/tree-iterator.c')
-rw-r--r--gcc/tree-iterator.c97
1 files changed, 60 insertions, 37 deletions
diff --git a/gcc/tree-iterator.c b/gcc/tree-iterator.c
index 507e24d..1e7a682 100644
--- a/gcc/tree-iterator.c
+++ b/gcc/tree-iterator.c
@@ -299,66 +299,89 @@ tsi_split_statement_list_before (tree_stmt_iterator *i)
/* Return the first expression in a sequence of COMPOUND_EXPRs,
or in a STATEMENT_LIST. */
+#define EXPR_FIRST_BODY do { \
+ if (expr == NULL_TREE) \
+ return expr; \
+ if (TREE_CODE (expr) == STATEMENT_LIST) \
+ { \
+ struct tree_statement_list_node *n = STATEMENT_LIST_HEAD (expr); \
+ return n ? n->stmt : NULL_TREE; \
+ } \
+ while (TREE_CODE (expr) == COMPOUND_EXPR) \
+ expr = TREE_OPERAND (expr, 0); \
+ return expr; \
+} while (0)
+
tree
expr_first (tree expr)
{
- if (expr == NULL_TREE)
- return expr;
-
- if (TREE_CODE (expr) == STATEMENT_LIST)
- {
- struct tree_statement_list_node *n = STATEMENT_LIST_HEAD (expr);
- return n ? n->stmt : NULL_TREE;
- }
+ EXPR_FIRST_BODY;
+}
- while (TREE_CODE (expr) == COMPOUND_EXPR)
- expr = TREE_OPERAND (expr, 0);
- return expr;
+const_tree
+const_expr_first (const_tree expr)
+{
+ EXPR_FIRST_BODY;
}
/* Return the last expression in a sequence of COMPOUND_EXPRs,
or in a STATEMENT_LIST. */
+#define EXPR_LAST_BODY do { \
+ if (expr == NULL_TREE) \
+ return expr;\
+ if (TREE_CODE (expr) == STATEMENT_LIST) \
+ { \
+ struct tree_statement_list_node *n = STATEMENT_LIST_TAIL (expr); \
+ return n ? n->stmt : NULL_TREE; \
+ } \
+ while (TREE_CODE (expr) == COMPOUND_EXPR) \
+ expr = TREE_OPERAND (expr, 1); \
+ return expr; \
+} while (0)
+
tree
expr_last (tree expr)
{
- if (expr == NULL_TREE)
- return expr;
-
- if (TREE_CODE (expr) == STATEMENT_LIST)
- {
- struct tree_statement_list_node *n = STATEMENT_LIST_TAIL (expr);
- return n ? n->stmt : NULL_TREE;
- }
+ EXPR_LAST_BODY;
+}
- while (TREE_CODE (expr) == COMPOUND_EXPR)
- expr = TREE_OPERAND (expr, 1);
- return expr;
+const_tree
+const_expr_last (const_tree expr)
+{
+ EXPR_LAST_BODY;
}
/* If EXPR is a single statement return it. If EXPR is a
STATEMENT_LIST containing exactly one statement S, return S.
Otherwise, return NULL. */
+#define EXPR_ONLY_BODY do { \
+ if (expr == NULL_TREE) \
+ return NULL_TREE; \
+ if (TREE_CODE (expr) == STATEMENT_LIST) \
+ { \
+ struct tree_statement_list_node *n = STATEMENT_LIST_TAIL (expr); \
+ if (n && STATEMENT_LIST_HEAD (expr) == n) \
+ return n->stmt; \
+ else \
+ return NULL_TREE; \
+ } \
+ if (TREE_CODE (expr) == COMPOUND_EXPR) \
+ return NULL_TREE; \
+ return expr; \
+} while (0)
+
tree
expr_only (tree expr)
{
- if (expr == NULL_TREE)
- return NULL_TREE;
-
- if (TREE_CODE (expr) == STATEMENT_LIST)
- {
- struct tree_statement_list_node *n = STATEMENT_LIST_TAIL (expr);
- if (n && STATEMENT_LIST_HEAD (expr) == n)
- return n->stmt;
- else
- return NULL_TREE;
- }
-
- if (TREE_CODE (expr) == COMPOUND_EXPR)
- return NULL_TREE;
+ EXPR_ONLY_BODY;
+}
- return expr;
+const_tree
+const_expr_only (const_tree expr)
+{
+ EXPR_ONLY_BODY;
}
#include "gt-tree-iterator.h"