diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2022-06-05 19:37:24 +0200 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2022-06-05 19:38:05 +0200 |
commit | aa103a6d9059c013e5cea959041a48cbdd9d3131 (patch) | |
tree | d9dcda2e5d364f98a4d467e35c5377c7dc329a75 | |
parent | 3a8a60cd4c88fd6e753a2f215796a5117b7bfaa8 (diff) |
ir: Centralize must_use checks and simplify codegen.
-rw-r--r-- | src/codegen/mod.rs | 26 | ||||
-rw-r--r-- | src/ir/context.rs | 3 | ||||
-rw-r--r-- | src/ir/item.rs | 5 | ||||
-rw-r--r-- | tests/expectations/tests/func_return_must_use.rs | 2 |
4 files changed, 13 insertions, 23 deletions
diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index fdc9b5ed..4dd52036 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -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()); } @@ -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()); } @@ -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 { diff --git a/src/ir/context.rs b/src/ir/context.rs index 2f71debd..9cf43ec3 100644 --- a/src/ir/context.rs +++ b/src/ir/context.rs @@ -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), diff --git a/src/ir/item.rs b/src/ir/item.rs index aed575ca..6ce42017 100644 --- a/src/ir/item.rs +++ b/src/ir/item.rs @@ -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 diff --git a/tests/expectations/tests/func_return_must_use.rs b/tests/expectations/tests/func_return_must_use.rs index 9f40aaa6..6ea6c704 100644 --- a/tests/expectations/tests/func_return_must_use.rs +++ b/tests/expectations/tests/func_return_must_use.rs @@ -17,6 +17,7 @@ pub struct MustUseStruct { _unused: [u8; 0], } extern "C" { + #[must_use] pub fn return_struct() -> MustUseStruct; } /// <div rustbindgen mustusetype></div> @@ -47,6 +48,7 @@ fn bindgen_test_layout_AnnotatedStruct() { ); } extern "C" { + #[must_use] pub fn return_annotated_struct() -> AnnotatedStruct; } #[repr(C)] |