Unknown attribute errors

C++ and Rust allow the use of attributes to customize the behavior and semantics of a piece of syntax. For example, the C++ [[nodiscard]] and Rust #[must_use] attributes cause a compilation error if a return value is discarded.

If Crubit encounters an attribute it is not aware of, it will fail to generate bindings for the item that the attribute affects. This is both for reasons of correctness, as well as forward-compatibility between Crubit releases.

Correctness

While many attributes, like [[nodiscard]], can be safely ignored, others cannot be. For example, Crubit must correctly understand the [[no_unique_address]]attribute to produce bindings, as it can alter the layout of the type containing it. In Rust, Crubit must understand the #[repr(...)] attribute, which changes type layout.

Simply ignoring these attributes would result in code which failed to compile, or worse, which had undefined behavior at runtime.

Because Crubit does not know whether an attribute is like this in advance, it conservatively must assume that an unknown attribute might impact correctness, and will not generate bindings.

Compatibility

Other attributes present a compatibility hazard. Take [[nodiscard]] and #[must_use]. The bindings of a C++ [[nodiscard]] type or function should be a Rust #[must_use] type or function, and vice versa.

If Crubit simply ignored attributes that are relevant for API surface but not correctness, it would be a backwards-incompatible change to later stop ignoring them.

Fix

Crubit conservatively rejects items with unknown attributes. This can be resolved in one of three ways:

  1. Remove the attribute from the declaration.

  2. File a crubit.rs-bug to add the attribute to Crubit.

  3. If the attribute does not impact the bindings (either their safety or the resulting API shape), add a CRUBIT_UNSAFE_IGNORE_ATTR(...) attribute containing the name of the unknown attribute.

    See support/annotations.h

    WARNING: CRUBIT_UNSAFE_IGNORE_ATTR can cause undefined behavior, or compilation failure, and can make code incompatible with future versions of Crubit. Only use this when the attribute has no impact on interface or semantics.