Commit dfd48d76 by Neil Booth Committed by Neil Booth

c-decl.c, [...]: Revert bitfield patch.

	* c-decl.c, tree.c, tree.h, objc/objc-act.c: Revert bitfield
	patch.
	* gcc.dg/bitfld-1.c: Update.
	* gcc.dg/bitfld-2.c: Update.
	* gcc.c-torture/execute/bitfld-1.x: New.

From-SVN: r49420
parent 4a23409e
2002-02-02 Neil Booth <neil@daikokuya.demon.co.uk>
* c-decl.c, tree.c, tree.h, objc/objc-act.c: Revert bitfield
patch.
2002-02-02 Jakub Jelinek <jakub@redhat.com> 2002-02-02 Jakub Jelinek <jakub@redhat.com>
* config/i386/i386.h (CPP_CPUCOMMON_SPEC): Add missing | separators. * config/i386/i386.h (CPP_CPUCOMMON_SPEC): Add missing | separators.
......
...@@ -53,6 +53,7 @@ enum decl_context ...@@ -53,6 +53,7 @@ enum decl_context
FUNCDEF, /* Function definition */ FUNCDEF, /* Function definition */
PARM, /* Declaration of parm before function body */ PARM, /* Declaration of parm before function body */
FIELD, /* Declaration inside struct or union */ FIELD, /* Declaration inside struct or union */
BITFIELD, /* Likewise but with specified width */
TYPENAME}; /* Typename (inside cast or sizeof) */ TYPENAME}; /* Typename (inside cast or sizeof) */
...@@ -275,13 +276,12 @@ static tree lookup_tag PARAMS ((enum tree_code, tree, ...@@ -275,13 +276,12 @@ static tree lookup_tag PARAMS ((enum tree_code, tree,
struct binding_level *, int)); struct binding_level *, int));
static tree lookup_tag_reverse PARAMS ((tree)); static tree lookup_tag_reverse PARAMS ((tree));
static tree grokdeclarator PARAMS ((tree, tree, enum decl_context, static tree grokdeclarator PARAMS ((tree, tree, enum decl_context,
int, tree)); int));
static tree grokparms PARAMS ((tree, int)); static tree grokparms PARAMS ((tree, int));
static void layout_array_type PARAMS ((tree)); static void layout_array_type PARAMS ((tree));
static tree c_make_fname_decl PARAMS ((tree, int)); static tree c_make_fname_decl PARAMS ((tree, int));
static void c_expand_body PARAMS ((tree, int, int)); static void c_expand_body PARAMS ((tree, int, int));
static void warn_if_shadowing PARAMS ((tree, tree)); static void warn_if_shadowing PARAMS ((tree, tree));
static tree build_bitfield_integer_type PARAMS ((tree, tree, const char *));
/* C-specific option variables. */ /* C-specific option variables. */
...@@ -319,7 +319,7 @@ int flag_noniso_default_format_attributes = 1; ...@@ -319,7 +319,7 @@ int flag_noniso_default_format_attributes = 1;
being traditional. */ being traditional. */
int flag_allow_single_precision = 0; int flag_allow_single_precision = 0;
/* Nonzero means to treat bit-fields as signed unless they say `unsigned'. */ /* Nonzero means to treat bitfields as signed unless they say `unsigned'. */
int flag_signed_bitfields = 1; int flag_signed_bitfields = 1;
int explicit_flag_signed_bitfields = 0; int explicit_flag_signed_bitfields = 0;
...@@ -3390,8 +3390,7 @@ groktypename (typename) ...@@ -3390,8 +3390,7 @@ groktypename (typename)
split_specs_attrs (TREE_PURPOSE (typename), &specs, &attrs); split_specs_attrs (TREE_PURPOSE (typename), &specs, &attrs);
typename = grokdeclarator (TREE_VALUE (typename), specs, TYPENAME, 0, typename = grokdeclarator (TREE_VALUE (typename), specs, TYPENAME, 0);
NULL_TREE);
/* Apply attributes. */ /* Apply attributes. */
decl_attributes (&typename, attrs, 0); decl_attributes (&typename, attrs, 0);
...@@ -3409,7 +3408,7 @@ groktypename_in_parm_context (typename) ...@@ -3409,7 +3408,7 @@ groktypename_in_parm_context (typename)
return typename; return typename;
return grokdeclarator (TREE_VALUE (typename), return grokdeclarator (TREE_VALUE (typename),
TREE_PURPOSE (typename), TREE_PURPOSE (typename),
PARM, 0, NULL_TREE); PARM, 0);
} }
/* Decode a declarator in an ordinary declaration or data definition. /* Decode a declarator in an ordinary declaration or data definition.
...@@ -3442,7 +3441,7 @@ start_decl (declarator, declspecs, initialized, attributes) ...@@ -3442,7 +3441,7 @@ start_decl (declarator, declspecs, initialized, attributes)
deprecated_state = DEPRECATED_SUPPRESS; deprecated_state = DEPRECATED_SUPPRESS;
decl = grokdeclarator (declarator, declspecs, decl = grokdeclarator (declarator, declspecs,
NORMAL, initialized, NULL_TREE); NORMAL, initialized);
deprecated_state = DEPRECATED_NORMAL; deprecated_state = DEPRECATED_NORMAL;
...@@ -3820,8 +3819,7 @@ push_parm_decl (parm) ...@@ -3820,8 +3819,7 @@ push_parm_decl (parm)
immediate_size_expand = 0; immediate_size_expand = 0;
decl = grokdeclarator (TREE_VALUE (TREE_PURPOSE (parm)), decl = grokdeclarator (TREE_VALUE (TREE_PURPOSE (parm)),
TREE_PURPOSE (TREE_PURPOSE (parm)), TREE_PURPOSE (TREE_PURPOSE (parm)), PARM, 0);
PARM, 0, NULL_TREE);
decl_attributes (&decl, TREE_VALUE (parm), 0); decl_attributes (&decl, TREE_VALUE (parm), 0);
#if 0 #if 0
...@@ -3981,92 +3979,6 @@ complete_array_type (type, initial_value, do_default) ...@@ -3981,92 +3979,6 @@ complete_array_type (type, initial_value, do_default)
return value; return value;
} }
/* A bit-field NAME should have an integer type whose precision
accurately reflects its WIDTH. If TYPE is good for that, return
it, otherwise create and return the appropriate type.
This routine also performs sanity checks on the bit-field's type
and width, and uses appropriate values if they are invalid. */
static tree
build_bitfield_integer_type (type, width, orig_name)
tree type, width;
const char *orig_name;
{
tree type_mv;
unsigned int max_width;
unsigned HOST_WIDE_INT w;
const char *name = orig_name ? orig_name: _("<anonymous>");
/* Necessary? */
STRIP_NOPS (width);
/* Detect and ignore out of range field width and process valid
field widths. */
if (TREE_CODE (width) != INTEGER_CST)
{
error ("bit-field `%s' width not an integer constant", name);
width = integer_one_node;
}
else
{
constant_expression_warning (width);
if (tree_int_cst_sgn (width) < 0)
{
error ("negative width in bit-field `%s'", name);
width = integer_one_node;
}
else if (integer_zerop (width) && orig_name)
{
error ("zero width for bit-field `%s'", name);
width = integer_one_node;
}
}
/* Detect invalid bit-field type. */
if (TREE_CODE (type) != INTEGER_TYPE
&& TREE_CODE (type) != BOOLEAN_TYPE
&& TREE_CODE (type) != ENUMERAL_TYPE)
{
error ("bit-field `%s' has invalid type", name);
type = unsigned_type_node;
}
type_mv = TYPE_MAIN_VARIANT (type);
if (pedantic
&& type_mv != integer_type_node
&& type_mv != unsigned_type_node
&& type_mv != c_bool_type_node
/* Accept an enum that's equivalent to int or unsigned int. */
&& (TREE_CODE (type) != ENUMERAL_TYPE
|| TYPE_PRECISION (type) != TYPE_PRECISION (integer_type_node)))
pedwarn ("type of bit-field `%s' is a GCC extension", name);
if (type_mv == c_bool_type_node)
max_width = CHAR_TYPE_SIZE;
else
max_width = TYPE_PRECISION (type);
if (0 < compare_tree_int (width, max_width))
{
error ("width of `%s' exceeds its type", name);
w = max_width;
}
else
w = tree_low_cst (width, 1);
if (TREE_CODE (type) == ENUMERAL_TYPE
&& (w < min_precision (TYPE_MIN_VALUE (type), TREE_UNSIGNED (type))
|| w < min_precision (TYPE_MAX_VALUE (type), TREE_UNSIGNED (type))))
warning ("`%s' is narrower than values of its type", name);
/* The type of a bit-field should have precision the same as the
bit-field's width. */
if (w != TYPE_PRECISION (type))
type = build_nonstandard_integer_type (w, TREE_UNSIGNED (type));
return type;
}
/* Given declspecs and a declarator, /* Given declspecs and a declarator,
determine the name and type of the object declared determine the name and type of the object declared
and construct a ..._DECL node for it. and construct a ..._DECL node for it.
...@@ -4086,9 +3998,8 @@ build_bitfield_integer_type (type, width, orig_name) ...@@ -4086,9 +3998,8 @@ build_bitfield_integer_type (type, width, orig_name)
TYPENAME if for a typename (in a cast or sizeof). TYPENAME if for a typename (in a cast or sizeof).
Don't make a DECL node; just return the ..._TYPE node. Don't make a DECL node; just return the ..._TYPE node.
FIELD for a struct or union field; make a FIELD_DECL. FIELD for a struct or union field; make a FIELD_DECL.
BITFIELD for a field with specified width.
INITIALIZED is 1 if the decl has an initializer. INITIALIZED is 1 if the decl has an initializer.
WIDTH is non-NULL for bit-fields, and is an INTEGER_CST node representing
the width of the bit-field.
In the TYPENAME case, DECLARATOR is really an absolute declarator. In the TYPENAME case, DECLARATOR is really an absolute declarator.
It may also be so in the PARM case, for a prototype where the It may also be so in the PARM case, for a prototype where the
...@@ -4098,12 +4009,11 @@ build_bitfield_integer_type (type, width, orig_name) ...@@ -4098,12 +4009,11 @@ build_bitfield_integer_type (type, width, orig_name)
and `extern' are interpreted. */ and `extern' are interpreted. */
static tree static tree
grokdeclarator (declarator, declspecs, decl_context, initialized, width) grokdeclarator (declarator, declspecs, decl_context, initialized)
tree declspecs; tree declspecs;
tree declarator; tree declarator;
enum decl_context decl_context; enum decl_context decl_context;
int initialized; int initialized;
tree width;
{ {
int specbits = 0; int specbits = 0;
tree spec; tree spec;
...@@ -4118,16 +4028,19 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width) ...@@ -4118,16 +4028,19 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
int explicit_char = 0; int explicit_char = 0;
int defaulted_int = 0; int defaulted_int = 0;
tree typedef_decl = 0; tree typedef_decl = 0;
const char *name, *orig_name; const char *name;
tree typedef_type = 0; tree typedef_type = 0;
int funcdef_flag = 0; int funcdef_flag = 0;
enum tree_code innermost_code = ERROR_MARK; enum tree_code innermost_code = ERROR_MARK;
int bitfield = 0;
int size_varies = 0; int size_varies = 0;
tree decl_attr = NULL_TREE; tree decl_attr = NULL_TREE;
tree array_ptr_quals = NULL_TREE; tree array_ptr_quals = NULL_TREE;
int array_parm_static = 0; int array_parm_static = 0;
tree returned_attrs = NULL_TREE; tree returned_attrs = NULL_TREE;
bool bitfield = width != NULL_TREE;
if (decl_context == BITFIELD)
bitfield = 1, decl_context = FIELD;
if (decl_context == FUNCDEF) if (decl_context == FUNCDEF)
funcdef_flag = 1, decl_context = NORMAL; funcdef_flag = 1, decl_context = NORMAL;
...@@ -4160,7 +4073,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width) ...@@ -4160,7 +4073,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
default: default:
abort (); abort ();
} }
orig_name = name;
if (name == 0) if (name == 0)
name = "type name"; name = "type name";
} }
...@@ -4377,9 +4289,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width) ...@@ -4377,9 +4289,9 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
} }
/* Decide whether an integer type is signed or not. /* Decide whether an integer type is signed or not.
Optionally treat bit-fields as signed by default. */ Optionally treat bitfields as signed by default. */
if (specbits & 1 << (int) RID_UNSIGNED if (specbits & 1 << (int) RID_UNSIGNED
/* Traditionally, all bit-fields are unsigned. */ /* Traditionally, all bitfields are unsigned. */
|| (bitfield && flag_traditional || (bitfield && flag_traditional
&& (! explicit_flag_signed_bitfields || !flag_signed_bitfields)) && (! explicit_flag_signed_bitfields || !flag_signed_bitfields))
|| (bitfield && ! flag_signed_bitfields || (bitfield && ! flag_signed_bitfields
...@@ -4452,11 +4364,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width) ...@@ -4452,11 +4364,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
} }
} }
/* A bit-field needs its type to have precision equal to its width,
rather than the precision of the specified standard type. */
if (bitfield)
type = build_bitfield_integer_type (type, width, orig_name);
/* Figure out the type qualifiers for the declaration. There are /* Figure out the type qualifiers for the declaration. There are
two ways a declaration can become qualified. One is something two ways a declaration can become qualified. One is something
like `const int i' where the `const' is explicit. Another is like `const int i' where the `const' is explicit. Another is
...@@ -5106,6 +5013,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width) ...@@ -5106,6 +5013,7 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
else if (decl_context == FIELD) else if (decl_context == FIELD)
{ {
/* Structure field. It may not be a function. */ /* Structure field. It may not be a function. */
if (TREE_CODE (type) == FUNCTION_TYPE) if (TREE_CODE (type) == FUNCTION_TYPE)
{ {
error ("field `%s' declared as a function", name); error ("field `%s' declared as a function", name);
...@@ -5129,29 +5037,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width) ...@@ -5129,29 +5037,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized, width)
#endif #endif
} }
decl = build_decl (FIELD_DECL, declarator, type); decl = build_decl (FIELD_DECL, declarator, type);
if (bitfield)
{
DECL_SIZE (decl) = bitsize_int (TYPE_PRECISION (type));
DECL_BIT_FIELD (decl) = 1;
SET_DECL_C_BIT_FIELD (decl);
/* Bit-field width 0 => force desired amount of alignment. */
if (TYPE_PRECISION (type) == 0)
{
#ifdef EMPTY_FIELD_BOUNDARY
DECL_ALIGN (decl) = MAX (DECL_ALIGN (decl),
EMPTY_FIELD_BOUNDARY);
#endif
#ifdef PCC_BITFIELD_TYPE_MATTERS
if (PCC_BITFIELD_TYPE_MATTERS)
{
DECL_ALIGN (decl) = MAX (DECL_ALIGN (decl),
TYPE_ALIGN (type));
DECL_USER_ALIGN (decl) |= TYPE_USER_ALIGN (type);
}
#endif
}
}
DECL_NONADDRESSABLE_P (decl) = bitfield; DECL_NONADDRESSABLE_P (decl) = bitfield;
if (size_varies) if (size_varies)
...@@ -5654,7 +5539,7 @@ start_struct (code, name) ...@@ -5654,7 +5539,7 @@ start_struct (code, name)
/* Process the specs, declarator (NULL if omitted) and width (NULL if omitted) /* Process the specs, declarator (NULL if omitted) and width (NULL if omitted)
of a structure component, returning a FIELD_DECL node. of a structure component, returning a FIELD_DECL node.
WIDTH is non-NULL for bit-fields only, and is an INTEGER_CST node. WIDTH is non-NULL for bit fields only, and is an INTEGER_CST node.
This is done during the parsing of the struct declaration. This is done during the parsing of the struct declaration.
The FIELD_DECL nodes are chained together and the lot of them The FIELD_DECL nodes are chained together and the lot of them
...@@ -5680,9 +5565,10 @@ grokfield (filename, line, declarator, declspecs, width) ...@@ -5680,9 +5565,10 @@ grokfield (filename, line, declarator, declspecs, width)
} }
} }
value = grokdeclarator (declarator, declspecs, FIELD, 0, width); value = grokdeclarator (declarator, declspecs, width ? BITFIELD : FIELD, 0);
finish_decl (value, NULL_TREE, NULL_TREE); finish_decl (value, NULL_TREE, NULL_TREE);
DECL_INITIAL (value) = width;
maybe_objc_check_decl (value); maybe_objc_check_decl (value);
return value; return value;
...@@ -5734,7 +5620,10 @@ finish_struct (t, fieldlist, attributes) ...@@ -5734,7 +5620,10 @@ finish_struct (t, fieldlist, attributes)
fieldlist ? _("named members") : _("members")); fieldlist ? _("named members") : _("members"));
} }
/* Install struct as DECL_CONTEXT of each field decl. */ /* Install struct as DECL_CONTEXT of each field decl.
Also process specified field sizes,m which is found in the DECL_INITIAL.
Store 0 there, except for ": 0" fields (so we can find them
and delete them, below). */
saw_named_field = 0; saw_named_field = 0;
for (x = fieldlist; x; x = TREE_CHAIN (x)) for (x = fieldlist; x; x = TREE_CHAIN (x))
...@@ -5770,7 +5659,93 @@ finish_struct (t, fieldlist, attributes) ...@@ -5770,7 +5659,93 @@ finish_struct (t, fieldlist, attributes)
error ("nested redefinition of `%s'", error ("nested redefinition of `%s'",
IDENTIFIER_POINTER (TYPE_NAME (t))); IDENTIFIER_POINTER (TYPE_NAME (t)));
if (TREE_TYPE (x) != error_mark_node && !DECL_BIT_FIELD (x)) /* Detect invalid bit-field size. */
if (DECL_INITIAL (x))
STRIP_NOPS (DECL_INITIAL (x));
if (DECL_INITIAL (x))
{
if (TREE_CODE (DECL_INITIAL (x)) == INTEGER_CST)
constant_expression_warning (DECL_INITIAL (x));
else
{
error_with_decl (x,
"bit-field `%s' width not an integer constant");
DECL_INITIAL (x) = NULL;
}
}
/* Detect invalid bit-field type. */
if (DECL_INITIAL (x)
&& TREE_CODE (TREE_TYPE (x)) != INTEGER_TYPE
&& TREE_CODE (TREE_TYPE (x)) != BOOLEAN_TYPE
&& TREE_CODE (TREE_TYPE (x)) != ENUMERAL_TYPE)
{
error_with_decl (x, "bit-field `%s' has invalid type");
DECL_INITIAL (x) = NULL;
}
if (DECL_INITIAL (x) && pedantic
&& TYPE_MAIN_VARIANT (TREE_TYPE (x)) != integer_type_node
&& TYPE_MAIN_VARIANT (TREE_TYPE (x)) != unsigned_type_node
&& TYPE_MAIN_VARIANT (TREE_TYPE (x)) != c_bool_type_node
/* Accept an enum that's equivalent to int or unsigned int. */
&& !(TREE_CODE (TREE_TYPE (x)) == ENUMERAL_TYPE
&& (TYPE_PRECISION (TREE_TYPE (x))
== TYPE_PRECISION (integer_type_node))))
pedwarn_with_decl (x, "bit-field `%s' type invalid in ISO C");
/* Detect and ignore out of range field width and process valid
field widths. */
if (DECL_INITIAL (x))
{
int max_width
= (TYPE_MAIN_VARIANT (TREE_TYPE (x)) == c_bool_type_node
? CHAR_TYPE_SIZE : TYPE_PRECISION (TREE_TYPE (x)));
if (tree_int_cst_sgn (DECL_INITIAL (x)) < 0)
error_with_decl (x, "negative width in bit-field `%s'");
else if (0 < compare_tree_int (DECL_INITIAL (x), max_width))
pedwarn_with_decl (x, "width of `%s' exceeds its type");
else if (integer_zerop (DECL_INITIAL (x)) && DECL_NAME (x) != 0)
error_with_decl (x, "zero width for bit-field `%s'");
else
{
/* The test above has assured us that TREE_INT_CST_HIGH is 0. */
unsigned HOST_WIDE_INT width
= tree_low_cst (DECL_INITIAL (x), 1);
if (TREE_CODE (TREE_TYPE (x)) == ENUMERAL_TYPE
&& (width < min_precision (TYPE_MIN_VALUE (TREE_TYPE (x)),
TREE_UNSIGNED (TREE_TYPE (x)))
|| (width
< min_precision (TYPE_MAX_VALUE (TREE_TYPE (x)),
TREE_UNSIGNED (TREE_TYPE (x))))))
warning_with_decl (x,
"`%s' is narrower than values of its type");
DECL_SIZE (x) = bitsize_int (width);
DECL_BIT_FIELD (x) = 1;
SET_DECL_C_BIT_FIELD (x);
if (width == 0)
{
/* field size 0 => force desired amount of alignment. */
#ifdef EMPTY_FIELD_BOUNDARY
DECL_ALIGN (x) = MAX (DECL_ALIGN (x), EMPTY_FIELD_BOUNDARY);
#endif
#ifdef PCC_BITFIELD_TYPE_MATTERS
if (PCC_BITFIELD_TYPE_MATTERS)
{
DECL_ALIGN (x) = MAX (DECL_ALIGN (x),
TYPE_ALIGN (TREE_TYPE (x)));
DECL_USER_ALIGN (x) |= TYPE_USER_ALIGN (TREE_TYPE (x));
}
#endif
}
}
}
else if (TREE_TYPE (x) != error_mark_node)
{ {
unsigned int min_align = (DECL_PACKED (x) ? BITS_PER_UNIT unsigned int min_align = (DECL_PACKED (x) ? BITS_PER_UNIT
: TYPE_ALIGN (TREE_TYPE (x))); : TYPE_ALIGN (TREE_TYPE (x)));
...@@ -5782,6 +5757,8 @@ finish_struct (t, fieldlist, attributes) ...@@ -5782,6 +5757,8 @@ finish_struct (t, fieldlist, attributes)
DECL_USER_ALIGN (x) |= TYPE_USER_ALIGN (TREE_TYPE (x)); DECL_USER_ALIGN (x) |= TYPE_USER_ALIGN (TREE_TYPE (x));
} }
DECL_INITIAL (x) = 0;
/* Detect flexible array member in an invalid context. */ /* Detect flexible array member in an invalid context. */
if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE if (TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE
&& TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE && TYPE_SIZE (TREE_TYPE (x)) == NULL_TREE
...@@ -6206,7 +6183,7 @@ start_function (declspecs, declarator, attributes) ...@@ -6206,7 +6183,7 @@ start_function (declspecs, declarator, attributes)
/* Don't expand any sizes in the return type of the function. */ /* Don't expand any sizes in the return type of the function. */
immediate_size_expand = 0; immediate_size_expand = 0;
decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1, NULL_TREE); decl1 = grokdeclarator (declarator, declspecs, FUNCDEF, 1);
/* If the declarator is not suitable for a function definition, /* If the declarator is not suitable for a function definition,
cause a syntax error. */ cause a syntax error. */
......
...@@ -2393,6 +2393,13 @@ objc_copy_list (list, head) ...@@ -2393,6 +2393,13 @@ objc_copy_list (list, head)
while (list) while (list)
{ {
tail = copy_node (list); tail = copy_node (list);
/* The following statement fixes a bug when inheriting instance
variables that are declared to be bitfields. finish_struct
expects to find the width of the bitfield in DECL_INITIAL. */
if (DECL_BIT_FIELD (tail) && DECL_INITIAL (tail) == 0)
DECL_INITIAL (tail) = DECL_SIZE (tail);
newlist = chainon (newlist, tail); newlist = chainon (newlist, tail);
list = TREE_CHAIN (list); list = TREE_CHAIN (list);
} }
......
2002-02-02 Neil Booth <neil@daikokuya.demon.co.uk>
* gcc.dg/bitfld-1.c: Update.
* gcc.dg/bitfld-2.c: Update.
* gcc.c-torture/execute/bitfld-1.x: New.
2002-02-02 Jakub Jelinek <jakub@redhat.com> 2002-02-02 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/execute/20020201-1.c: New test. * gcc.c-torture/execute/20020201-1.c: New test.
......
set torture_execute_xfail "*-*-*"
return 0
...@@ -22,7 +22,7 @@ struct bf1 ...@@ -22,7 +22,7 @@ struct bf1
unsigned int : 5; unsigned int : 5;
double e: 1; /* { dg-error "invalid type" } */ double e: 1; /* { dg-error "invalid type" } */
float f: 1; /* { dg-error "invalid type" } */ float f: 1; /* { dg-error "invalid type" } */
unsigned long g: 5; /* { dg-warning "GCC extension" } */ unsigned long g: 5; /* { dg-warning "GCC extension|ISO C" } */
ui h: 5; ui h: 5;
enum foo i: 2; /* { dg-error "narrower" } */ enum foo i: 2; /* { dg-error "narrower" } */
enum foo j: 3; enum foo j: 3;
......
...@@ -11,13 +11,13 @@ struct bf ...@@ -11,13 +11,13 @@ struct bf
int b: 2; int b: 2;
}; };
struct bf p = {4, 0}; /* { dg-warning "truncated" } */ struct bf p = {4, 0}; /* { dg-warning "truncated" "" { xfail *-*-* } } */
struct bf q = {0, 2}; /* { dg-warning "overflow" } */ struct bf q = {0, 2}; /* { dg-warning "overflow" "" { xfail *-*-* } } */
struct bf r = {3, -2}; /* { dg-bogus "(truncated|overflow)" } */ struct bf r = {3, -2}; /* { dg-bogus "(truncated|overflow)" } */
void foo () void foo ()
{ {
p.a = 4, p.b = 0; /* { dg-warning "truncated" } */ p.a = 4, p.b = 0; /* { dg-warning "truncated" "" { xfail *-*-* } } */
q.a = 0, q.b = 2; /* { dg-warning "overflow" } */ q.a = 0, q.b = 2; /* { dg-warning "overflow" "" { xfail *-*-* } } */
r.a = 3, r.b = -2; /* { dg-bogus "(truncated|overflow)" } */ r.a = 3, r.b = -2; /* { dg-bogus "(truncated|overflow)" } */
} }
...@@ -3758,29 +3758,6 @@ build_index_type (maxval) ...@@ -3758,29 +3758,6 @@ build_index_type (maxval)
return itype; return itype;
} }
/* Builds a signed or unsigned integer type of precision PRECISION.
Used for C bitfields whose precision does not match that of
built-in target types. */
tree
build_nonstandard_integer_type (precision, unsignedp)
unsigned int precision;
int unsignedp;
{
tree itype = make_node (INTEGER_TYPE);
TYPE_PRECISION (itype) = precision;
if (unsignedp)
fixup_unsigned_type (itype);
else
fixup_signed_type (itype);
if (host_integerp (TYPE_MAX_VALUE (itype), 1))
return type_hash_canon (tree_low_cst (TYPE_MAX_VALUE (itype), 1), itype);
return itype;
}
/* Create a range of some discrete type TYPE (an INTEGER_TYPE, /* Create a range of some discrete type TYPE (an INTEGER_TYPE,
ENUMERAL_TYPE, BOOLEAN_TYPE, or CHAR_TYPE), with ENUMERAL_TYPE, BOOLEAN_TYPE, or CHAR_TYPE), with
low bound LOWVAL and high bound HIGHVAL. low bound LOWVAL and high bound HIGHVAL.
......
...@@ -2862,7 +2862,6 @@ extern tree getdecls PARAMS ((void)); ...@@ -2862,7 +2862,6 @@ extern tree getdecls PARAMS ((void));
/* Function to return the chain of structure tags in the current scope level. */ /* Function to return the chain of structure tags in the current scope level. */
extern tree gettags PARAMS ((void)); extern tree gettags PARAMS ((void));
extern tree build_nonstandard_integer_type PARAMS ((unsigned int, int));
extern tree build_range_type PARAMS ((tree, tree, tree)); extern tree build_range_type PARAMS ((tree, tree, tree));
/* In alias.c */ /* In alias.c */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment