diff options
author | Neil Booth <neil@daikokuya.demon.co.uk> | 2002-01-29 17:19:58 +0000 |
---|---|---|
committer | Neil Booth <neil@gcc.gnu.org> | 2002-01-29 17:19:58 +0000 |
commit | 8469e54e147147ee65ee899b20fd68493af85327 (patch) | |
tree | 21de1159c8ed89bada613b376351f07531e6dca3 /gcc/tree.c | |
parent | 6c54b16cef90d93555a96dc3542fea96b8a4c7fc (diff) | |
download | gcc-8469e54e147147ee65ee899b20fd68493af85327.tar.gz |
re PR c/3325 (cast of bit-field to same type gets discarded)
PR c/3325
* c-decl.c (enum_decl_context): Remove BITFIELD.
(grokdeclarator): Take bitfield width as an input.
Ensure bitfields are given the correct type. Perform
bitfield width validation with build_bitfield_integer_type
rather than waiting for finish_struct.
(grok_typename, grok_typename_in_parm_context, start_decl,
push_parmdecl, grokfield, start_function): Update calls to
grokdeclarator.
(build_bitfield_integer_type): New function.
(finish_struct): Move bitfield validation to grokdeclarator
and build_bitfield_integer_type.
* tree.c (build_nonstandard_integer_type): New function.
* tree.h (build_nonstandard_integer_type): New prototype.
objc:
* objc-act.c (objc_copy_list): Remove DECL_INITIAL kludge.
testsuite:
* gcc.c-torture/compile/20000224-1.c: Update.
* gcc.c-torture/execute/bitfld-1.c: New tests.
* gcc.dg/bitfld-1.c, bitfld-2.c: Diagnostic tests.
* gcc.dg/uninit-A.c: Update.
From-SVN: r49321
Diffstat (limited to 'gcc/tree.c')
-rw-r--r-- | gcc/tree.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/gcc/tree.c b/gcc/tree.c index 86c0cd0036d..8d22d6856a7 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -3758,6 +3758,29 @@ build_index_type (maxval) 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 HOST_WIDE_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, ENUMERAL_TYPE, BOOLEAN_TYPE, or CHAR_TYPE), with low bound LOWVAL and high bound HIGHVAL. |