Skip to content

Commit

Permalink
Elab bitfields: check size of type <=32bit rather than checking rank (#…
Browse files Browse the repository at this point in the history
…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: Amos Robinson <[email protected]>
  • Loading branch information
amosr and Amos Robinson authored Apr 19, 2021
1 parent 45af10b commit 0877e32
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 2 deletions.
2 changes: 1 addition & 1 deletion cparser/Elab.ml
Original file line number Diff line number Diff line change
Expand Up @@ -1001,7 +1001,7 @@ and elab_field_group env = function
| TInt(ik, _) -> ik
| TEnum(_, _) -> enum_ikind
| _ -> 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
"the type of bit-field '%a' must be an integer type no bigger than 'int'" pp_field id;
None,env
Expand Down
2 changes: 1 addition & 1 deletion test/regression/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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

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 \
varargs1 varargs2 varargs3 sections alias aligned

Expand Down
1 change: 1 addition & 0 deletions test/regression/Results/bitfields_uint_t
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
x = { a = 1, b = 2, c = 3, d = 4 }
22 changes: 22 additions & 0 deletions test/regression/bitfields_uint_t.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#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);
}


0 comments on commit 0877e32

Please sign in to comment.