Skip to content

Commit 9f2a6f6

Browse files
jsgfemilio
authored andcommitted
Only generate flex array member for last field
There are some tests which have two incomplete array fields; only the very last one is valid as a flexible array member (in C) or can be a DST field in Rust.
1 parent 8d6f69c commit 9f2a6f6

File tree

1 file changed

+25
-14
lines changed

1 file changed

+25
-14
lines changed

bindgen/codegen/mod.rs

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,6 +1333,7 @@ trait FieldCodegen<'a> {
13331333
accessor_kind: FieldAccessorKind,
13341334
parent: &CompInfo,
13351335
parent_item: &Item,
1336+
last_field: bool,
13361337
result: &mut CodegenResult,
13371338
struct_layout: &mut StructLayoutTracker,
13381339
fields: &mut F,
@@ -1353,6 +1354,7 @@ impl<'a> FieldCodegen<'a> for Field {
13531354
accessor_kind: FieldAccessorKind,
13541355
parent: &CompInfo,
13551356
parent_item: &Item,
1357+
last_field: bool,
13561358
result: &mut CodegenResult,
13571359
struct_layout: &mut StructLayoutTracker,
13581360
fields: &mut F,
@@ -1370,6 +1372,7 @@ impl<'a> FieldCodegen<'a> for Field {
13701372
accessor_kind,
13711373
parent,
13721374
parent_item,
1375+
last_field,
13731376
result,
13741377
struct_layout,
13751378
fields,
@@ -1384,6 +1387,7 @@ impl<'a> FieldCodegen<'a> for Field {
13841387
accessor_kind,
13851388
parent,
13861389
parent_item,
1390+
last_field,
13871391
result,
13881392
struct_layout,
13891393
fields,
@@ -1428,6 +1432,7 @@ impl<'a> FieldCodegen<'a> for FieldData {
14281432
accessor_kind: FieldAccessorKind,
14291433
parent: &CompInfo,
14301434
parent_item: &Item,
1435+
last_field: bool,
14311436
result: &mut CodegenResult,
14321437
struct_layout: &mut StructLayoutTracker,
14331438
fields: &mut F,
@@ -1453,17 +1458,20 @@ impl<'a> FieldCodegen<'a> for FieldData {
14531458
let ty = if parent.is_union() {
14541459
wrap_union_field_if_needed(ctx, struct_layout, ty, result)
14551460
} 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();
14621464
syn::parse_quote! { FAM }
1463-
} else if ctx.options().enable_cxx_namespaces {
1464-
syn::parse_quote! { root::__IncompleteArrayField<#inner> }
14651465
} 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+
}
14671475
}
14681476
} else {
14691477
ty
@@ -1685,6 +1693,7 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit {
16851693
accessor_kind: FieldAccessorKind,
16861694
parent: &CompInfo,
16871695
parent_item: &Item,
1696+
_last_field: bool,
16881697
result: &mut CodegenResult,
16891698
struct_layout: &mut StructLayoutTracker,
16901699
fields: &mut F,
@@ -1745,7 +1754,8 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit {
17451754
let mut generate_ctor = layout.size <= RUST_DERIVE_IN_ARRAY_LIMIT;
17461755

17471756
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() {
17491759
// Codegen not allowed for anonymous bitfields
17501760
if bf.name().is_none() {
17511761
continue;
@@ -1765,6 +1775,7 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit {
17651775
accessor_kind,
17661776
parent,
17671777
parent_item,
1778+
idx == bfields.len() - 1,
17681779
result,
17691780
struct_layout,
17701781
fields,
@@ -1847,6 +1858,7 @@ impl<'a> FieldCodegen<'a> for Bitfield {
18471858
_accessor_kind: FieldAccessorKind,
18481859
parent: &CompInfo,
18491860
parent_item: &Item,
1861+
_last_field: bool,
18501862
_result: &mut CodegenResult,
18511863
struct_layout: &mut StructLayoutTracker,
18521864
_fields: &mut F,
@@ -2080,13 +2092,15 @@ impl CodeGenerator for CompInfo {
20802092
.annotations()
20812093
.accessor_kind()
20822094
.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() {
20842097
field.codegen(
20852098
ctx,
20862099
visibility,
20872100
struct_accessor_kind,
20882101
self,
20892102
item,
2103+
idx == field_decls.len() - 1,
20902104
result,
20912105
&mut struct_layout,
20922106
&mut fields,
@@ -5268,9 +5282,6 @@ pub(crate) mod utils {
52685282
ctx: &BindgenContext,
52695283
result: &mut Vec<proc_macro2::TokenStream>,
52705284
) {
5271-
if ctx.options().flexarray_dst {
5272-
return;
5273-
}
52745285
let prefix = ctx.trait_prefix();
52755286

52765287
// If the target supports `const fn`, declare eligible functions

0 commit comments

Comments
 (0)