@@ -1333,6 +1333,7 @@ trait FieldCodegen<'a> {
1333
1333
accessor_kind : FieldAccessorKind ,
1334
1334
parent : & CompInfo ,
1335
1335
parent_item : & Item ,
1336
+ last_field : bool ,
1336
1337
result : & mut CodegenResult ,
1337
1338
struct_layout : & mut StructLayoutTracker ,
1338
1339
fields : & mut F ,
@@ -1353,6 +1354,7 @@ impl<'a> FieldCodegen<'a> for Field {
1353
1354
accessor_kind : FieldAccessorKind ,
1354
1355
parent : & CompInfo ,
1355
1356
parent_item : & Item ,
1357
+ last_field : bool ,
1356
1358
result : & mut CodegenResult ,
1357
1359
struct_layout : & mut StructLayoutTracker ,
1358
1360
fields : & mut F ,
@@ -1370,6 +1372,7 @@ impl<'a> FieldCodegen<'a> for Field {
1370
1372
accessor_kind,
1371
1373
parent,
1372
1374
parent_item,
1375
+ last_field,
1373
1376
result,
1374
1377
struct_layout,
1375
1378
fields,
@@ -1384,6 +1387,7 @@ impl<'a> FieldCodegen<'a> for Field {
1384
1387
accessor_kind,
1385
1388
parent,
1386
1389
parent_item,
1390
+ last_field,
1387
1391
result,
1388
1392
struct_layout,
1389
1393
fields,
@@ -1428,6 +1432,7 @@ impl<'a> FieldCodegen<'a> for FieldData {
1428
1432
accessor_kind : FieldAccessorKind ,
1429
1433
parent : & CompInfo ,
1430
1434
parent_item : & Item ,
1435
+ last_field : bool ,
1431
1436
result : & mut CodegenResult ,
1432
1437
struct_layout : & mut StructLayoutTracker ,
1433
1438
fields : & mut F ,
@@ -1453,17 +1458,20 @@ impl<'a> FieldCodegen<'a> for FieldData {
1453
1458
let ty = if parent. is_union ( ) {
1454
1459
wrap_union_field_if_needed ( ctx, struct_layout, ty, result)
1455
1460
} else if let Some ( item) = field_ty. is_incomplete_array ( ctx) {
1456
- result. saw_incomplete_array ( ) ;
1457
- struct_layout. saw_flexible_array ( ) ;
1458
-
1459
- let inner = item. to_rust_ty_or_opaque ( ctx, & ( ) ) ;
1460
-
1461
- if ctx. options ( ) . flexarray_dst {
1461
+ // Only FAM if its the last field
1462
+ if ctx. options ( ) . flexarray_dst && last_field {
1463
+ struct_layout. saw_flexible_array ( ) ;
1462
1464
syn:: parse_quote! { FAM }
1463
- } else if ctx. options ( ) . enable_cxx_namespaces {
1464
- syn:: parse_quote! { root:: __IncompleteArrayField<#inner> }
1465
1465
} else {
1466
- syn:: parse_quote! { __IncompleteArrayField<#inner> }
1466
+ result. saw_incomplete_array ( ) ;
1467
+
1468
+ let inner = item. to_rust_ty_or_opaque ( ctx, & ( ) ) ;
1469
+
1470
+ if ctx. options ( ) . enable_cxx_namespaces {
1471
+ syn:: parse_quote! { root:: __IncompleteArrayField<#inner> }
1472
+ } else {
1473
+ syn:: parse_quote! { __IncompleteArrayField<#inner> }
1474
+ }
1467
1475
}
1468
1476
} else {
1469
1477
ty
@@ -1685,6 +1693,7 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit {
1685
1693
accessor_kind : FieldAccessorKind ,
1686
1694
parent : & CompInfo ,
1687
1695
parent_item : & Item ,
1696
+ _last_field : bool ,
1688
1697
result : & mut CodegenResult ,
1689
1698
struct_layout : & mut StructLayoutTracker ,
1690
1699
fields : & mut F ,
@@ -1745,7 +1754,8 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit {
1745
1754
let mut generate_ctor = layout. size <= RUST_DERIVE_IN_ARRAY_LIMIT ;
1746
1755
1747
1756
let mut unit_visibility = visibility_kind;
1748
- for bf in self . bitfields ( ) {
1757
+ let bfields = self . bitfields ( ) ;
1758
+ for ( idx, bf) in bfields. iter ( ) . enumerate ( ) {
1749
1759
// Codegen not allowed for anonymous bitfields
1750
1760
if bf. name ( ) . is_none ( ) {
1751
1761
continue ;
@@ -1765,6 +1775,7 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit {
1765
1775
accessor_kind,
1766
1776
parent,
1767
1777
parent_item,
1778
+ idx == bfields. len ( ) - 1 ,
1768
1779
result,
1769
1780
struct_layout,
1770
1781
fields,
@@ -1847,6 +1858,7 @@ impl<'a> FieldCodegen<'a> for Bitfield {
1847
1858
_accessor_kind : FieldAccessorKind ,
1848
1859
parent : & CompInfo ,
1849
1860
parent_item : & Item ,
1861
+ _last_field : bool ,
1850
1862
_result : & mut CodegenResult ,
1851
1863
struct_layout : & mut StructLayoutTracker ,
1852
1864
_fields : & mut F ,
@@ -2080,13 +2092,15 @@ impl CodeGenerator for CompInfo {
2080
2092
. annotations ( )
2081
2093
. accessor_kind ( )
2082
2094
. unwrap_or ( FieldAccessorKind :: None ) ;
2083
- for field in self . fields ( ) {
2095
+ let field_decls = self . fields ( ) ;
2096
+ for ( idx, field) in field_decls. iter ( ) . enumerate ( ) {
2084
2097
field. codegen (
2085
2098
ctx,
2086
2099
visibility,
2087
2100
struct_accessor_kind,
2088
2101
self ,
2089
2102
item,
2103
+ idx == field_decls. len ( ) - 1 ,
2090
2104
result,
2091
2105
& mut struct_layout,
2092
2106
& mut fields,
@@ -5268,9 +5282,6 @@ pub(crate) mod utils {
5268
5282
ctx : & BindgenContext ,
5269
5283
result : & mut Vec < proc_macro2:: TokenStream > ,
5270
5284
) {
5271
- if ctx. options ( ) . flexarray_dst {
5272
- return ;
5273
- }
5274
5285
let prefix = ctx. trait_prefix ( ) ;
5275
5286
5276
5287
// If the target supports `const fn`, declare eligible functions
0 commit comments