Hi,
yesterday I noticed that, as I vaguely suspected for quite some time,
error_operand_p can be useful also outside the c++ front-end. The below,
which I bootstrapped c, c++, go, on x86_64-linux (and I'm finishing
testing) tries to do that, moving the macro one level up and using it in
all the suitable places I spotted.
What do people think?
Thanks,
Paolo.
////////////////////
/gcc/cp
2011-06-10 Paolo Carlini <paolo.carl...@oracle.com>
* cp-tree.h (error_operand_p): Remove.
/gcc
2011-06-10 Paolo Carlini <paolo.carl...@oracle.com>
* tree.h (error_operand_p): Add.
* dbxout.c (dbxout_type_fields): Use the latter.
* c-decl.c (add_stmt): Likewise.
* gimplify.c (omp_add_variable, omp_notice_variable,
gimplify_scan_omp_clauses): Likewise.
/gcc/go
2011-06-10 Paolo Carlini <paolo.carl...@oracle.com>
* gofrontend/expressions.cc (Expression::convert_for_assignment,
Call_expression::do_get_tree,
Struct_construction_expression::do_get_tree): Use error_operand_p.
Index: tree.h
===================================================================
--- tree.h (revision 174893)
+++ tree.h (working copy)
@@ -4053,6 +4053,12 @@ enum ptrmemfunc_vbit_where_t
#define NULL_TREE (tree) NULL
+/* True if NODE is an erroneous expression. */
+
+#define error_operand_p(NODE) \
+ ((NODE) == error_mark_node \
+ || ((NODE) && TREE_TYPE ((NODE)) == error_mark_node))
+
extern tree decl_assembler_name (tree);
extern bool decl_assembler_name_equal (tree decl, const_tree asmname);
extern hashval_t decl_assembler_name_hash (const_tree asmname);
Index: cp/cp-tree.h
===================================================================
--- cp/cp-tree.h (revision 174893)
+++ cp/cp-tree.h (working copy)
@@ -1123,12 +1123,6 @@ struct GTY(()) language_function {
#define ansi_assopname(CODE) \
(assignment_operator_name_info[(int) (CODE)].identifier)
-/* True if NODE is an erroneous expression. */
-
-#define error_operand_p(NODE) \
- ((NODE) == error_mark_node \
- || ((NODE) && TREE_TYPE ((NODE)) == error_mark_node))
-
/* TRUE if a tree code represents a statement. */
extern bool statement_code_p[MAX_TREE_CODES];
Index: dbxout.c
===================================================================
--- dbxout.c (revision 174893)
+++ dbxout.c (working copy)
@@ -1510,7 +1510,7 @@ dbxout_type_fields (tree type)
{
/* If one of the nodes is an error_mark or its type is then
return early. */
- if (tem == error_mark_node || TREE_TYPE (tem) == error_mark_node)
+ if (error_operand_p (tem))
return;
/* Omit here local type decls until we know how to support them. */
Index: go/gofrontend/expressions.cc
===================================================================
--- go/gofrontend/expressions.cc (revision 174893)
+++ go/gofrontend/expressions.cc (working copy)
@@ -209,7 +209,7 @@ Expression::convert_for_assignment(Translate_conte
if (lhs_type->is_error() || rhs_type->is_error())
return error_mark_node;
- if (rhs_tree == error_mark_node || TREE_TYPE(rhs_tree) == error_mark_node)
+ if (error_operand_p (rhs_tree))
return error_mark_node;
Gogo* gogo = context->gogo();
@@ -8967,7 +8967,7 @@ Call_expression::do_get_tree(Translate_context* co
else
go_unreachable();
- if (fn == error_mark_node || TREE_TYPE(fn) == error_mark_node)
+ if (error_operand_p (fn))
{
delete[] args;
return error_mark_node;
@@ -11004,7 +11004,7 @@ Struct_construction_expression::do_get_tree(Transl
++pv;
}
- if (val == error_mark_node || TREE_TYPE(val) == error_mark_node)
+ if (error_operand_p (val))
return error_mark_node;
constructor_elt* elt = VEC_quick_push(constructor_elt, elts, NULL);
Index: c-decl.c
===================================================================
--- c-decl.c (revision 174893)
+++ c-decl.c (working copy)
@@ -565,7 +565,7 @@ add_stmt (tree t)
static bool
decl_jump_unsafe (tree decl)
{
- if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
+ if (error_operand_p (decl))
return false;
/* Always warn about crossing variably modified types. */
Index: gimplify.c
===================================================================
--- gimplify.c (revision 174893)
+++ gimplify.c (working copy)
@@ -5448,7 +5448,7 @@ omp_add_variable (struct gimplify_omp_ctx *ctx, tr
unsigned int nflags;
tree t;
- if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
+ if (error_operand_p (decl))
return;
/* Never elide decls whose type has TREE_ADDRESSABLE set. This means
@@ -5573,7 +5573,7 @@ omp_notice_variable (struct gimplify_omp_ctx *ctx,
unsigned flags = in_code ? GOVD_SEEN : 0;
bool ret = false, shared;
- if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
+ if (error_operand_p (decl))
return false;
/* Threadprivate variables are predetermined. */
@@ -5830,7 +5830,7 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_se
do_add:
decl = OMP_CLAUSE_DECL (c);
- if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
+ if (error_operand_p (decl))
{
remove = true;
break;
@@ -5889,7 +5889,7 @@ gimplify_scan_omp_clauses (tree *list_p, gimple_se
case OMP_CLAUSE_COPYIN:
case OMP_CLAUSE_COPYPRIVATE:
decl = OMP_CLAUSE_DECL (c);
- if (decl == error_mark_node || TREE_TYPE (decl) == error_mark_node)
+ if (error_operand_p (decl))
{
remove = true;
break;