diff --git a/src/kernel_internals/typing/cabs2cil.ml b/src/kernel_internals/typing/cabs2cil.ml
index 4282f0e9f46d53aee4dc7b2f52b9773606f1a9bc..4e88edb64f0ffd77e8db0f1dc49f208b0e94263c 100644
--- a/src/kernel_internals/typing/cabs2cil.ml
+++ b/src/kernel_internals/typing/cabs2cil.ml
@@ -5417,8 +5417,9 @@ and makeCompType ghost (isstruct: bool)
     let addFieldInfo ~last:last_field (flds : fieldinfo list)
         (((n,ndt,a,cloc) : A.name), (widtho : A.expression option))
       : fieldinfo list =
+      let source = fst cloc in
       if sto <> NoStorage || inl then
-        Kernel.error ~once:true ~current:true "Storage or inline not allowed for fields";
+        Kernel.error ~once:true ~source "Storage or inline not allowed for fields";
       let allowZeroSizeArrays = true in
       let ftype, fattr =
         doType
@@ -5431,10 +5432,10 @@ and makeCompType ghost (isstruct: bool)
          struct C2 { struct C1 c1; int dummy; };
       *)
       if Cil.isFunctionType ftype then
-        Kernel.error ~current:true
+        Kernel.error ~source
           "field `%s' declared as a function" n
       else if Cil.has_flexible_array_member ftype && isstruct then
-        Kernel.error ~current:true
+        Kernel.error ~source
           "field `%s' declared with a type containing a flexible array member."
           n
       else if not (Cil.isCompleteType ~allowZeroSizeArrays ftype)
@@ -5445,14 +5446,14 @@ and makeCompType ghost (isstruct: bool)
             (* possible flexible array member; check if struct contains at least
                one other field *)
             if flds = [] then (* struct is empty *)
-              Kernel.error ~current:true
+              Kernel.error ~source
                 "flexible array member '%s' (type %a) \
                  not allowed in otherwise empty struct"
                 n Cil_printer.pp_typ ftype
             else (* valid flexible array member *) ()
           end
         | _ ->
-          Kernel.error ~current:true
+          Kernel.error ~source
             "field `%s' is declared with incomplete type %a"
             n Cil_printer.pp_typ ftype
       end;
@@ -5464,11 +5465,11 @@ and makeCompType ghost (isstruct: bool)
              | TInt (_, _) -> ()
              | TEnum _ -> ()
              | _ ->
-               Kernel.error ~once:true ~current:true
+               Kernel.error ~once:true ~source
                  "Base type for bitfield is not an integer type");
             match isIntegerConstant ghost w with
             | None ->
-              Kernel.error ~current:true
+              Kernel.error ~source
                 "bitfield width is not an integer constant";
               (* error  does not immediately stop execution.
                  Hence, we return a placeholder here.
@@ -5476,14 +5477,16 @@ and makeCompType ghost (isstruct: bool)
               Some 0, ftype
             | Some s as w ->
               begin
+                if s < 0 then
+                  Kernel.error ~source "negative bitfield width (%d)" s;
                 try
                   if s > Cil.bitsSizeOf ftype then
-                    Kernel.error ~current:true
+                    Kernel.error ~source
                       "bitfield width (%d) exceeds its type (%a, %d bits)"
                       s Cil_printer.pp_typ ftype (Cil.bitsSizeOf ftype)
                 with
                   SizeOfError _ ->
-                  Kernel.fatal ~current:true
+                  Kernel.fatal ~source
                     "Unable to compute size of %a" Cil_printer.pp_typ ftype
               end;
               let ftype =
diff --git a/tests/syntax/oracle/fam.res.oracle b/tests/syntax/oracle/fam.res.oracle
index 8ccf9f18f6f5ea030a3ff85f5e597a43aa74de04..cd389c848e28e89b9b19cbf7327dc2be09f0896a 100644
--- a/tests/syntax/oracle/fam.res.oracle
+++ b/tests/syntax/oracle/fam.res.oracle
@@ -1,7 +1,7 @@
 [kernel] Parsing tests/syntax/fam.i (no preprocessing)
 [kernel] tests/syntax/fam.i:16: User Error: 
   static initialization of flexible array members is an unsupported GNU extension
-[kernel] tests/syntax/fam.i:28: User Error: 
+[kernel] tests/syntax/fam.i:29: User Error: 
   field `b' is declared with incomplete type char []
 [kernel] tests/syntax/fam.i:28: User Error: 
   static initialization of flexible array members is an unsupported GNU extension
diff --git a/tests/syntax/oracle/flexible_array_member_invalid1.res.oracle b/tests/syntax/oracle/flexible_array_member_invalid1.res.oracle
index 1747cd9c2c39144829c5697e1846f8828161ae67..9946bb6acd85b78e0ab036576a152b97562e4371 100644
--- a/tests/syntax/oracle/flexible_array_member_invalid1.res.oracle
+++ b/tests/syntax/oracle/flexible_array_member_invalid1.res.oracle
@@ -1,5 +1,5 @@
 [kernel] Parsing tests/syntax/flexible_array_member_invalid1.i (no preprocessing)
-[kernel] tests/syntax/flexible_array_member_invalid1.i:7: User Error: 
+[kernel] tests/syntax/flexible_array_member_invalid1.i:8: User Error: 
   flexible array member 'data' (type char []) not allowed in otherwise empty struct
 [kernel] User Error: stopping on file "tests/syntax/flexible_array_member_invalid1.i" that has
   errors.
diff --git a/tests/syntax/oracle/flexible_array_member_invalid2.res.oracle b/tests/syntax/oracle/flexible_array_member_invalid2.res.oracle
index 08b2bbe1285519910ffd0194603ecffc25ea179d..99f1f24d88212f4b315c0b278fc9843752526173 100644
--- a/tests/syntax/oracle/flexible_array_member_invalid2.res.oracle
+++ b/tests/syntax/oracle/flexible_array_member_invalid2.res.oracle
@@ -1,5 +1,5 @@
 [kernel] Parsing tests/syntax/flexible_array_member_invalid2.i (no preprocessing)
-[kernel] tests/syntax/flexible_array_member_invalid2.i:7: User Error: 
+[kernel] tests/syntax/flexible_array_member_invalid2.i:9: User Error: 
   field `data' is declared with incomplete type char []
 [kernel] User Error: stopping on file "tests/syntax/flexible_array_member_invalid2.i" that has
   errors.
diff --git a/tests/syntax/oracle/flexible_array_member_invalid3.res.oracle b/tests/syntax/oracle/flexible_array_member_invalid3.res.oracle
index c7e88ab06296193f8a930b30f4ac9686c457763b..b344417d741e8e115408dae13758ce18d4b1a13d 100644
--- a/tests/syntax/oracle/flexible_array_member_invalid3.res.oracle
+++ b/tests/syntax/oracle/flexible_array_member_invalid3.res.oracle
@@ -1,5 +1,5 @@
 [kernel] Parsing tests/syntax/flexible_array_member_invalid3.i (no preprocessing)
-[kernel] tests/syntax/flexible_array_member_invalid3.i:8: User Error: 
+[kernel] tests/syntax/flexible_array_member_invalid3.i:10: User Error: 
   field `data' is declared with incomplete type char []
 [kernel] User Error: stopping on file "tests/syntax/flexible_array_member_invalid3.i" that has
   errors.
diff --git a/tests/syntax/oracle/flexible_array_member_invalid4.res.oracle b/tests/syntax/oracle/flexible_array_member_invalid4.res.oracle
index 238b92acd43a45da575a026a1ed434bdc0f90033..d2876944dca7cfac4bc276286000748b34f89d2d 100644
--- a/tests/syntax/oracle/flexible_array_member_invalid4.res.oracle
+++ b/tests/syntax/oracle/flexible_array_member_invalid4.res.oracle
@@ -1,5 +1,5 @@
 [kernel] Parsing tests/syntax/flexible_array_member_invalid4.i (no preprocessing)
-[kernel] tests/syntax/flexible_array_member_invalid4.i:7: User Error: 
+[kernel] tests/syntax/flexible_array_member_invalid4.i:9: User Error: 
   field `data' is declared with incomplete type char []
 [kernel] User Error: stopping on file "tests/syntax/flexible_array_member_invalid4.i" that has
   errors.
diff --git a/tests/syntax/oracle/flexible_array_member_invalid5.res.oracle b/tests/syntax/oracle/flexible_array_member_invalid5.res.oracle
index 8e1dca203f55c5b1536d845e7f3cb4826cac798d..bb1c0f48c0786337b8a291c5d22227dca656e281 100644
--- a/tests/syntax/oracle/flexible_array_member_invalid5.res.oracle
+++ b/tests/syntax/oracle/flexible_array_member_invalid5.res.oracle
@@ -1,5 +1,5 @@
 [kernel] Parsing tests/syntax/flexible_array_member_invalid5.i (no preprocessing)
-[kernel] tests/syntax/flexible_array_member_invalid5.i:13: User Error: 
+[kernel] tests/syntax/flexible_array_member_invalid5.i:15: User Error: 
   field `f' declared with a type containing a flexible array member.
 [kernel] User Error: stopping on file "tests/syntax/flexible_array_member_invalid5.i" that has
   errors.
diff --git a/tests/syntax/oracle/incomplete_struct_field.res.oracle b/tests/syntax/oracle/incomplete_struct_field.res.oracle
index 1fd54ec0cfd8ceb5a376b144f885cb2f48cc6043..893450fdd3c9ea83912a6b69431a42f8def2fdbc 100644
--- a/tests/syntax/oracle/incomplete_struct_field.res.oracle
+++ b/tests/syntax/oracle/incomplete_struct_field.res.oracle
@@ -1,7 +1,7 @@
 [kernel] Parsing tests/syntax/incomplete_struct_field.i (no preprocessing)
 [kernel] tests/syntax/incomplete_struct_field.i:5: User Error: 
   declaration of array of incomplete type 'struct _s`
-[kernel] tests/syntax/incomplete_struct_field.i:5: User Error: 
+[kernel] tests/syntax/incomplete_struct_field.i:7: User Error: 
   field `v' is declared with incomplete type struct _s [12]
 [kernel] tests/syntax/incomplete_struct_field.i:5: User Error: 
   type struct _s is circular
diff --git a/tests/syntax/oracle/struct_with_function_field_invalid.res.oracle b/tests/syntax/oracle/struct_with_function_field_invalid.res.oracle
deleted file mode 100644
index b54f3ab0368599cabc43276115e2a317bae3dfa8..0000000000000000000000000000000000000000
--- a/tests/syntax/oracle/struct_with_function_field_invalid.res.oracle
+++ /dev/null
@@ -1,6 +0,0 @@
-[kernel] Parsing tests/syntax/struct_with_function_field_invalid.i (no preprocessing)
-[kernel] tests/syntax/struct_with_function_field_invalid.i:7: User Error: 
-  field `f' declared as a function
-[kernel] User Error: stopping on file "tests/syntax/struct_with_function_field_invalid.i" that has
-  errors.
-[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
new file mode 100644
index 0000000000000000000000000000000000000000..001273c4d944b386ae86f8966d5b5a9b0f613107
--- /dev/null
+++ b/tests/syntax/oracle/struct_with_invalid_field.res.oracle
@@ -0,0 +1,9 @@
+[kernel] Parsing tests/syntax/struct_with_invalid_field.i (no preprocessing)
+[kernel] tests/syntax/struct_with_invalid_field.i:8: User Error: 
+  field `f' declared as a function
+[kernel] tests/syntax/struct_with_invalid_field.i:14: User Error: 
+  negative bitfield width (-1)
+[kernel] tests/syntax/struct_with_invalid_field.i:15: User Error: 
+  negative bitfield width (-2147483648)
+[kernel] User Error: stopping on file "tests/syntax/struct_with_invalid_field.i" that has errors.
+[kernel] Frama-C aborted: invalid user input.
diff --git a/tests/syntax/struct_with_function_field_invalid.i b/tests/syntax/struct_with_function_field_invalid.i
deleted file mode 100644
index c522453305f94cfd11edab28d158226619f875f7..0000000000000000000000000000000000000000
--- a/tests/syntax/struct_with_function_field_invalid.i
+++ /dev/null
@@ -1,9 +0,0 @@
-/* run.config*
- EXIT: 1
-   STDOPT:
-*/
-
-// invalid field with function type, parsing should fail
-struct {
-  void f(int);
-} s;
diff --git a/tests/syntax/struct_with_invalid_field.i b/tests/syntax/struct_with_invalid_field.i
new file mode 100644
index 0000000000000000000000000000000000000000..c1c4e15224e7da9d063a5618975c1f6c14823de1
--- /dev/null
+++ b/tests/syntax/struct_with_invalid_field.i
@@ -0,0 +1,17 @@
+/* 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/value/oracle/empty_base.0.res.oracle b/tests/value/oracle/empty_base.0.res.oracle
index 0af48095560b9c93b62c891c7466ad21314f60a8..28a0b5e21ea980b8fd9891b1cde2b3d580e9cd31 100644
--- a/tests/value/oracle/empty_base.0.res.oracle
+++ b/tests/value/oracle/empty_base.0.res.oracle
@@ -5,7 +5,7 @@
   Too many initializers for structure
 [kernel] tests/value/empty_base.c:75: User Error: 
   field `z' declared with a type containing a flexible array member.
-[kernel] tests/value/empty_base.c:80: User Error: 
+[kernel] tests/value/empty_base.c:81: User Error: 
   field `f1' declared with a type containing a flexible array member.
 [kernel] User Error: stopping on file "tests/value/empty_base.c" that has errors. Add
   '-kernel-msg-key pp' for preprocessing command.