-
Notifications
You must be signed in to change notification settings - Fork 538
Reorg and update attributes #537
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
<script> | ||
(function() { | ||
var fragments = { | ||
"#cold-attribute": "codegen.html#the-cold-attribute", | ||
"#conditional-compilation": "conditional-compilation.html", | ||
"#deprecation": "diagnostics.html#the-deprecated-attribute", | ||
"#derive": "attributes/derive.html", | ||
"#documentation": "../rustdoc/the-doc-attribute.html", | ||
"#ffi-attributes": "attributes.html#built-in-attributes-index", | ||
"#inline-attribute": "codegen.html#the-inline-attribute", | ||
"#lint-check-attributes": "diagnostics.html#lint-check-attributes", | ||
"#macro-related-attributes": "attributes.html#built-in-attributes-index", | ||
"#miscellaneous-attributes": "attributes.html#built-in-attributes-index", | ||
"#must_use": "diagnostics.html#the-must_use-attribute", | ||
"#optimization-hints": "codegen.html#optimization-hints", | ||
"#path": "items/modules.html#the-path-attribute", | ||
"#preludes": "crates-and-source-files.html#preludes-and-no_std", | ||
"#testing": "testing.html", | ||
"#tool-lint-attributes": "diagnostics.html#tool-lint-attributes", | ||
"#crate-only-attributes": "attributes.html#built-in-attributes-index", | ||
}; | ||
var target = fragments[window.location.hash]; | ||
if (target) { | ||
var url = window.location.toString(); | ||
var base = url.substring(0, url.lastIndexOf('/')); | ||
window.location.replace(base + "/" + target); | ||
} | ||
})(); | ||
</script> |
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
# Code generation attributes | ||
|
||
The following [attributes] are used for controlling code generation. | ||
|
||
## Optimization hints | ||
|
||
The `cold` and `inline` [attributes] give suggestions to generate code in a | ||
way that may be faster than what it would do without the hint. The attributes | ||
are only hints, and may be ignored. | ||
|
||
Both attributes can be used on [functions]. When applied to a function in a | ||
[trait], they apply only to that function when used as a default function for | ||
a trait implementation and not to all trait implementations. The attributes | ||
have no effect on a trait function without a body. | ||
|
||
### The `inline` attribute | ||
|
||
The *`inline` [attribute]* suggests that a copy of the attributed function | ||
should be placed in the caller, rather than generating code to call the | ||
function where it is defined. | ||
|
||
> ***Note***: The `rustc` compiler automatically inlines functions based on | ||
> internal heuristics. Incorrectly inlining functions can make the program | ||
> slower, so this attribute should be used with care. | ||
There are three ways to use the inline attribute: | ||
|
||
* `#[inline]` suggests performing an inline expansion. | ||
* `#[inline(always)]` suggests that an inline expansion should always be | ||
performed. | ||
* `#[inline(never)]` suggests that an inline expansion should never be | ||
performed. | ||
|
||
### The `cold` attribute | ||
|
||
The *`cold` [attribute]* suggests that the attributed function is unlikely to | ||
be called. | ||
|
||
## The `no_builtins` attribute | ||
|
||
The *`no_builtins` [attribute]* may be applied at the crate level to disable | ||
optimizing certain code patterns to invocations of library functions that are | ||
assumed to exist. | ||
|
||
[attribute]: attributes.html | ||
[attributes]: attributes.html | ||
[functions]: items/functions.html | ||
[trait]: items/traits.html |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
# Derive | ||
|
||
The *`derive` attribute* allows new [items] to be automatically generated for | ||
data structures. It uses the [_MetaListPaths_] syntax to specify a list of | ||
traits to implement or paths to [derive macros] to process. | ||
|
||
For example, the following will create an [`impl` item] for the | ||
[`PartialEq`] and [`Clone`] traits for `Foo`, and the type parameter `T` will be | ||
given the `PartialEq` or `Clone` constraints for the appropriate `impl`: | ||
|
||
```rust | ||
#[derive(PartialEq, Clone)] | ||
struct Foo<T> { | ||
a: i32, | ||
b: T, | ||
} | ||
``` | ||
|
||
The generated `impl` for `PartialEq` is equivalent to | ||
|
||
```rust | ||
# struct Foo<T> { a: i32, b: T } | ||
impl<T: PartialEq> PartialEq for Foo<T> { | ||
fn eq(&self, other: &Foo<T>) -> bool { | ||
self.a == other.a && self.b == other.b | ||
} | ||
|
||
fn ne(&self, other: &Foo<T>) -> bool { | ||
self.a != other.a || self.b != other.b | ||
} | ||
} | ||
``` | ||
|
||
You can implement `derive` for your own traits through [procedural macros]. | ||
|
||
[_MetaListPaths_]: attributes.html#meta-item-attribute-syntax | ||
[`Clone`]: ../std/clone/trait.Clone.html | ||
[`PartialEq`]: ../std/cmp/trait.PartialEq.html | ||
[`impl` item]: items/implementations.html | ||
[items]: items.html | ||
[derive macros]: procedural-macros.html#derive-macros | ||
[procedural macros]: procedural-macros.html#derive-macros |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,281 @@ | ||
# Diagnostic attributes | ||
|
||
The following [attributes] are used for controlling or generating diagnostic | ||
messages during compilation. | ||
|
||
## Lint check attributes | ||
|
||
A lint check names a potentially undesirable coding pattern, such as | ||
unreachable code or omitted documentation. The lint attributes `allow`, | ||
`warn`, `deny`, and `forbid` use the [_MetaListPaths_] syntax to specify a | ||
list of lint names to change the lint level for the entity to which the | ||
attribute applies. | ||
|
||
For any lint check `C`: | ||
|
||
* `allow(C)` overrides the check for `C` so that violations will go | ||
unreported, | ||
* `warn(C)` warns about violations of `C` but continues compilation. | ||
* `deny(C)` signals an error after encountering a violation of `C`, | ||
* `forbid(C)` is the same as `deny(C)`, but also forbids changing the lint | ||
level afterwards, | ||
|
||
> Note: The lint checks supported by `rustc` can be found via `rustc -W help`, | ||
> along with their default settings and are documented in the [rustc book]. | ||
```rust | ||
pub mod m1 { | ||
// Missing documentation is ignored here | ||
#[allow(missing_docs)] | ||
pub fn undocumented_one() -> i32 { 1 } | ||
|
||
// Missing documentation signals a warning here | ||
#[warn(missing_docs)] | ||
pub fn undocumented_too() -> i32 { 2 } | ||
|
||
// Missing documentation signals an error here | ||
#[deny(missing_docs)] | ||
pub fn undocumented_end() -> i32 { 3 } | ||
} | ||
``` | ||
|
||
This example shows how one can use `allow` and `warn` to toggle a particular | ||
check on and off: | ||
|
||
```rust | ||
#[warn(missing_docs)] | ||
pub mod m2{ | ||
#[allow(missing_docs)] | ||
pub mod nested { | ||
// Missing documentation is ignored here | ||
pub fn undocumented_one() -> i32 { 1 } | ||
|
||
// Missing documentation signals a warning here, | ||
// despite the allow above. | ||
#[warn(missing_docs)] | ||
pub fn undocumented_two() -> i32 { 2 } | ||
} | ||
|
||
// Missing documentation signals a warning here | ||
pub fn undocumented_too() -> i32 { 3 } | ||
} | ||
``` | ||
|
||
This example shows how one can use `forbid` to disallow uses of `allow` for | ||
that lint check: | ||
|
||
```rust,compile_fail | ||
#[forbid(missing_docs)] | ||
pub mod m3 { | ||
// Attempting to toggle warning signals an error here | ||
#[allow(missing_docs)] | ||
/// Returns 2. | ||
pub fn undocumented_too() -> i32 { 2 } | ||
} | ||
``` | ||
|
||
### Tool lint attributes | ||
|
||
Tool lints allows using scoped lints, to `allow`, `warn`, `deny` or `forbid` | ||
lints of certain tools. | ||
|
||
Currently `clippy` is the only available lint tool. | ||
|
||
Tool lints only get checked when the associated tool is active. If a lint | ||
attribute, such as `allow`, references a nonexistent tool lint, the compiler | ||
will not warn about the nonexistent lint until you use the tool. | ||
|
||
Otherwise, they work just like regular lint attributes: | ||
|
||
```rust | ||
// set the entire `pedantic` clippy lint group to warn | ||
#![warn(clippy::pedantic)] | ||
// silence warnings from the `filter_map` clippy lint | ||
#![allow(clippy::filter_map)] | ||
|
||
fn main() { | ||
// ... | ||
} | ||
|
||
// silence the `cmp_nan` clippy lint just for this function | ||
#[allow(clippy::cmp_nan)] | ||
fn foo() { | ||
// ... | ||
} | ||
``` | ||
|
||
## The `deprecated` attribute | ||
|
||
The *`deprecated` attribute* marks an item as deprecated. `rustc` will issue | ||
warnings on usage of `#[deprecated]` items. `rustdoc` will show item | ||
deprecation, including the `since` version and `note`, if available. | ||
|
||
The `deprecated` attribute has several forms: | ||
|
||
- `deprecated` — Issues a generic message. | ||
- `deprecated = "message"` — Includes the given string in the deprecation | ||
message. | ||
- [_MetaListNameValueStr_] syntax with two optional fields: | ||
- `since` — Specifies a version number when the item was deprecated. `rustc` | ||
does not currently interpret the string, but external tools like [Clippy] | ||
may check the validity of the value. | ||
- `note` — Specifies a string that should be included in the deprecation | ||
message. This is typically used to provide an explanation about the | ||
deprecation and preferred alternatives. | ||
|
||
The `deprecated` attribute may be applied to any [item], [trait item], [enum | ||
variant], [struct field], or [external block item]. It cannot be applied to [trait | ||
implementation items]. When applied to an item containing other items, such as | ||
a [module] or [implementation], all child items inherit the deprecation attribute. | ||
<!-- NOTE: Currently broken for macros, see https://github.com/rust-lang/rust/issues/49912 | ||
Also, it is only rejected for trait impl items (AnnotationKind::Prohibited). In all | ||
other locations, it is silently ignored. Tuple struct fields are ignored. | ||
--> | ||
|
||
Here is an example: | ||
|
||
```rust | ||
#[deprecated(since = "5.2", note = "foo was rarely used. Users should instead use bar")] | ||
pub fn foo() {} | ||
|
||
pub fn bar() {} | ||
``` | ||
|
||
The [RFC][1270-deprecation.md] contains motivations and more details. | ||
|
||
[1270-deprecation.md]: https://github.com/rust-lang/rfcs/blob/master/text/1270-deprecation.md | ||
|
||
## The `must_use` attribute | ||
|
||
The *`must_use` attribute* is used to issue a diagnostic warning when a value | ||
is not "used". It can be applied to user-defined composite types | ||
([`struct`s][struct], [`enum`s][enum], and [`union`s][union]), [functions], | ||
and [traits]. | ||
|
||
The `must_use` attribute may include a message by using the | ||
[_MetaNameValueStr_] syntax such as `#[must_use = "example message"]`. The | ||
message will be given alongside the warning. | ||
|
||
When used on user-defined composite types, if the [expression] of an | ||
[expression statement] has that type, then the `unused_must_use` lint is | ||
violated. | ||
|
||
```rust | ||
#[must_use] | ||
struct MustUse { | ||
// some fields | ||
} | ||
|
||
# impl MustUse { | ||
# fn new() -> MustUse { MustUse {} } | ||
# } | ||
# | ||
// Violates the `unused_must_use` lint. | ||
MustUse::new(); | ||
``` | ||
|
||
When used on a function, if the [expression] of an [expression statement] is a | ||
[call expression] to that function, then the `unused_must_use` lint is | ||
violated. | ||
|
||
```rust | ||
#[must_use] | ||
fn five() -> i32 { 5i32 } | ||
|
||
// Violates the unused_must_use lint. | ||
five(); | ||
``` | ||
|
||
When used on a [trait declaration], a [call expression] of an [expression | ||
statement] to a function that returns an [impl trait] of that trait violates | ||
the `unsued_must_use` lint. | ||
|
||
```rust | ||
#[must_use] | ||
trait Critical {} | ||
impl Critical for i32 {} | ||
|
||
fn get_critical() -> impl Critical { | ||
4i32 | ||
} | ||
|
||
// Violates the `unused_must_use` lint. | ||
get_critical(); | ||
``` | ||
|
||
When used on a function in a trait declaration, then the behavior also applies | ||
when the call expression is a function from an implementation of the trait. | ||
|
||
```rust | ||
trait Trait { | ||
#[must_use] | ||
fn use_me(&self) -> i32; | ||
} | ||
|
||
impl Trait for i32 { | ||
fn use_me(&self) -> i32 { 0i32 } | ||
} | ||
|
||
// Violates the `unused_must_use` lint. | ||
5i32.use_me(); | ||
``` | ||
|
||
When used on a function in a trait implementation, the attribute does nothing. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. (The comment below is not relevant for this PR) @varkor @oli-obk We could reasonably make this do something by having the trait A { fn b() -> usize; }
struct C;
impl A for C {
#[must_use]
fn b() -> usize { 0 }
}
fn main() {
C::b();
// ^--- We know statically that `C::b` references the function
// on `impl A for C { ... }` and so we may trigger the lint...?
} |
||
|
||
> Note: Trivial no-op expressions containing the value will not violate the | ||
> lint. Examples include wrapping the value in a type that does not implement | ||
> [`Drop`] and then not using that type and being the final expression of a | ||
> [block expression] that is not used. | ||
> | ||
> ```rust | ||
> #[must_use] | ||
> fn five() -> i32 { 5i32 } | ||
> | ||
> // None of these violate the unused_must_use lint. | ||
> (five(),); | ||
> Some(five()); | ||
> { five() }; | ||
> if true { five() } else { 0i32 }; | ||
> match true { | ||
> _ => five() | ||
> }; | ||
> ``` | ||
> Note: It is idiomatic to use a [let statement] with a pattern of `_` | ||
> when a must-used value is purposely discarded. | ||
> | ||
> ```rust | ||
> #[must_use] | ||
> fn five() -> i32 { 5i32 } | ||
> | ||
> // Does not violate the unused_must_use lint. | ||
> let _ = five(); | ||
> ``` | ||
[Clippy]: https://github.com/rust-lang/rust-clippy | ||
[_MetaListNameValueStr_]: attributes.html#meta-item-attribute-syntax | ||
[_MetaListPaths_]: attributes.html#meta-item-attribute-syntax | ||
[_MetaNameValueStr_]: attributes.html#meta-item-attribute-syntax | ||
[`Drop`]: special-types-and-traits.html#drop | ||
[attributes]: attributes.html | ||
[block expression]: expressions/block-expr.html | ||
[call expression]: expressions/call-expr.html | ||
[enum variant]: items/enumerations.html | ||
[enum]: items/enumerations.html | ||
[expression statement]: statements.html#expression-statements | ||
[expression]: expressions.html | ||
[external block item]: items/external-blocks.html | ||
[functions]: items/functions.html | ||
[impl trait]: types/impl-trait.html | ||
[implementation]: items/implementations.html | ||
[item]: items.html | ||
[let statement]: statements.html#let-statements | ||
[module]: items/modules.html | ||
[rustc book]: ../rustc/lints/index.html | ||
[struct field]: items/structs.html | ||
[struct]: items/structs.html | ||
[trait declaration]: items/traits.html | ||
[trait implementation items]: items/implementations.html#trait-implementations | ||
[trait item]: items/traits.html | ||
[traits]: items/traits.html | ||
[union]: items/unions.html |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
# Limits | ||
Centril marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
The following [attributes] affect compile-time limits. | ||
|
||
## The `recursion_limit` attribute | ||
|
||
The *`recursion_limit` attribute* may be applied at the crate level to set the | ||
maximum depth for potentially infinitely-recursive compile-time operations | ||
like auto-dereference or macro expansion. It uses the [_MetaNameValueStr_] | ||
syntax to specify the recursion depth. The default is | ||
`#![recursion_limit="64"]`. | ||
|
||
[attributes]: attributes.html | ||
[_MetaNameValueStr_]: attributes.html#meta-item-attribute-syntax |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
# Testing attributes | ||
|
||
The following [attributes] are used for specifying functions for performing | ||
tests. Compiling a crate in "test" mode enables building the test functions | ||
along with a test harness for executing the tests. Enabling the test mode also | ||
enables the [`test` conditional compilation option]. | ||
|
||
## The `test` attribute | ||
|
||
The *`test` attribute* marks a function to be executed as a test. These | ||
functions are only compiled when in test mode. Test functions must be free, | ||
monomorphic functions that take no arguments, and the return type must be one | ||
of the following: | ||
|
||
* `()` | ||
* `Result<(), E> where E: Error` | ||
<!-- * `!` --> | ||
<!-- * Result<!, E> where E: Error` --> | ||
|
||
> Note: The implementation of which return types are allowed is determined by | ||
> the unstable [`Termination`] trait. | ||
<!-- If the previous section needs updating (from "must take no arguments" | ||
onwards, also update it in the crates-and-source-files.md file --> | ||
|
||
> Note: The test mode is enabled by passing the `--test` argument to `rustc` | ||
> or using `cargo test`. | ||
Tests that return `()` pass as long as they terminate and do not panic. Tests | ||
that return a `Result<(), E>` pass as long as they return `Ok(())`. Tests that | ||
do not terminate neither pass nor fail. | ||
|
||
```rust | ||
# use std::io; | ||
# fn setup_the_thing() -> io::Result<i32> { Ok(1) } | ||
# fn do_the_thing(s: &i32) -> io::Result<()> { Ok(()) } | ||
#[test] | ||
fn test_the_thing() -> io::Result<()> { | ||
let state = setup_the_thing()?; // expected to succeed | ||
do_the_thing(&state)?; // expected to succeed | ||
Ok(()) | ||
} | ||
``` | ||
|
||
## The `ignore` attribute | ||
|
||
A function annotated with the `test` attribute can also be annotated with the | ||
`ignore` attribute. The *`ignore` attribute* tells the test harness to not | ||
execute that function as a test. It will still be compiled when in test mode. | ||
|
||
The `ignore` attribute may optionally be written with the [_MetaNameValueStr_] | ||
syntax to specify a reason why the test is ignored. | ||
|
||
```rust | ||
#[test] | ||
#[ignore = "not yet implemented"] | ||
fn mytest() { | ||
// … | ||
} | ||
``` | ||
|
||
> **Note**: The `rustc` test harness supports the `--include-ignored` flag to | ||
> force ignored tests to be run. | ||
## The `should_panic` attribute | ||
|
||
A function annotated with the `test` attribute that returns `()` can also be | ||
annotated with the `should_panic` attribute. The *`should_panic` attribute* | ||
makes the test only pass if it actually panics. | ||
|
||
The `should_panic` attribute may optionally take an input string that must | ||
appear within the panic message. If the string is not found in the message, | ||
then the test will fail. The string may be passed using the | ||
[_MetaNameValueStr_] syntax or the [_MetaListNameValueStr_] syntax with an | ||
`expected` field. | ||
|
||
```rust | ||
#[test] | ||
#[should_panic(expected = "values don't match")] | ||
fn mytest() { | ||
assert_eq!(1, 2, "values don't match"); | ||
} | ||
``` | ||
|
||
[_MetaListNameValueStr_]: attributes.html#meta-item-attribute-syntax | ||
[_MetaNameValueStr_]: attributes.html#meta-item-attribute-syntax | ||
[`Termination`]: ../std/process/trait.Termination.html | ||
[`test` conditional compilation option]: conditional-compilation.html#test | ||
[attributes]: attributes.html | ||
[trait or lifetime bounds]: trait-bounds.html | ||
[where clauses]: items/generics.html#where-clauses |
This file was deleted.
Uh oh!
There was an error while loading. Please reload this page.