@@ -1305,6 +1305,7 @@ trait FieldCodegen<'a> {
1305
1305
accessor_kind : FieldAccessorKind ,
1306
1306
parent : & CompInfo ,
1307
1307
parent_item : & Item ,
1308
+ last_field : bool ,
1308
1309
result : & mut CodegenResult ,
1309
1310
struct_layout : & mut StructLayoutTracker ,
1310
1311
fields : & mut F ,
@@ -1325,6 +1326,7 @@ impl<'a> FieldCodegen<'a> for Field {
1325
1326
accessor_kind : FieldAccessorKind ,
1326
1327
parent : & CompInfo ,
1327
1328
parent_item : & Item ,
1329
+ last_field : bool ,
1328
1330
result : & mut CodegenResult ,
1329
1331
struct_layout : & mut StructLayoutTracker ,
1330
1332
fields : & mut F ,
@@ -1342,6 +1344,7 @@ impl<'a> FieldCodegen<'a> for Field {
1342
1344
accessor_kind,
1343
1345
parent,
1344
1346
parent_item,
1347
+ last_field,
1345
1348
result,
1346
1349
struct_layout,
1347
1350
fields,
@@ -1356,6 +1359,7 @@ impl<'a> FieldCodegen<'a> for Field {
1356
1359
accessor_kind,
1357
1360
parent,
1358
1361
parent_item,
1362
+ last_field,
1359
1363
result,
1360
1364
struct_layout,
1361
1365
fields,
@@ -1400,6 +1404,7 @@ impl<'a> FieldCodegen<'a> for FieldData {
1400
1404
accessor_kind : FieldAccessorKind ,
1401
1405
parent : & CompInfo ,
1402
1406
parent_item : & Item ,
1407
+ last_field : bool ,
1403
1408
result : & mut CodegenResult ,
1404
1409
struct_layout : & mut StructLayoutTracker ,
1405
1410
fields : & mut F ,
@@ -1425,17 +1430,20 @@ impl<'a> FieldCodegen<'a> for FieldData {
1425
1430
let ty = if parent. is_union ( ) {
1426
1431
wrap_union_field_if_needed ( ctx, struct_layout, ty, result)
1427
1432
} else if let Some ( item) = field_ty. is_incomplete_array ( ctx) {
1428
- result. saw_incomplete_array ( ) ;
1429
- struct_layout. saw_flexible_array ( ) ;
1430
-
1431
- let inner = item. to_rust_ty_or_opaque ( ctx, & ( ) ) ;
1432
-
1433
- if ctx. options ( ) . flexarray_dst {
1433
+ // Only FAM if its the last field
1434
+ if ctx. options ( ) . flexarray_dst && last_field {
1435
+ struct_layout. saw_flexible_array ( ) ;
1434
1436
syn:: parse_quote! { FAM }
1435
- } else if ctx. options ( ) . enable_cxx_namespaces {
1436
- syn:: parse_quote! { root:: __IncompleteArrayField<#inner> }
1437
1437
} else {
1438
- syn:: parse_quote! { __IncompleteArrayField<#inner> }
1438
+ result. saw_incomplete_array ( ) ;
1439
+
1440
+ let inner = item. to_rust_ty_or_opaque ( ctx, & ( ) ) ;
1441
+
1442
+ if ctx. options ( ) . enable_cxx_namespaces {
1443
+ syn:: parse_quote! { root:: __IncompleteArrayField<#inner> }
1444
+ } else {
1445
+ syn:: parse_quote! { __IncompleteArrayField<#inner> }
1446
+ }
1439
1447
}
1440
1448
} else {
1441
1449
ty
@@ -1657,6 +1665,7 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit {
1657
1665
accessor_kind : FieldAccessorKind ,
1658
1666
parent : & CompInfo ,
1659
1667
parent_item : & Item ,
1668
+ _last_field : bool ,
1660
1669
result : & mut CodegenResult ,
1661
1670
struct_layout : & mut StructLayoutTracker ,
1662
1671
fields : & mut F ,
@@ -1717,7 +1726,8 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit {
1717
1726
let mut generate_ctor = layout. size <= RUST_DERIVE_IN_ARRAY_LIMIT ;
1718
1727
1719
1728
let mut unit_visibility = visibility_kind;
1720
- for bf in self . bitfields ( ) {
1729
+ let bfields = self . bitfields ( ) ;
1730
+ for ( idx, bf) in bfields. iter ( ) . enumerate ( ) {
1721
1731
// Codegen not allowed for anonymous bitfields
1722
1732
if bf. name ( ) . is_none ( ) {
1723
1733
continue ;
@@ -1737,6 +1747,7 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit {
1737
1747
accessor_kind,
1738
1748
parent,
1739
1749
parent_item,
1750
+ idx == bfields. len ( ) - 1 ,
1740
1751
result,
1741
1752
struct_layout,
1742
1753
fields,
@@ -1819,6 +1830,7 @@ impl<'a> FieldCodegen<'a> for Bitfield {
1819
1830
_accessor_kind : FieldAccessorKind ,
1820
1831
parent : & CompInfo ,
1821
1832
parent_item : & Item ,
1833
+ _last_field : bool ,
1822
1834
_result : & mut CodegenResult ,
1823
1835
struct_layout : & mut StructLayoutTracker ,
1824
1836
_fields : & mut F ,
@@ -2052,13 +2064,15 @@ impl CodeGenerator for CompInfo {
2052
2064
. annotations ( )
2053
2065
. accessor_kind ( )
2054
2066
. unwrap_or ( FieldAccessorKind :: None ) ;
2055
- for field in self . fields ( ) {
2067
+ let field_decls = self . fields ( ) ;
2068
+ for ( idx, field) in field_decls. iter ( ) . enumerate ( ) {
2056
2069
field. codegen (
2057
2070
ctx,
2058
2071
visibility,
2059
2072
struct_accessor_kind,
2060
2073
self ,
2061
2074
item,
2075
+ idx == field_decls. len ( ) - 1 ,
2062
2076
result,
2063
2077
& mut struct_layout,
2064
2078
& mut fields,
@@ -5213,9 +5227,6 @@ pub(crate) mod utils {
5213
5227
ctx : & BindgenContext ,
5214
5228
result : & mut Vec < proc_macro2:: TokenStream > ,
5215
5229
) {
5216
- if ctx. options ( ) . flexarray_dst {
5217
- return ;
5218
- }
5219
5230
let prefix = ctx. trait_prefix ( ) ;
5220
5231
5221
5232
// If the target supports `const fn`, declare eligible functions
0 commit comments