Skip to content

Commit 15d1dfa

Browse files
committed
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 4bf0982 commit 15d1dfa

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
@@ -1305,6 +1305,7 @@ trait FieldCodegen<'a> {
13051305
accessor_kind: FieldAccessorKind,
13061306
parent: &CompInfo,
13071307
parent_item: &Item,
1308+
last_field: bool,
13081309
result: &mut CodegenResult,
13091310
struct_layout: &mut StructLayoutTracker,
13101311
fields: &mut F,
@@ -1325,6 +1326,7 @@ impl<'a> FieldCodegen<'a> for Field {
13251326
accessor_kind: FieldAccessorKind,
13261327
parent: &CompInfo,
13271328
parent_item: &Item,
1329+
last_field: bool,
13281330
result: &mut CodegenResult,
13291331
struct_layout: &mut StructLayoutTracker,
13301332
fields: &mut F,
@@ -1342,6 +1344,7 @@ impl<'a> FieldCodegen<'a> for Field {
13421344
accessor_kind,
13431345
parent,
13441346
parent_item,
1347+
last_field,
13451348
result,
13461349
struct_layout,
13471350
fields,
@@ -1356,6 +1359,7 @@ impl<'a> FieldCodegen<'a> for Field {
13561359
accessor_kind,
13571360
parent,
13581361
parent_item,
1362+
last_field,
13591363
result,
13601364
struct_layout,
13611365
fields,
@@ -1400,6 +1404,7 @@ impl<'a> FieldCodegen<'a> for FieldData {
14001404
accessor_kind: FieldAccessorKind,
14011405
parent: &CompInfo,
14021406
parent_item: &Item,
1407+
last_field: bool,
14031408
result: &mut CodegenResult,
14041409
struct_layout: &mut StructLayoutTracker,
14051410
fields: &mut F,
@@ -1425,17 +1430,20 @@ impl<'a> FieldCodegen<'a> for FieldData {
14251430
let ty = if parent.is_union() {
14261431
wrap_union_field_if_needed(ctx, struct_layout, ty, result)
14271432
} 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();
14341436
syn::parse_quote! { FAM }
1435-
} else if ctx.options().enable_cxx_namespaces {
1436-
syn::parse_quote! { root::__IncompleteArrayField<#inner> }
14371437
} 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+
}
14391447
}
14401448
} else {
14411449
ty
@@ -1657,6 +1665,7 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit {
16571665
accessor_kind: FieldAccessorKind,
16581666
parent: &CompInfo,
16591667
parent_item: &Item,
1668+
_last_field: bool,
16601669
result: &mut CodegenResult,
16611670
struct_layout: &mut StructLayoutTracker,
16621671
fields: &mut F,
@@ -1717,7 +1726,8 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit {
17171726
let mut generate_ctor = layout.size <= RUST_DERIVE_IN_ARRAY_LIMIT;
17181727

17191728
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() {
17211731
// Codegen not allowed for anonymous bitfields
17221732
if bf.name().is_none() {
17231733
continue;
@@ -1737,6 +1747,7 @@ impl<'a> FieldCodegen<'a> for BitfieldUnit {
17371747
accessor_kind,
17381748
parent,
17391749
parent_item,
1750+
idx == bfields.len() - 1,
17401751
result,
17411752
struct_layout,
17421753
fields,
@@ -1819,6 +1830,7 @@ impl<'a> FieldCodegen<'a> for Bitfield {
18191830
_accessor_kind: FieldAccessorKind,
18201831
parent: &CompInfo,
18211832
parent_item: &Item,
1833+
_last_field: bool,
18221834
_result: &mut CodegenResult,
18231835
struct_layout: &mut StructLayoutTracker,
18241836
_fields: &mut F,
@@ -2052,13 +2064,15 @@ impl CodeGenerator for CompInfo {
20522064
.annotations()
20532065
.accessor_kind()
20542066
.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() {
20562069
field.codegen(
20572070
ctx,
20582071
visibility,
20592072
struct_accessor_kind,
20602073
self,
20612074
item,
2075+
idx == field_decls.len() - 1,
20622076
result,
20632077
&mut struct_layout,
20642078
&mut fields,
@@ -5213,9 +5227,6 @@ pub(crate) mod utils {
52135227
ctx: &BindgenContext,
52145228
result: &mut Vec<proc_macro2::TokenStream>,
52155229
) {
5216-
if ctx.options().flexarray_dst {
5217-
return;
5218-
}
52195230
let prefix = ctx.trait_prefix();
52205231

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

0 commit comments

Comments
 (0)