Unverified Commit 0877e32e authored by Amos Robinson's avatar Amos Robinson Committed by GitHub
Browse files

Elab bitfields: check size of type <=32bit rather than checking rank (#387)



When desugaring a bitfield, allow any integral type that is 32 bits
or smaller. Previously this was checking the rank of the type rather
than the size.

This rank check caused issues with standard headers that
declare `uint32_t` to be an `unsigned long` rather than an
`unsigned int`. Here, any bitfields declared as `uint32_t` were
failing to compile even though they are still actually 32 bits.
Co-authored-by: default avatarAmos Robinson <amos@gh.st>
parent 45af10b3
...@@ -1001,7 +1001,7 @@ and elab_field_group env = function ...@@ -1001,7 +1001,7 @@ and elab_field_group env = function
| TInt(ik, _) -> ik | TInt(ik, _) -> ik
| TEnum(_, _) -> enum_ikind | TEnum(_, _) -> enum_ikind
| _ -> ILongLong (* trigger next error message *) in | _ -> ILongLong (* trigger next error message *) in
if integer_rank ik > integer_rank IInt then begin if sizeof_ikind ik > sizeof_ikind IInt then begin
error loc error loc
"the type of bit-field '%a' must be an integer type no bigger than 'int'" pp_field id; "the type of bit-field '%a' must be an integer type no bigger than 'int'" pp_field id;
None,env None,env
......
...@@ -21,7 +21,7 @@ TESTS=int32 int64 floats floats-basics floats-lit \ ...@@ -21,7 +21,7 @@ TESTS=int32 int64 floats floats-basics floats-lit \
# Can run, but only in compiled mode, and have reference output in Results # Can run, but only in compiled mode, and have reference output in Results
TESTS_COMP=attribs1 bitfields1 bitfields2 bitfields3 bitfields4 \ TESTS_COMP=attribs1 bitfields1 bitfields2 bitfields3 bitfields4 \
bitfields5 bitfields6 bitfields7 bitfields8 \ bitfields5 bitfields6 bitfields7 bitfields8 bitfields_uint_t \
builtins-common builtins-$(ARCH) packedstruct1 packedstruct2 alignas \ builtins-common builtins-$(ARCH) packedstruct1 packedstruct2 alignas \
varargs1 varargs2 varargs3 sections alias aligned varargs1 varargs2 varargs3 sections alias aligned
......
x = { a = 1, b = 2, c = 3, d = 4 }
#include <stdio.h>
#include <stdint.h>
/* Test that uint32 type synonym works.
This previously failed for standard headers where uint32 is defined
as a (32-bit) unsigned long. */
struct s {
uint32_t a: 1;
uint32_t b: 2;
uint32_t c: 9;
uint32_t d: 20;
};
struct s x = { 1, 2, 3, 4 };
int main()
{
printf("x = { a = %d, b = %d, c = %d, d = %d }\n", x.a, x.b, x.c, x.d);
}
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