Skip to content

Commit

Permalink
ir: Centralize must_use checks and simplify codegen.
Browse files Browse the repository at this point in the history
  • Loading branch information
emilio authored and Aatif Syed committed Sep 22, 2022
1 parent 9191306 commit 5fbbd26
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 23 deletions.
26 changes: 5 additions & 21 deletions src/codegen/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2082,8 +2082,7 @@ impl CodeGenerator for CompInfo {
attributes.push(attributes::derives(&derives))
}

if item.annotations().must_use_type() || ctx.must_use_type_by_name(item)
{
if item.must_use(ctx) {
attributes.push(attributes::must_use());
}

Expand Down Expand Up @@ -3054,8 +3053,7 @@ impl CodeGenerator for Enum {
attrs.push(attributes::doc(comment));
}

if item.annotations().must_use_type() || ctx.must_use_type_by_name(item)
{
if item.must_use(ctx) {
attrs.push(attributes::must_use());
}

Expand Down Expand Up @@ -3967,26 +3965,12 @@ impl CodeGenerator for Function {

if ctx.options().rust_features().must_use_function {
let must_use = signature.must_use() || {
let ret_ty = signature.return_type();

let resolved_ret = ret_ty
let ret_ty = signature
.return_type()
.into_resolver()
.through_type_refs()
.through_type_aliases()
.resolve(ctx);

let must_use_resolved_ty =
resolved_ret.annotations().must_use_type() ||
ctx.must_use_type_by_name(resolved_ret);

let ret = ctx.resolve_item(ret_ty);
let must_use_ty = ret.annotations().must_use_type() ||
ctx.must_use_type_by_name(ret);

// If the return type already has #[must_use], the function does not
// need the annotation. This preserves the codegen behavior before
// type aliases with #[must_use] were supported.
!must_use_resolved_ty && must_use_ty
ret_ty.must_use(ctx)
};

if must_use {
Expand Down
3 changes: 1 addition & 2 deletions src/ir/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1921,8 +1921,7 @@ If you encounter an error missing from this list, please file an issue or a PR!"
let item = Item::new(
with_id,
None,
self.resolve_item_fallible(wrapped_id)
.map(|item| item.annotations().clone()),
None,
parent_id.unwrap_or_else(|| self.current_module.into()),
ItemKind::Type(ty),
Some(location),
Expand Down
5 changes: 5 additions & 0 deletions src/ir/item.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1096,6 +1096,11 @@ impl Item {
_ => return None,
})
}

/// Whether this is a #[must_use] type.
pub fn must_use(&self, ctx: &BindgenContext) -> bool {
self.annotations().must_use_type() || ctx.must_use_type_by_name(self)
}
}

impl<T> IsOpaque for T
Expand Down
2 changes: 2 additions & 0 deletions tests/expectations/tests/func_return_must_use.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ pub struct MustUseStruct {
_unused: [u8; 0],
}
extern "C" {
#[must_use]
pub fn return_struct() -> MustUseStruct;
}
/// <div rustbindgen mustusetype></div>
Expand Down Expand Up @@ -47,6 +48,7 @@ fn bindgen_test_layout_AnnotatedStruct() {
);
}
extern "C" {
#[must_use]
pub fn return_annotated_struct() -> AnnotatedStruct;
}
#[repr(C)]
Expand Down

0 comments on commit 5fbbd26

Please sign in to comment.