aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2005-04-25 19:03:41 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2005-04-25 19:03:41 +0000
commit934790cc6719ae6f0d6a7f408cedba1acab9f93d (patch)
tree04c6f7b2baf3f9d03ae1167e9d3db012d53a4e00 /gcc/cp
parenteca5a6a939732c946f3ade566ae1dd4f3def37c3 (diff)
downloadgcc-934790cc6719ae6f0d6a7f408cedba1acab9f93d.zip
gcc-934790cc6719ae6f0d6a7f408cedba1acab9f93d.tar.gz
gcc-934790cc6719ae6f0d6a7f408cedba1acab9f93d.tar.bz2
c-common.def (EXPR_STMT): Remove, moved to C++ frontend.
./ * c-common.def (EXPR_STMT): Remove, moved to C++ frontend. * c-common.h (EXPR_STMT_EXPR): Don't define. (c_common_stmt_codes): Don't define. * c-dump.c (c_dump_tree): Remove EXPR_STMT case. * c-gimplify.c (gimplify_expr_stmt): Remove. (c_gimplify_expr): Remove EXPR_STMT case. * c-objc-common.c (c_objc_common_init): Remove stmt_codes and call to INIT_STATEMENT_CODES. * c-pretty-print.c (pp_c_statement): Just call dump_generic_node. cp/ * cp-tree.def: Add EXPR_STMT. * cp-tree.h (cp_stmt_codes): Add EXPR_STMT. (EXPR_STMT_EXPR): Define. * cp-gimplify.c: Include "flags.h". (gimplify_expr_stmt): New static function. (cp_gimplify_expr): Handle EXPR_STMT. * cxx-pretty-print.c (pp_cxx_statement): Use pp_cxx_expression rather than pp_expression. (pp_cxx_statement): Handle EXPR_STMT. * dump.c (cp_dump_tree): Handle EXPR_STMT. * lex.c (cxx_init): Don't use c_common_stmt_codes in stmt_codes initializer. From-SVN: r98731
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog15
-rw-r--r--gcc/cp/cp-gimplify.c41
-rw-r--r--gcc/cp/cp-tree.def4
-rw-r--r--gcc/cp/cp-tree.h6
-rw-r--r--gcc/cp/cxx-pretty-print.c18
-rw-r--r--gcc/cp/dump.c5
-rw-r--r--gcc/cp/lex.c1
7 files changed, 83 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 74b00a1..09677e8 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,18 @@
+2005-04-25 Ian Lance Taylor <ian@airs.com>
+
+ * cp-tree.def: Add EXPR_STMT.
+ * cp-tree.h (cp_stmt_codes): Add EXPR_STMT.
+ (EXPR_STMT_EXPR): Define.
+ * cp-gimplify.c: Include "flags.h".
+ (gimplify_expr_stmt): New static function.
+ (cp_gimplify_expr): Handle EXPR_STMT.
+ * cxx-pretty-print.c (pp_cxx_statement): Use pp_cxx_expression
+ rather than pp_expression.
+ (pp_cxx_statement): Handle EXPR_STMT.
+ * dump.c (cp_dump_tree): Handle EXPR_STMT.
+ * lex.c (cxx_init): Don't use c_common_stmt_codes in stmt_codes
+ initializer.
+
2005-04-25 Andrew Pinski <pinskia@physics.uc.edu>
PR C++/21188
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index 4d8880a..fc8c1af 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -31,6 +31,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "tree-gimple.h"
#include "hashtab.h"
#include "pointer-set.h"
+#include "flags.h"
/* Local declarations. */
@@ -338,6 +339,41 @@ gimplify_switch_stmt (tree *stmt_p)
*stmt_p = finish_bc_block (bc_break, break_block, *stmt_p);
}
+/* Gimplify an EXPR_STMT node. */
+
+static void
+gimplify_expr_stmt (tree *stmt_p)
+{
+ tree stmt = EXPR_STMT_EXPR (*stmt_p);
+
+ if (stmt == error_mark_node)
+ stmt = NULL;
+
+ /* Gimplification of a statement expression will nullify the
+ statement if all its side effects are moved to *PRE_P and *POST_P.
+
+ In this case we will not want to emit the gimplified statement.
+ However, we may still want to emit a warning, so we do that before
+ gimplification. */
+ if (stmt && (extra_warnings || warn_unused_value))
+ {
+ if (!TREE_SIDE_EFFECTS (stmt))
+ {
+ if (!IS_EMPTY_STMT (stmt)
+ && !VOID_TYPE_P (TREE_TYPE (stmt))
+ && !TREE_NO_WARNING (stmt))
+ warning (0, "statement with no effect");
+ }
+ else if (warn_unused_value)
+ warn_if_unused_value (stmt, input_location);
+ }
+
+ if (stmt == NULL_TREE)
+ stmt = alloc_stmt_list ();
+
+ *stmt_p = stmt;
+}
+
/* Gimplify initialization from an AGGR_INIT_EXPR. */
static void
@@ -516,6 +552,11 @@ cp_gimplify_expr (tree *expr_p, tree *pre_p, tree *post_p)
ret = GS_ALL_DONE;
break;
+ case EXPR_STMT:
+ gimplify_expr_stmt (expr_p);
+ ret = GS_OK;
+ break;
+
default:
ret = c_gimplify_expr (expr_p, pre_p, post_p);
break;
diff --git a/gcc/cp/cp-tree.def b/gcc/cp/cp-tree.def
index 2c944de..705517a 100644
--- a/gcc/cp/cp-tree.def
+++ b/gcc/cp/cp-tree.def
@@ -305,6 +305,10 @@ DEFTREECODE (CONTINUE_STMT, "continue_stmt", tcc_statement, 0)
SWITCH_STMT_COND, SWITCH_STMT_BODY and SWITCH_STMT_TYPE, respectively. */
DEFTREECODE (SWITCH_STMT, "switch_stmt", tcc_statement, 3)
+/* Used to represent an expression statement. Use `EXPR_STMT_EXPR' to
+ obtain the expression. */
+DEFTREECODE (EXPR_STMT, "expr_stmt", tcc_expression, 1)
+
DEFTREECODE (TAG_DEFN, "tag_defn", tcc_expression, 0)
/* Template instantiation level node.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index aba46f4..05b28dd 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -852,7 +852,7 @@ enum cplus_tree_code {
EH_SPEC_BLOCK, USING_STMT, TAG_DEFN, \
IF_STMT, CLEANUP_STMT, FOR_STMT, \
WHILE_STMT, DO_STMT, BREAK_STMT, \
- CONTINUE_STMT, SWITCH_STMT
+ CONTINUE_STMT, SWITCH_STMT, EXPR_STMT
enum languages { lang_c, lang_cplusplus, lang_java };
/* Macros to make error reporting functions' lives easier. */
@@ -2949,6 +2949,10 @@ struct lang_decl GTY(())
/* STMT_EXPR accessor. */
#define STMT_EXPR_STMT(NODE) TREE_OPERAND (STMT_EXPR_CHECK (NODE), 0)
+/* EXPR_STMT accessor. This gives the expression associated with an
+ expression statement. */
+#define EXPR_STMT_EXPR(NODE) TREE_OPERAND (EXPR_STMT_CHECK (NODE), 0)
+
/* An enumeration of the kind of tags that C++ accepts. */
enum tag_types {
none_type = 0, /* Not a tag type. */
diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c
index 2bffb73..0ad1e9a 100644
--- a/gcc/cp/cxx-pretty-print.c
+++ b/gcc/cp/cxx-pretty-print.c
@@ -1587,7 +1587,7 @@ pp_cxx_statement (cxx_pretty_printer *pp, tree t)
pp_cxx_identifier (pp, "switch");
pp_space (pp);
pp_cxx_left_paren (pp);
- pp_expression (pp, SWITCH_STMT_COND (t));
+ pp_cxx_expression (pp, SWITCH_STMT_COND (t));
pp_cxx_right_paren (pp);
pp_indentation (pp) += 3;
pp_needs_newline (pp) = true;
@@ -1604,7 +1604,7 @@ pp_cxx_statement (cxx_pretty_printer *pp, tree t)
pp_cxx_identifier (pp, "while");
pp_space (pp);
pp_cxx_left_paren (pp);
- pp_expression (pp, WHILE_COND (t));
+ pp_cxx_expression (pp, WHILE_COND (t));
pp_cxx_right_paren (pp);
pp_newline_and_indent (pp, 3);
pp_cxx_statement (pp, WHILE_BODY (t));
@@ -1620,7 +1620,7 @@ pp_cxx_statement (cxx_pretty_printer *pp, tree t)
pp_cxx_identifier (pp, "while");
pp_space (pp);
pp_cxx_left_paren (pp);
- pp_expression (pp, DO_COND (t));
+ pp_cxx_expression (pp, DO_COND (t));
pp_cxx_right_paren (pp);
pp_cxx_semicolon (pp);
pp_needs_newline (pp) = true;
@@ -1637,12 +1637,12 @@ pp_cxx_statement (cxx_pretty_printer *pp, tree t)
pp_needs_newline (pp) = false;
pp_cxx_whitespace (pp);
if (FOR_COND (t))
- pp_expression (pp, FOR_COND (t));
+ pp_cxx_expression (pp, FOR_COND (t));
pp_cxx_semicolon (pp);
pp_needs_newline (pp) = false;
pp_cxx_whitespace (pp);
if (FOR_EXPR (t))
- pp_expression (pp, FOR_EXPR (t));
+ pp_cxx_expression (pp, FOR_EXPR (t));
pp_cxx_right_paren (pp);
pp_newline_and_indent (pp, 3);
pp_cxx_statement (pp, FOR_BODY (t));
@@ -1661,6 +1661,14 @@ pp_cxx_statement (cxx_pretty_printer *pp, tree t)
pp_needs_newline (pp) = true;
break;
+ /* expression-statement:
+ expression(opt) ; */
+ case EXPR_STMT:
+ pp_cxx_expression (pp, EXPR_STMT_EXPR (t));
+ pp_cxx_semicolon (pp);
+ pp_needs_newline (pp) = true;
+ break;
+
case CLEANUP_STMT:
pp_cxx_identifier (pp, "try");
pp_newline_and_indent (pp, 2);
diff --git a/gcc/cp/dump.c b/gcc/cp/dump.c
index 20c7ace..6b93045 100644
--- a/gcc/cp/dump.c
+++ b/gcc/cp/dump.c
@@ -459,6 +459,11 @@ cp_dump_tree (void* dump_info, tree t)
dump_child ("stmt", STMT_EXPR_STMT (t));
break;
+ case EXPR_STMT:
+ dump_stmt (di, t);
+ dump_child ("expr", EXPR_STMT_EXPR (t));
+ break;
+
default:
break;
}
diff --git a/gcc/cp/lex.c b/gcc/cp/lex.c
index 9e39241..c5f21d1 100644
--- a/gcc/cp/lex.c
+++ b/gcc/cp/lex.c
@@ -320,7 +320,6 @@ bool
cxx_init (void)
{
static const enum tree_code stmt_codes[] = {
- c_common_stmt_codes,
cp_stmt_codes
};