Handled flexible array members in structs (#69)

diff --git a/lib/src/code_generator/type.dart b/lib/src/code_generator/type.dart
index 9622ee4..694bacf 100644
--- a/lib/src/code_generator/type.dart
+++ b/lib/src/code_generator/type.dart
@@ -116,7 +116,7 @@
   }
   factory Type.incompleteArray(Type elementType) {
     return Type._(
-      broadType: BroadType.ConstantArray,
+      broadType: BroadType.IncompleteArray,
       child: elementType,
     );
   }
diff --git a/lib/src/header_parser/sub_parsers/structdecl_parser.dart b/lib/src/header_parser/sub_parsers/structdecl_parser.dart
index 5081aed..39c56de 100644
--- a/lib/src/header_parser/sub_parsers/structdecl_parser.dart
+++ b/lib/src/header_parser/sub_parsers/structdecl_parser.dart
@@ -19,6 +19,7 @@
   Struc struc;
   bool nestedStructMember = false;
   bool unimplementedMemberType = false;
+  bool flexibleArrayMember = false;
   bool arrayMember = false;
   _ParsedStruc();
 }
@@ -92,6 +93,12 @@
     _logger.warning(
         'Removed All Struct Members from ${_stack.top.struc.name}(${_stack.top.struc.originalName}), struct member has an unsupported type.');
     return _stack.top.struc.members.clear();
+  } else if (_stack.top.flexibleArrayMember) {
+    _logger.fine(
+        '---- Removed Struct members, reason: incomplete array member ${cursor.completeStringRepr()}');
+    _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();
   }
 }
 
@@ -118,6 +125,9 @@
           // bindings.
           _stack.top.nestedStructMember = true;
         }
+      } else if (mt.broadType == BroadType.IncompleteArray) {
+        // TODO(68): Structs with flexible Array Members are not supported.
+        _stack.top.flexibleArrayMember = true;
       }
 
       if (mt.getBaseType().broadType == BroadType.Unimplemented) {
diff --git a/test/header_parser_tests/function_n_struct.h b/test/header_parser_tests/function_n_struct.h
index e779d5f..3ee27b8 100644
--- a/test/header_parser_tests/function_n_struct.h
+++ b/test/header_parser_tests/function_n_struct.h
@@ -12,4 +12,13 @@
     struct Struct1 a;
 };
 
+struct Struct3
+{
+    int a;
+    int b[]; // Flexible array member.
+};
+
 void func1(struct Struct2 *s);
+
+// Incomplete array parameter will be treated as a pointer.
+void func2(struct Struct3 s[]);
diff --git a/test/header_parser_tests/function_n_struct_test.dart b/test/header_parser_tests/function_n_struct_test.dart
index b3da1d8..38951f1 100644
--- a/test/header_parser_tests/function_n_struct_test.dart
+++ b/test/header_parser_tests/function_n_struct_test.dart
@@ -32,22 +32,31 @@
       );
     });
 
-    test('func1', () {
+    test('func1 struct pointer parameter', () {
       expect(actual.getBindingAsString('func1'),
           expected.getBindingAsString('func1'));
     });
-    test('Struct2', () {
+    test('func2 incomplete array parameter', () {
+      expect(actual.getBindingAsString('func2'),
+          expected.getBindingAsString('func2'));
+    });
+    test('Struct2 nested struct member', () {
       expect((actual.getBinding('Struct2') as Struc).members.isEmpty, true);
     });
+    test('Struct3 flexible array member', () {
+      expect((actual.getBinding('Struct3') as Struc).members.isEmpty, true);
+    });
   });
 }
 
 Library expectedLibrary() {
   final struc2 = Struc(name: 'Struct2', members: []);
+  final struc3 = Struc(name: 'Struct3', members: []);
   return Library(
     name: 'Bindings',
     bindings: [
       struc2,
+      struc3,
       Struc(name: 'Struct1', members: [
         Member(
           name: 'a',
@@ -63,6 +72,15 @@
           SupportedNativeType.Void,
         ),
       ),
+      Func(
+        name: 'func2',
+        parameters: [
+          Parameter(name: 's', type: Type.pointer(Type.struct(struc3))),
+        ],
+        returnType: Type.nativeType(
+          SupportedNativeType.Void,
+        ),
+      ),
     ],
   );
 }