summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4>2003-04-03 15:42:16 +0000
committerghazi <ghazi@138bc75d-0d04-0410-961f-82ee72b054a4>2003-04-03 15:42:16 +0000
commit4fa0b096fecff8fd63e8cab50890ce1de2995a93 (patch)
treed3d44863b6742a605d5b7492dbb65562073f1f4c
parent7b259c7a4a8c4c0983ca8ecfe3fbb4bb2fb51244 (diff)
downloadgcc-4fa0b096fecff8fd63e8cab50890ce1de2995a93.tar.gz
gcc:
* gengtype-lex.l (IWORD): Add CHAR_BITFIELD. * system.h (CHAR_BITFIELD): New. cp: * operators.def (DEF_SIMPLE_OPERATOR, DEF_ASSN_OPERATOR, DEF_ASSN_OPERATOR): Delete spurious semi-colon. * rtti.c (dfs_class_hint_mark): Likewise. * decl.c (push_local_name, push_class_level_binding, maybe_inject_for_scope_var): Don't use POP_TIMEVAR_AND_RETURN in functions returning void. * decl2.c (add_using_namespace): Likewise. * decl.c (print_binding_level, print_other_binding_stack, print_binding_stack): Cast argument of %p specifier to void*. * ptree.c (cxx_print_decl): Likewise. * cp-tree.h (VAR_OR_FUNCTION_DECL_CHECK, VAR_FUNCTION_OR_PARM_DECL_CHECK, VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK, RECORD_OR_UNION_TYPE_CHECK, BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK, LANG_TYPE_CLASS_CHECK, LANG_TYPE_PTRMEM_CHECK, LANG_DECL_U2_CHECK): Add __extension__. * decl.c (set_current_binding_level): New macro. Use throughout when setting the current binding level. * cp-tree.h (cp_lvalue_kind, base_access): Delete trailing comma in enum. * method.c (mangling_flags): Likewise. * cp-tree.h (lang_type_header): Add __extension__ and use CHAR_BITFIELD for members. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@65201 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/cp/ChangeLog31
-rw-r--r--gcc/cp/cp-tree.h40
-rw-r--r--gcc/cp/decl.c61
-rw-r--r--gcc/cp/decl2.c8
-rw-r--r--gcc/cp/method.c2
-rw-r--r--gcc/cp/operators.def6
-rw-r--r--gcc/cp/ptree.c6
-rw-r--r--gcc/cp/rtti.c2
-rw-r--r--gcc/gengtype-lex.l2
-rw-r--r--gcc/system.h5
11 files changed, 115 insertions, 53 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c9ba702a635..3d9392bf376 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2003-04-03 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * gengtype-lex.l (IWORD): Add CHAR_BITFIELD.
+ * system.h (CHAR_BITFIELD): New.
+
2003-04-03 Kazu Hirata <kazu@cs.umass.edu>
* config/h8300/h8300.md (a peephole2): Generalize to accept GT
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 16f58f293c4..8667f01bd81 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,34 @@
+2003-04-03 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ * operators.def (DEF_SIMPLE_OPERATOR, DEF_ASSN_OPERATOR,
+ DEF_ASSN_OPERATOR): Delete spurious semi-colon.
+ * rtti.c (dfs_class_hint_mark): Likewise.
+
+ * decl.c (push_local_name, push_class_level_binding,
+ maybe_inject_for_scope_var): Don't use POP_TIMEVAR_AND_RETURN in
+ functions returning void.
+ * decl2.c (add_using_namespace): Likewise.
+
+ * decl.c (print_binding_level, print_other_binding_stack,
+ print_binding_stack): Cast argument of %p specifier to void*.
+ * ptree.c (cxx_print_decl): Likewise.
+
+ * cp-tree.h (VAR_OR_FUNCTION_DECL_CHECK,
+ VAR_FUNCTION_OR_PARM_DECL_CHECK,
+ VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK, RECORD_OR_UNION_TYPE_CHECK,
+ BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK, LANG_TYPE_CLASS_CHECK,
+ LANG_TYPE_PTRMEM_CHECK, LANG_DECL_U2_CHECK): Add __extension__.
+
+ * decl.c (set_current_binding_level): New macro. Use throughout
+ when setting the current binding level.
+
+ * cp-tree.h (cp_lvalue_kind, base_access): Delete trailing comma
+ in enum.
+ * method.c (mangling_flags): Likewise.
+
+ * cp-tree.h (lang_type_header): Add __extension__ and use
+ CHAR_BITFIELD for members.
+
2003-04-02 Geoffrey Keating <geoffk@apple.com>
PR other/9274
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index a9692fe2842..66c6355a7cf 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -158,7 +158,7 @@ struct diagnostic_context;
#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
-#define VAR_OR_FUNCTION_DECL_CHECK(NODE) \
+#define VAR_OR_FUNCTION_DECL_CHECK(NODE) __extension__ \
({ const tree __t = (NODE); \
enum tree_code const __c = TREE_CODE(__t); \
if (__c != VAR_DECL && __c != FUNCTION_DECL) \
@@ -166,7 +166,7 @@ struct diagnostic_context;
__FUNCTION__); \
__t; })
-#define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE) \
+#define VAR_FUNCTION_OR_PARM_DECL_CHECK(NODE) __extension__ \
({ const tree __t = (NODE); \
enum tree_code const __c = TREE_CODE(__t); \
if (__c != VAR_DECL \
@@ -176,7 +176,7 @@ struct diagnostic_context;
__FUNCTION__); \
__t; })
-#define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE) \
+#define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE) __extension__ \
({ const tree __t = (NODE); \
enum tree_code const __c = TREE_CODE(__t); \
if (__c != VAR_DECL \
@@ -187,7 +187,7 @@ struct diagnostic_context;
__FUNCTION__); \
__t; })
-#define RECORD_OR_UNION_TYPE_CHECK(NODE) \
+#define RECORD_OR_UNION_TYPE_CHECK(NODE) __extension__ \
({ const tree __t = (NODE); \
enum tree_code const __c = TREE_CODE(__t); \
if (__c != RECORD_TYPE && __c != UNION_TYPE) \
@@ -195,7 +195,7 @@ struct diagnostic_context;
__FUNCTION__); \
__t; })
-#define BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK(NODE) \
+#define BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK(NODE) __extension__ \
({ const tree __t = (NODE); \
enum tree_code const __c = TREE_CODE(__t); \
if (__c != BOUND_TEMPLATE_TEMPLATE_PARM) \
@@ -1036,17 +1036,17 @@ enum languages { lang_c, lang_cplusplus, lang_java };
/* This is a few header flags for 'struct lang_type'. Actually,
all but the first are used only for lang_type_class; they
are put in this structure to save space. */
-struct lang_type_header GTY(())
+__extension__ struct lang_type_header GTY(())
{
- unsigned char is_lang_type_class : 1;
-
- unsigned char has_type_conversion : 1;
- unsigned char has_init_ref : 1;
- unsigned char has_default_ctor : 1;
- unsigned char uses_multiple_inheritance : 1;
- unsigned char const_needs_init : 1;
- unsigned char ref_needs_init : 1;
- unsigned char has_const_assign_ref : 1;
+ CHAR_BITFIELD is_lang_type_class : 1;
+
+ CHAR_BITFIELD has_type_conversion : 1;
+ CHAR_BITFIELD has_init_ref : 1;
+ CHAR_BITFIELD has_default_ctor : 1;
+ CHAR_BITFIELD uses_multiple_inheritance : 1;
+ CHAR_BITFIELD const_needs_init : 1;
+ CHAR_BITFIELD ref_needs_init : 1;
+ CHAR_BITFIELD has_const_assign_ref : 1;
};
/* This structure provides additional information above and beyond
@@ -1154,13 +1154,13 @@ struct lang_type GTY(())
#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
-#define LANG_TYPE_CLASS_CHECK(NODE) \
+#define LANG_TYPE_CLASS_CHECK(NODE) __extension__ \
({ struct lang_type *lt = TYPE_LANG_SPECIFIC (NODE); \
if (! lt->u.h.is_lang_type_class) \
lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
&lt->u.c; })
-#define LANG_TYPE_PTRMEM_CHECK(NODE) \
+#define LANG_TYPE_PTRMEM_CHECK(NODE) __extension__ \
({ struct lang_type *lt = TYPE_LANG_SPECIFIC (NODE); \
if (lt->u.h.is_lang_type_class) \
lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
@@ -1748,7 +1748,7 @@ struct lang_decl GTY(())
#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
-#define LANG_DECL_U2_CHECK(NODE, TF) \
+#define LANG_DECL_U2_CHECK(NODE, TF) __extension__ \
({ struct lang_decl *lt = DECL_LANG_SPECIFIC (NODE); \
if (lt->decl_flags.u2sel != TF) \
lang_check_failed (__FILE__, __LINE__, __FUNCTION__); \
@@ -2941,7 +2941,7 @@ typedef enum cp_lvalue_kind {
clk_none = 0, /* Things that are not an lvalue. */
clk_ordinary = 1, /* An ordinary lvalue. */
clk_class = 2, /* An rvalue of class-type. */
- clk_bitfield = 4, /* An lvalue for a bit-field. */
+ clk_bitfield = 4 /* An lvalue for a bit-field. */
} cp_lvalue_kind;
/* The kinds of scopes we recognize. */
@@ -3051,7 +3051,7 @@ typedef enum base_access {
ba_check = 2, /* Check access */
ba_not_special = 3, /* Do not consider special privilege
current_class_type might give. */
- ba_quiet = 4, /* Do not issue error messages (bit mask). */
+ ba_quiet = 4 /* Do not issue error messages (bit mask). */
} base_access;
/* The kind of base we can find, looking in a class hierarchy.
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index e2dc018a23a..f33b733e325 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -438,6 +438,14 @@ struct cp_binding_level GTY(())
? cp_function_chain->bindings \
: scope_chain->bindings)
+#define set_current_binding_level(bl) do { \
+ struct cp_binding_level * const bl_ = bl; \
+ if (cfun && cp_function_chain->bindings) \
+ cp_function_chain->bindings = bl_; \
+ else \
+ scope_chain->bindings = bl_; \
+ } while (0)
+
/* The binding level of the current class, if any. */
#define class_binding_level scope_chain->class_bindings
@@ -487,7 +495,7 @@ push_binding_level (struct cp_binding_level *newlevel,
are active. */
memset ((char*) newlevel, 0, sizeof (struct cp_binding_level));
newlevel->level_chain = current_binding_level;
- current_binding_level = newlevel;
+ set_current_binding_level (newlevel);
newlevel->tag_transparent = tag_transparent;
newlevel->more_cleanups_ok = 1;
@@ -543,7 +551,7 @@ pop_binding_level (void)
#endif /* defined(DEBUG_BINDING_LEVELS) */
{
register struct cp_binding_level *level = current_binding_level;
- current_binding_level = current_binding_level->level_chain;
+ set_current_binding_level (current_binding_level->level_chain);
level->level_chain = free_binding_level;
#if 0 /* defined(DEBUG_BINDING_LEVELS) */
if (level->binding_depth != binding_depth)
@@ -558,7 +566,7 @@ static void
suspend_binding_level (void)
{
if (class_binding_level)
- current_binding_level = class_binding_level;
+ set_current_binding_level (class_binding_level);
if (global_binding_level)
{
@@ -580,7 +588,7 @@ suspend_binding_level (void)
}
is_class_level = 0;
#endif /* defined(DEBUG_BINDING_LEVELS) */
- current_binding_level = current_binding_level->level_chain;
+ set_current_binding_level (current_binding_level->level_chain);
find_class_binding_level ();
}
@@ -592,7 +600,7 @@ resume_binding_level (struct cp_binding_level* b)
my_friendly_assert(!class_binding_level, 386);
/* Also, resuming a non-directly nested namespace is a no-no. */
my_friendly_assert(b->level_chain == current_binding_level, 386);
- current_binding_level = b;
+ set_current_binding_level (b);
#if defined(DEBUG_BINDING_LEVELS)
b->binding_depth = binding_depth;
indent ();
@@ -1860,7 +1868,7 @@ print_binding_level (struct cp_binding_level* lvl)
tree t;
int i = 0, len;
fprintf (stderr, " blocks=");
- fprintf (stderr, HOST_PTR_PRINTF, lvl->blocks);
+ fprintf (stderr, HOST_PTR_PRINTF, (void *) lvl->blocks);
if (lvl->tag_transparent)
fprintf (stderr, " tag-transparent");
if (lvl->more_cleanups_ok)
@@ -1961,7 +1969,7 @@ print_other_binding_stack (struct cp_binding_level *stack)
for (level = stack; level != global_binding_level; level = level->level_chain)
{
fprintf (stderr, "binding level ");
- fprintf (stderr, HOST_PTR_PRINTF, level);
+ fprintf (stderr, HOST_PTR_PRINTF, (void *) level);
fprintf (stderr, "\n");
print_binding_level (level);
}
@@ -1972,11 +1980,11 @@ print_binding_stack (void)
{
struct cp_binding_level *b;
fprintf (stderr, "current_binding_level=");
- fprintf (stderr, HOST_PTR_PRINTF, current_binding_level);
+ fprintf (stderr, HOST_PTR_PRINTF, (void *) current_binding_level);
fprintf (stderr, "\nclass_binding_level=");
- fprintf (stderr, HOST_PTR_PRINTF, class_binding_level);
+ fprintf (stderr, HOST_PTR_PRINTF, (void *) class_binding_level);
fprintf (stderr, "\nglobal_binding_level=");
- fprintf (stderr, HOST_PTR_PRINTF, global_binding_level);
+ fprintf (stderr, HOST_PTR_PRINTF, (void *) global_binding_level);
fprintf (stderr, "\n");
if (class_binding_level)
{
@@ -2497,7 +2505,8 @@ push_local_name (tree decl)
DECL_DISCRIMINATOR (decl) = 1;
VARRAY_TREE (local_names, i) = decl;
- POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, (void)0);
+ timevar_pop (TV_NAME_LOOKUP);
+ return;
}
}
@@ -4065,9 +4074,9 @@ pushdecl_with_scope (tree x, struct cp_binding_level* level)
else
{
b = current_binding_level;
- current_binding_level = level;
+ set_current_binding_level (level);
x = pushdecl (x);
- current_binding_level = b;
+ set_current_binding_level (b);
}
current_function_decl = function_decl;
POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, x);
@@ -4205,7 +4214,10 @@ push_class_level_binding (tree name, tree x)
/* The class_binding_level will be NULL if x is a template
parameter name in a member template. */
if (!class_binding_level)
- POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, (void)0);
+ {
+ timevar_pop (TV_NAME_LOOKUP);
+ return;
+ }
/* Make sure that this new member does not have the same name
as a template parameter. */
@@ -4255,7 +4267,8 @@ push_class_level_binding (tree name, tree x)
INHERITED_VALUE_BINDING_P (binding) = 0;
TREE_TYPE (shadow) = x;
IDENTIFIER_CLASS_VALUE (name) = x;
- POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, (void)0);
+ timevar_pop (TV_NAME_LOOKUP);
+ return;
}
}
@@ -6190,7 +6203,7 @@ cxx_init_decl_processing (void)
current_lang_name = lang_name_c;
current_function_decl = NULL_TREE;
- current_binding_level = NULL_BINDING_LEVEL;
+ set_current_binding_level (NULL_BINDING_LEVEL);
free_binding_level = NULL_BINDING_LEVEL;
build_common_tree_nodes (flag_signed_char);
@@ -7846,13 +7859,19 @@ maybe_inject_for_scope_var (tree decl)
{
timevar_push (TV_NAME_LOOKUP);
if (!DECL_NAME (decl))
- POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, (void)0);
+ {
+ timevar_pop (TV_NAME_LOOKUP);
+ return;
+ }
/* Declarations of __FUNCTION__ and its ilk appear magically when
the variable is first used. If that happens to be inside a
for-loop, we don't want to do anything special. */
if (DECL_PRETTY_FUNCTION_P (decl))
- POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, (void)0);
+ {
+ timevar_pop (TV_NAME_LOOKUP);
+ return;
+ }
if (current_binding_level->is_for_scope)
{
@@ -9960,10 +9979,10 @@ grokdeclarator (tree declarator,
if (decl_context == NORMAL && !toplevel_bindings_p ())
{
struct cp_binding_level *b = current_binding_level;
- current_binding_level = b->level_chain;
+ set_current_binding_level (b->level_chain);
if (current_binding_level != 0 && toplevel_bindings_p ())
decl_context = PARM;
- current_binding_level = b;
+ set_current_binding_level (b);
}
if (name == NULL)
@@ -13433,7 +13452,7 @@ start_function (tree declspecs, tree declarator, tree attrs, int flags)
FIXME factor out the non-RTL stuff. */
bl = current_binding_level;
init_function_start (decl1, input_filename, lineno);
- current_binding_level = bl;
+ set_current_binding_level (bl);
/* Even though we're inside a function body, we still don't want to
call expand_expr to calculate the size of a variable-sized array.
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index b7b0054b7ee..0f8617c141f 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -3457,7 +3457,10 @@ add_using_namespace (tree user, tree used, bool indirect)
timevar_push (TV_NAME_LOOKUP);
/* Using oneself is a no-op. */
if (user == used)
- POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, (void)0);
+ {
+ timevar_pop (TV_NAME_LOOKUP);
+ return;
+ }
my_friendly_assert (TREE_CODE (user) == NAMESPACE_DECL, 380);
my_friendly_assert (TREE_CODE (used) == NAMESPACE_DECL, 380);
/* Check if we already have this. */
@@ -3467,7 +3470,8 @@ add_using_namespace (tree user, tree used, bool indirect)
if (!indirect)
/* Promote to direct usage. */
TREE_INDIRECT_USING (t) = 0;
- POP_TIMEVAR_AND_RETURN (TV_NAME_LOOKUP, (void)0);
+ timevar_pop (TV_NAME_LOOKUP);
+ return;
}
/* Add used to the user's using list. */
diff --git a/gcc/cp/method.c b/gcc/cp/method.c
index a60b75f1cbf..b5a88f2f11d 100644
--- a/gcc/cp/method.c
+++ b/gcc/cp/method.c
@@ -50,7 +50,7 @@ enum mangling_flags
mf_maybe_uninstantiated = 1,
/* When mangling a numeric value, use the form `_XX_' (instead of
just `XX') if the value has more than one digit. */
- mf_use_underscores_around_value = 2,
+ mf_use_underscores_around_value = 2
};
typedef enum mangling_flags mangling_flags;
diff --git a/gcc/cp/operators.def b/gcc/cp/operators.def
index 98e31740928..b4de745a154 100644
--- a/gcc/cp/operators.def
+++ b/gcc/cp/operators.def
@@ -131,7 +131,7 @@ DEF_SIMPLE_OPERATOR ("--", POSTDECREMENT_EXPR, "mm", 2)
DEF_SIMPLE_OPERATOR ("<?", MIN_EXPR, "v23min", 2)
DEF_SIMPLE_OPERATOR (">?", MAX_EXPR, "v23max", 2)
/* This one is needed for mangling. */
-DEF_SIMPLE_OPERATOR ("::", SCOPE_REF, "sr", 2);
+DEF_SIMPLE_OPERATOR ("::", SCOPE_REF, "sr", 2)
/* Assignment operators. */
DEF_ASSN_OPERATOR ("=", NOP_EXPR, "aS", 2)
@@ -146,8 +146,8 @@ DEF_ASSN_OPERATOR ("^=", BIT_XOR_EXPR, "eO", 2)
DEF_ASSN_OPERATOR ("<<=", LSHIFT_EXPR, "lS", 2)
DEF_ASSN_OPERATOR (">>=", RSHIFT_EXPR, "rS", 2)
/* These operators are GNU extensions. */
-DEF_ASSN_OPERATOR ("<?=", MIN_EXPR, "v23miN", 2);
-DEF_ASSN_OPERATOR (">?=", MAX_EXPR, "v23maX", 2);
+DEF_ASSN_OPERATOR ("<?=", MIN_EXPR, "v23miN", 2)
+DEF_ASSN_OPERATOR (">?=", MAX_EXPR, "v23maX", 2)
/* Ternary operators. */
DEF_SIMPLE_OPERATOR ("?:", COND_EXPR, "qu", 3)
diff --git a/gcc/cp/ptree.c b/gcc/cp/ptree.c
index 305a4f135c6..aefc9613e75 100644
--- a/gcc/cp/ptree.c
+++ b/gcc/cp/ptree.c
@@ -48,19 +48,19 @@ cxx_print_decl (FILE *file, tree node, int indent)
&& DECL_PENDING_INLINE_INFO (node))
{
fprintf (file, " pending-inline-info ");
- fprintf (file, HOST_PTR_PRINTF, DECL_PENDING_INLINE_INFO (node));
+ fprintf (file, HOST_PTR_PRINTF, (void *) DECL_PENDING_INLINE_INFO (node));
}
if (TREE_CODE (node) == TYPE_DECL
&& DECL_SORTED_FIELDS (node))
{
fprintf (file, " sorted-fields ");
- fprintf (file, HOST_PTR_PRINTF, DECL_SORTED_FIELDS (node));
+ fprintf (file, HOST_PTR_PRINTF, (void *) DECL_SORTED_FIELDS (node));
}
if ((TREE_CODE (node) == FUNCTION_DECL || TREE_CODE (node) == VAR_DECL)
&& DECL_TEMPLATE_INFO (node))
{
fprintf (file, " template-info ");
- fprintf (file, HOST_PTR_PRINTF, DECL_TEMPLATE_INFO (node));
+ fprintf (file, HOST_PTR_PRINTF, (void *) DECL_TEMPLATE_INFO (node));
}
}
diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c
index a9a7cdbcea0..24ba0fd9b02 100644
--- a/gcc/cp/rtti.c
+++ b/gcc/cp/rtti.c
@@ -922,7 +922,7 @@ dfs_class_hint_mark (tree binfo, void *data)
SET_CLASSTYPE_MARKED (basetype);
}
return NULL_TREE;
-};
+}
/* Clear the base's dfs marks, after searching for duplicate bases. */
diff --git a/gcc/gengtype-lex.l b/gcc/gengtype-lex.l
index c4f96c59e73..36b1596651e 100644
--- a/gcc/gengtype-lex.l
+++ b/gcc/gengtype-lex.l
@@ -52,7 +52,7 @@ update_lineno (l, len)
ID [[:alpha:]_][[:alnum:]_]*
WS [[:space:]]+
-IWORD short|long|(un)?signed|char|int|HOST_WIDE_INT|bool|size_t
+IWORD short|long|(un)?signed|char|int|HOST_WIDE_INT|bool|size_t|CHAR_BITFIELD
ITYPE {IWORD}({WS}{IWORD})*
%x in_struct in_struct_comment in_comment in_yacc_escape
diff --git a/gcc/system.h b/gcc/system.h
index 2f16008be19..adece55d99b 100644
--- a/gcc/system.h
+++ b/gcc/system.h
@@ -508,13 +508,16 @@ extern void abort PARAMS ((void));
#define HOST_BIT_BUCKET "/dev/null"
#endif
-/* Be conservative and only use enum bitfields with GCC.
+/* Be conservative and only use enum bitfields with GCC. Likewise for
+ char bitfields.
FIXME: provide a complete autoconf test for buggy enum bitfields. */
#if (GCC_VERSION > 2000)
#define ENUM_BITFIELD(TYPE) enum TYPE
+#define CHAR_BITFIELD unsigned char
#else
#define ENUM_BITFIELD(TYPE) unsigned int
+#define CHAR_BITFIELD unsigned int
#endif
#ifndef offsetof