aboutsummaryrefslogtreecommitdiffstats
path: root/test/regression/bitfields_uint_t.c
diff options
context:
space:
mode:
authorAmos Robinson <amos.robinson@gmail.com>2021-04-20 02:02:30 +1000
committerGitHub <noreply@github.com>2021-04-19 18:02:30 +0200
commit0877e32e0bb836a1b3b34d678f0c68f852c55ff3 (patch)
treed7996a0ce291e019f43adeac2b68d5918196fa88 /test/regression/bitfields_uint_t.c
parent45af10b3ac30f8e4f5904824259b04df17e1c6b1 (diff)
downloadcompcert-kvx-0877e32e0bb836a1b3b34d678f0c68f852c55ff3.tar.gz
compcert-kvx-0877e32e0bb836a1b3b34d678f0c68f852c55ff3.zip
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: Amos Robinson <amos@gh.st>
Diffstat (limited to 'test/regression/bitfields_uint_t.c')
-rw-r--r--test/regression/bitfields_uint_t.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/test/regression/bitfields_uint_t.c b/test/regression/bitfields_uint_t.c
new file mode 100644
index 00000000..3d7fb4e7
--- /dev/null
+++ b/test/regression/bitfields_uint_t.c
@@ -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);
+}
+
+