Remove structs members for bit field members, Added tests (#85)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 12fe1b5..f496c70 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+# 0.2.3
+- Fixed parsing structs with bitfields, all members of structs with bit field members will now be removed. See [#84](https://github.com/dart-lang/ffigen/issues/84)
+
 # 0.2.2+1
 - Updated `package:meta` version to `^1.1.8` for compatibility with flutter sdk.
 
diff --git a/lib/src/clang_library/wrapper.c b/lib/src/clang_library/wrapper.c
index 2482e36..96f64ba 100644
--- a/lib/src/clang_library/wrapper.c
+++ b/lib/src/clang_library/wrapper.c
@@ -363,4 +363,8 @@
     return ptrToCXString(clang_getCursorUSR(*cursor));
 }
 
+int clang_getFieldDeclBitWidth_wrap(CXCursor *cursor){
+    return clang_getFieldDeclBitWidth(*cursor);
+}
+
 // END ===== WRAPPER FUNCTIONS =====================
diff --git a/lib/src/clang_library/wrapper.def b/lib/src/clang_library/wrapper.def
index 5cb8a5c..8a984b0 100644
--- a/lib/src/clang_library/wrapper.def
+++ b/lib/src/clang_library/wrapper.def
@@ -359,3 +359,4 @@
 clang_Cursor_isAnonymous_wrap
 clang_Cursor_isAnonymousRecordDecl_wrap
 clang_getCursorUSR_wrap
+clang_getFieldDeclBitWidth_wrap
diff --git a/lib/src/header_parser/clang_bindings/clang_bindings.dart b/lib/src/header_parser/clang_bindings/clang_bindings.dart
index 82222c7..b108302 100644
--- a/lib/src/header_parser/clang_bindings/clang_bindings.dart
+++ b/lib/src/header_parser/clang_bindings/clang_bindings.dart
@@ -791,6 +791,20 @@
   }
 
   _dart_clang_getCursorUSR_wrap _clang_getCursorUSR_wrap;
+
+  int clang_getFieldDeclBitWidth_wrap(
+    ffi.Pointer<CXCursor> cursor,
+  ) {
+    _clang_getFieldDeclBitWidth_wrap ??= _dylib.lookupFunction<
+            _c_clang_getFieldDeclBitWidth_wrap,
+            _dart_clang_getFieldDeclBitWidth_wrap>(
+        'clang_getFieldDeclBitWidth_wrap');
+    return _clang_getFieldDeclBitWidth_wrap(
+      cursor,
+    );
+  }
+
+  _dart_clang_getFieldDeclBitWidth_wrap _clang_getFieldDeclBitWidth_wrap;
 }
 
 /// A character string.
@@ -2662,3 +2676,11 @@
 typedef _dart_clang_getCursorUSR_wrap = ffi.Pointer<CXString> Function(
   ffi.Pointer<CXCursor> cursor,
 );
+
+typedef _c_clang_getFieldDeclBitWidth_wrap = ffi.Int32 Function(
+  ffi.Pointer<CXCursor> cursor,
+);
+
+typedef _dart_clang_getFieldDeclBitWidth_wrap = int Function(
+  ffi.Pointer<CXCursor> cursor,
+);
diff --git a/lib/src/header_parser/sub_parsers/structdecl_parser.dart b/lib/src/header_parser/sub_parsers/structdecl_parser.dart
index 6ae4c80..44ece8d 100644
--- a/lib/src/header_parser/sub_parsers/structdecl_parser.dart
+++ b/lib/src/header_parser/sub_parsers/structdecl_parser.dart
@@ -21,6 +21,7 @@
   bool unimplementedMemberType = false;
   bool flexibleArrayMember = false;
   bool arrayMember = false;
+  bool bitFieldMember = false;
   _ParsedStruc();
 }
 
@@ -108,6 +109,12 @@
     _logger.warning(
         'Removed All Struct Members from ${_stack.top.struc.name}(${_stack.top.struc.originalName}), Flexible array members not supported.');
     return _stack.top.struc.members.clear();
+  } else if (_stack.top.bitFieldMember) {
+    _logger.fine(
+        '---- Removed Struct members, reason: bitfield members ${cursor.completeStringRepr()}');
+    _logger.warning(
+        'Removed All Struct Members from ${_stack.top.struc.name}(${_stack.top.struc.originalName}), Bit Field members not supported.');
+    return _stack.top.struc.members.clear();
   }
 }
 
@@ -121,7 +128,6 @@
       _logger.finer('===== member: ${cursor.completeStringRepr()}');
 
       final mt = cursor.type().toCodeGenTypeAndDispose();
-
       //TODO(4): Remove these when support for Structs by value arrives.
       if (mt.broadType == BroadType.Struct) {
         // Setting this flag will exclude adding members for this struct's
@@ -137,6 +143,9 @@
       } else if (mt.broadType == BroadType.IncompleteArray) {
         // TODO(68): Structs with flexible Array Members are not supported.
         _stack.top.flexibleArrayMember = true;
+      } else if (clang.clang_getFieldDeclBitWidth_wrap(cursor) != -1) {
+        // TODO(84): Struct with bitfields are not suppoorted.
+        _stack.top.bitFieldMember = true;
       }
 
       if (mt.getBaseType().broadType == BroadType.Unimplemented) {
diff --git a/lib/src/strings.dart b/lib/src/strings.dart
index 726e2f5..9337fa1 100644
--- a/lib/src/strings.dart
+++ b/lib/src/strings.dart
@@ -7,7 +7,7 @@
     as clang;
 
 // This version must be updated whenever we update the libclang wrapper.
-const dylibVersion = 'v3';
+const dylibVersion = 'v4';
 
 /// Name of the dynamic library file according to current platform.
 String get dylibFileName {
diff --git a/pubspec.yaml b/pubspec.yaml
index ca0fb44..9695da5 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -3,7 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 name: ffigen
-version: 0.2.2+1
+version: 0.2.3
 homepage: https://github.com/dart-lang/ffigen
 description: Experimental generator for FFI bindings, using LibClang to parse C/C++ header files.
 
diff --git a/test/header_parser_tests/function_n_struct.h b/test/header_parser_tests/function_n_struct.h
index 3ee27b8..629c0ba 100644
--- a/test/header_parser_tests/function_n_struct.h
+++ b/test/header_parser_tests/function_n_struct.h
@@ -18,6 +18,13 @@
     int b[]; // Flexible array member.
 };
 
+// All members should be removed, Bit fields are not supported.
+struct Struct4
+{
+    int a:3;
+    int :2; // Unnamed bit field.
+};
+
 void func1(struct Struct2 *s);
 
 // Incomplete array parameter will be treated as a pointer.
diff --git a/test/header_parser_tests/function_n_struct_test.dart b/test/header_parser_tests/function_n_struct_test.dart
index 38951f1..909c13a 100644
--- a/test/header_parser_tests/function_n_struct_test.dart
+++ b/test/header_parser_tests/function_n_struct_test.dart
@@ -46,6 +46,9 @@
     test('Struct3 flexible array member', () {
       expect((actual.getBinding('Struct3') as Struc).members.isEmpty, true);
     });
+    test('Struct4 bit field member', () {
+      expect((actual.getBinding('Struct4') as Struc).members.isEmpty, true);
+    });
   });
 }
 
@@ -81,6 +84,7 @@
           SupportedNativeType.Void,
         ),
       ),
+      Struc(name: 'Struct4'),
     ],
   );
 }
diff --git a/tool/libclang_config.yaml b/tool/libclang_config.yaml
index c6baf25..4262736 100644
--- a/tool/libclang_config.yaml
+++ b/tool/libclang_config.yaml
@@ -100,3 +100,4 @@
     - clang_Cursor_isAnonymous_wrap
     - clang_Cursor_isAnonymousRecordDecl_wrap
     - clang_getCursorUSR_wrap
+    - clang_getFieldDeclBitWidth_wrap