diff --git a/src/kernel_internals/typing/cabs2cil.ml b/src/kernel_internals/typing/cabs2cil.ml
index ccbe1f20c772b588235a497545701421effd9558..f6aebe306d45681b089a7e5e8c08a75260f7e139 100644
--- a/src/kernel_internals/typing/cabs2cil.ml
+++ b/src/kernel_internals/typing/cabs2cil.ml
@@ -5503,24 +5503,21 @@ and makeCompType ghost (isstruct: bool)
         match widtho with
         | None -> None, ftype
         | Some w -> begin
+            let source = fst w.expr_loc in
             (match unrollType ftype with
              | TInt (_, _) -> ()
              | TEnum _ -> ()
              | _ ->
-               Kernel.error ~once:true ~source
+               Kernel.abort ~once:true ~source
                  "Base type for bitfield is not an integer type");
             match isIntegerConstant ghost w with
             | None ->
-              Kernel.error ~source
+              Kernel.abort ~source
                 "bitfield width is not a valid integer constant";
-              (* error  does not immediately stop execution.
-                 Hence, we return a placeholder here.
-              *)
-              Some 0, ftype
             | Some s as w ->
               begin
                 if s < 0 then
-                  Kernel.error ~source "negative bitfield width (%d)" s;
+                  Kernel.abort ~source "negative bitfield width (%d)" s;
                 try
                   if s > Cil.bitsSizeOf ftype then
                     Kernel.error ~source
@@ -5559,8 +5556,12 @@ and makeCompType ghost (isstruct: bool)
               anonCompFieldName ^ (string_of_int !anonCompFieldNameId)
             end
           | _ -> n
-        end else
+        end else begin
+          if fbitfield = Some 0 then
+            Kernel.error ~source:(fst cloc)
+              "named bitfield (%s) with zero width" n;
           n
+        end
       in
       let rec is_circular t =
         match Cil.unrollType t with
diff --git a/tests/syntax/oracle/struct_with_invalid_field.0.res.oracle b/tests/syntax/oracle/struct_with_invalid_field.0.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..4babdfba70bb34026e442c04b29f88f77df5a53e
--- /dev/null
+++ b/tests/syntax/oracle/struct_with_invalid_field.0.res.oracle
@@ -0,0 +1,3 @@
+[kernel] Parsing struct_with_invalid_field.c (with preprocessing)
+/* Generated by Frama-C */
+
diff --git a/tests/syntax/oracle/struct_with_invalid_field.1.res.oracle b/tests/syntax/oracle/struct_with_invalid_field.1.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..08f35f292b14547a0bb6cb2273643c590c685e9f
--- /dev/null
+++ b/tests/syntax/oracle/struct_with_invalid_field.1.res.oracle
@@ -0,0 +1,6 @@
+[kernel] Parsing struct_with_invalid_field.c (with preprocessing)
+[kernel] struct_with_invalid_field.c:13: User Error: 
+  field `f' declared as a function
+[kernel] User Error: stopping on file "struct_with_invalid_field.c" that has errors. Add
+  '-kernel-msg-key pp' for preprocessing command.
+[kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/oracle/struct_with_invalid_field.2.res.oracle b/tests/syntax/oracle/struct_with_invalid_field.2.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..74ab8ae4929831eabb086c70a64621a0a51abc77
--- /dev/null
+++ b/tests/syntax/oracle/struct_with_invalid_field.2.res.oracle
@@ -0,0 +1,6 @@
+[kernel] Parsing struct_with_invalid_field.c (with preprocessing)
+[kernel] struct_with_invalid_field.c:21: User Error: 
+  negative bitfield width (-1)
+[kernel] User Error: stopping on file "struct_with_invalid_field.c" that has errors. Add
+  '-kernel-msg-key pp' for preprocessing command.
+[kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/oracle/struct_with_invalid_field.3.res.oracle b/tests/syntax/oracle/struct_with_invalid_field.3.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..9f48a481b14d8c7fa5a5e78205a394a884da326d
--- /dev/null
+++ b/tests/syntax/oracle/struct_with_invalid_field.3.res.oracle
@@ -0,0 +1,6 @@
+[kernel] Parsing struct_with_invalid_field.c (with preprocessing)
+[kernel] struct_with_invalid_field.c:24: User Error: 
+  negative bitfield width (-2147483648)
+[kernel] User Error: stopping on file "struct_with_invalid_field.c" that has errors. Add
+  '-kernel-msg-key pp' for preprocessing command.
+[kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/oracle/struct_with_invalid_field.4.res.oracle b/tests/syntax/oracle/struct_with_invalid_field.4.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..b1712e7f4e0211385f08c79380d7d19887ef3f4c
--- /dev/null
+++ b/tests/syntax/oracle/struct_with_invalid_field.4.res.oracle
@@ -0,0 +1,6 @@
+[kernel] Parsing struct_with_invalid_field.c (with preprocessing)
+[kernel] struct_with_invalid_field.c:27: User Error: 
+  named bitfield (d) with zero width
+[kernel] User Error: stopping on file "struct_with_invalid_field.c" that has errors. Add
+  '-kernel-msg-key pp' for preprocessing command.
+[kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/oracle/struct_with_invalid_field.res.oracle b/tests/syntax/oracle/struct_with_invalid_field.res.oracle
deleted file mode 100644
index dd110c6d7c9d94c4d9dc3ef3b40edfa622c837cc..0000000000000000000000000000000000000000
--- a/tests/syntax/oracle/struct_with_invalid_field.res.oracle
+++ /dev/null
@@ -1,9 +0,0 @@
-[kernel] Parsing struct_with_invalid_field.i (no preprocessing)
-[kernel] struct_with_invalid_field.i:8: User Error: 
-  field `f' declared as a function
-[kernel] struct_with_invalid_field.i:14: User Error: 
-  negative bitfield width (-1)
-[kernel] struct_with_invalid_field.i:15: User Error: 
-  negative bitfield width (-2147483648)
-[kernel] User Error: stopping on file "struct_with_invalid_field.i" that has errors.
-[kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/oracle/unnamed_bitfields.0.res.oracle b/tests/syntax/oracle/unnamed_bitfields.0.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..6df296791c5eceade728f06428a3bac31f330470
--- /dev/null
+++ b/tests/syntax/oracle/unnamed_bitfields.0.res.oracle
@@ -0,0 +1 @@
+[kernel] Parsing unnamed_bitfields.c (with preprocessing)
diff --git a/tests/syntax/oracle/unnamed_bitfields.1.res.oracle b/tests/syntax/oracle/unnamed_bitfields.1.res.oracle
new file mode 100644
index 0000000000000000000000000000000000000000..7e979a78da83b634c71c301194a1088e2b259f8f
--- /dev/null
+++ b/tests/syntax/oracle/unnamed_bitfields.1.res.oracle
@@ -0,0 +1,6 @@
+[kernel] Parsing unnamed_bitfields.c (with preprocessing)
+[kernel] unnamed_bitfields.c:18: User Error: 
+  named bitfield (zero_with_name) with zero width
+[kernel] User Error: stopping on file "unnamed_bitfields.c" that has errors. Add
+  '-kernel-msg-key pp' for preprocessing command.
+[kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/oracle/unnamed_bitfields.res.oracle b/tests/syntax/oracle/unnamed_bitfields.res.oracle
deleted file mode 100644
index 89cfeea2854f55cd70a8c0554f5bdccfaf2bb952..0000000000000000000000000000000000000000
--- a/tests/syntax/oracle/unnamed_bitfields.res.oracle
+++ /dev/null
@@ -1,18 +0,0 @@
-[kernel] Parsing unnamed_bitfields.i (no preprocessing)
-/* Generated by Frama-C */
-struct foo {
-   unsigned int bar : 16 ;
-   unsigned int  : 0 ;
-   unsigned int bla : 11 ;
-   unsigned int  : 1 ;
-   unsigned int bli : 4 ;
-   unsigned int  : 0 ;
-};
-unsigned int f(struct foo s)
-{
-  unsigned int __retres;
-  __retres = (unsigned int)s.bla;
-  return __retres;
-}
-
-
diff --git a/tests/syntax/oracle/very_large_integers.0.res.oracle b/tests/syntax/oracle/very_large_integers.0.res.oracle
index 070b0b0891f16262542a70f19eb56aace59d771e..1236cc7d7251b2e8c568575ebd87c1f5fe81ecbc 100644
--- a/tests/syntax/oracle/very_large_integers.0.res.oracle
+++ b/tests/syntax/oracle/very_large_integers.0.res.oracle
@@ -3,11 +3,6 @@
   integer constant too large in expression (unsigned long long)999999999999999999 + 9999999999999999999
 [kernel] very_large_integers.c:26: User Error: 
   bitfield width is not a valid integer constant
-[kernel] very_large_integers.c:74: Warning: 
-  ignoring invalid aligned attribute: __aligned__(9223372036854775808)
-[kernel] very_large_integers.c:74: Warning: 
-  ignoring invalid aligned attribute: __aligned__((9223372036854775808)+
-                                                   (9223372036854775808) )
 [kernel] User Error: stopping on file "very_large_integers.c" that has errors. Add
   '-kernel-msg-key pp' for preprocessing command.
 [kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/struct_with_invalid_field.c b/tests/syntax/struct_with_invalid_field.c
new file mode 100644
index 0000000000000000000000000000000000000000..527c15e35e09fab00562f15130b246cf8888b027
--- /dev/null
+++ b/tests/syntax/struct_with_invalid_field.c
@@ -0,0 +1,30 @@
+/* run.config*
+   STDOPT:
+ EXIT: 1
+   STDOPT: #"-cpp-extra-args=-DFUNTYPE"
+   STDOPT: #"-cpp-extra-args=-DNEG1"
+   STDOPT: #"-cpp-extra-args=-DNEG2"
+   STDOPT: #"-cpp-extra-args=-DNAMEDZERO"
+*/
+
+#ifdef FUNTYPE
+// invalid field with function type, parsing should fail
+struct {
+  void f(int);
+} s;
+#endif
+
+// negative-width bitfields, parsing should fail
+struct neg_bf
+{
+#ifdef NEG1
+  int a:(-1); // invalid
+#endif
+#ifdef NEG2
+  int b:(-2147483647-1); // invalid
+#endif
+#ifdef NAMEDZERO
+  int d:(-0); // invalid (named zero-width)
+#endif
+  int :(-0); // valid (unnamed zero-width)
+};
diff --git a/tests/syntax/struct_with_invalid_field.i b/tests/syntax/struct_with_invalid_field.i
deleted file mode 100644
index c1c4e15224e7da9d063a5618975c1f6c14823de1..0000000000000000000000000000000000000000
--- a/tests/syntax/struct_with_invalid_field.i
+++ /dev/null
@@ -1,17 +0,0 @@
-/* run.config*
- EXIT: 1
-   STDOPT:
-*/
-
-// invalid field with function type, parsing should fail
-struct {
-  void f(int);
-} s;
-
-// negative-width bitfields, parsing should fail
-struct neg_bf
-{
-  int a:(-1); // invalid
-  int b:(-2147483647-1); // invalid
-  int d:(-0); // valid
-};
diff --git a/tests/syntax/unnamed_bitfields.c b/tests/syntax/unnamed_bitfields.c
new file mode 100644
index 0000000000000000000000000000000000000000..6f999ad0a8ac91bca35a22d9ce50cf2cbc3b9a7a
--- /dev/null
+++ b/tests/syntax/unnamed_bitfields.c
@@ -0,0 +1,23 @@
+/* run.config
+OPT:
+EXIT:1
+OPT: -cpp-extra-args="-DINVALID_ZERO_BF"
+ */
+
+struct foo
+{
+        unsigned        bar  : 16, : 0;
+        unsigned        bla  : 11, : 1;
+        unsigned        bli  : 4,  : 0;
+};
+
+#ifdef INVALID_ZERO_BF
+struct invalid_foo
+{
+  unsigned        first  : 1;
+  unsigned        zero_with_name: 0;
+  unsigned        last  : 2;
+};
+#endif
+
+unsigned f(struct foo s) { return s.bla; }
diff --git a/tests/syntax/unnamed_bitfields.i b/tests/syntax/unnamed_bitfields.i
deleted file mode 100644
index 14e793c74ab38cbe87329bc9f89ec5693c4584a4..0000000000000000000000000000000000000000
--- a/tests/syntax/unnamed_bitfields.i
+++ /dev/null
@@ -1,8 +0,0 @@
-struct foo
-{
-        unsigned        bar  : 16, : 0;
-        unsigned        bla  : 11, : 1;
-        unsigned        bli  : 4,  : 0;
-};
-
-unsigned f(struct foo s) { return s.bla; }
diff --git a/tests/value/library.i b/tests/value/library.i
index 797623ff33b77cc4ee483367070e4bf42c3cf926..a7de6191a45e32d95a96bfde962081c2891b47a3 100644
--- a/tests/value/library.i
+++ b/tests/value/library.i
@@ -60,7 +60,7 @@ void (*ff)();
 
 struct {
   short bf1: 5;
-  short bf : 0; // 0-sized bitfield: do not attemp to initialize it
+  short  : 0; // 0-sized bitfield: do not attempt to initialize it
   unsigned int control: 14, : 0;
 } s_bitfield;