-
-
Notifications
You must be signed in to change notification settings - Fork 15k
Move attribute and keyword docs from std to core
#158327
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
base: main
Are you sure you want to change the base?
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 |
|---|---|---|
|
|
@@ -195,7 +195,7 @@ mod break_keyword {} | |
| /// to be most things that would be reasonable to have in a constant (barring `const fn`s). For | ||
| /// example, you can't have a [`File`] as a `const`. | ||
| /// | ||
| /// [`File`]: crate::fs::File | ||
| /// [`File`]: ../std/fs/struct.File.html | ||
| /// | ||
| /// The only lifetime allowed in a constant is `'static`, which is the lifetime that encompasses | ||
| /// all others in a Rust program. For example, if you wanted to define a constant string, it would | ||
|
|
@@ -484,7 +484,7 @@ mod extern_keyword {} | |
|
|
||
| #[doc(keyword = "false")] | ||
| // | ||
| /// A value of type [`bool`] representing logical **false**. | ||
| /// A value of type [`prim@bool`] representing logical **false**. | ||
| /// | ||
| /// `false` is the logical opposite of [`true`]. | ||
| /// | ||
|
|
@@ -1235,31 +1235,18 @@ mod ref_keyword {} | |
| /// `return` returns from the function immediately (an "early return"): | ||
| /// | ||
| /// ```no_run | ||
| /// use std::fs::File; | ||
| /// use std::io::{Error, ErrorKind, Read, Result}; | ||
| /// fn main() -> Result<(), &'static str> { | ||
| /// let contents = "Hello, world!"; | ||
| /// | ||
| /// fn main() -> Result<()> { | ||
| /// let mut file = match File::open("foo.txt") { | ||
| /// Ok(f) => f, | ||
| /// Err(e) => return Err(e), | ||
| /// }; | ||
| /// | ||
| /// let mut contents = String::new(); | ||
| /// let size = match file.read_to_string(&mut contents) { | ||
| /// Ok(s) => s, | ||
| /// Err(e) => return Err(e), | ||
| /// }; | ||
| /// if contents.contains("impossible!") { | ||
| /// return Err("oh no!"); | ||
| /// } | ||
| /// | ||
| /// if contents.contains("impossible!") { | ||
| /// return Err(Error::new(ErrorKind::Other, "oh no!")); | ||
| /// } | ||
| /// if contents.len() > 9000 { | ||
| /// return Err("over 9000!"); | ||
| /// } | ||
| /// | ||
| /// if size > 9000 { | ||
| /// return Err(Error::new(ErrorKind::Other, "over 9000!")); | ||
| /// } | ||
| /// | ||
| /// assert_eq!(contents, "Hello, world!"); | ||
| /// Ok(()) | ||
| /// Ok(()) | ||
| /// } | ||
| /// ``` | ||
| /// | ||
|
|
@@ -1306,7 +1293,7 @@ mod return_keyword {} | |
| /// manner to computed goto). | ||
| /// | ||
| /// Example of using `become` to implement functional-style `fold`: | ||
| /// ``` | ||
| /// ```ignore (explicit_tail_calls not supported on wasm targets) | ||
| /// #![feature(explicit_tail_calls)] | ||
| /// #![expect(incomplete_features)] | ||
| /// | ||
|
|
@@ -1360,7 +1347,7 @@ mod return_keyword {} | |
| /// (unless it's coerced to a function pointer) | ||
| /// | ||
| /// It is possible to tail-call a function pointer: | ||
| /// ``` | ||
| /// ```ignore (explicit_tail_calls not supported on wasm targets) | ||
| /// #![feature(explicit_tail_calls)] | ||
| /// #![expect(incomplete_features)] | ||
| /// | ||
|
|
@@ -1631,8 +1618,8 @@ mod self_upper_keyword {} | |
| /// [`extern`]: keyword.extern.html | ||
| /// [`mut`]: keyword.mut.html | ||
| /// [`unsafe`]: keyword.unsafe.html | ||
| /// [`Mutex`]: sync::Mutex | ||
| /// [`OnceLock`]: sync::OnceLock | ||
| /// [`Mutex`]: ../std/sync/struct.Mutex.html | ||
| /// [`OnceLock`]: ../std/sync/struct.OnceLock.html | ||
| /// [`RefCell`]: cell::RefCell | ||
| /// [atomic]: sync::atomic | ||
| /// [Reference]: ../reference/items/static-items.html | ||
|
|
@@ -1959,7 +1946,7 @@ mod trait_keyword {} | |
|
|
||
| #[doc(keyword = "true")] | ||
| // | ||
| /// A value of type [`bool`] representing logical **true**. | ||
| /// A value of type [`prim@bool`] representing logical **true**. | ||
| /// | ||
| /// Logically `true` is not equal to [`false`]. | ||
| /// | ||
|
|
@@ -2146,22 +2133,30 @@ mod type_keyword {} | |
| /// Since `unsafe fn` and `unsafe trait` indicate that there is a safety | ||
| /// contract that the compiler cannot enforce, documenting it is important. The | ||
| /// standard library has many examples of this, like the following which is an | ||
| /// extract from [`Vec::set_len`]. The `# Safety` section explains the contract | ||
| /// extract from [`ptr::replace`]. The `# Safety` section explains the contract | ||
|
Member
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. I'd prefer to stick to the original example here --
Author
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. I agree and the goal with changing it was to make the example reference an I spoke with @GuillaumeGomez about this AlPR. With the move to I'll try and find a simpler method in
Member
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. I don't think we should artificially limit our discussion of things like the Arguably these docs really should be in the Reference, and then obviously they could use examples from |
||
| /// that must be fulfilled to safely call the function. | ||
| /// | ||
| /// ```rust,ignore (stub-to-show-doc-example) | ||
| /// /// Forces the length of the vector to `new_len`. | ||
| /// /// Moves `src` into the pointed `dst`, returning the previous `dst` value. | ||
| /// /// | ||
| /// /// Neither value is dropped. | ||
| /// /// | ||
| /// /// This is a low-level operation that maintains none of the normal | ||
| /// /// invariants of the type. Normally changing the length of a vector | ||
| /// /// is done using one of the safe operations instead, such as | ||
| /// /// `truncate`, `resize`, `extend`, or `clear`. | ||
| /// /// This function is semantically equivalent to [`mem::replace`] except that it | ||
| /// /// operates on raw pointers instead of references. When references are | ||
| /// /// available, [`mem::replace`] should be preferred. | ||
| /// /// | ||
| /// /// # Safety | ||
| /// /// | ||
| /// /// - `new_len` must be less than or equal to `capacity()`. | ||
| /// /// - The elements at `old_len..new_len` must be initialized. | ||
| /// pub unsafe fn set_len(&mut self, new_len: usize) | ||
| /// /// Behavior is undefined if any of the following conditions are violated: | ||
| /// /// | ||
| /// /// * `dst` must be [valid] for both reads and writes or `T` must be a ZST. | ||
| /// /// | ||
| /// /// * `dst` must be properly aligned. | ||
| /// /// | ||
| /// /// * `dst` must point to a properly initialized value of type `T`. | ||
| /// /// | ||
| /// /// Note that even if `T` has size `0`, the pointer must be properly aligned. | ||
| /// pub const unsafe fn replace<T>(dst: *mut T, src: T) -> T | ||
| /// ``` | ||
| /// | ||
| /// ## Using `unsafe {}` blocks and `impl`s | ||
|
|
@@ -2502,7 +2497,7 @@ mod use_keyword {} | |
| /// ``` | ||
| /// | ||
| /// `where` is available anywhere generic and lifetime parameters are available, | ||
| /// as can be seen with the [`Cow`](crate::borrow::Cow) type from the standard | ||
| /// as can be seen with the [`Cow`](../std/borrow/enum.Cow.html) type from the standard | ||
| /// library: | ||
| /// | ||
| /// ```rust | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -778,20 +778,20 @@ pub mod from { | |
| pub use core::from::From; | ||
| } | ||
|
|
||
| // Include a number of private modules that exist solely to provide | ||
| // the rustdoc documentation for primitive types. Using `include!` | ||
| // because rustdoc only looks for these modules at the crate level. | ||
| include!("../../core/src/primitive_docs.rs"); | ||
| // Include private modules that exist solely to provide rustdoc | ||
| // documentation for built-in attributes. Using `include!` because rustdoc | ||
| // only looks for these modules at the crate level. | ||
| include!("../../core/src/attribute_docs.rs"); | ||
|
Member
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. Why are these files included both in libcore and libstd? I guess this is to keep existing links like https://doc.rust-lang.org/nightly/std/keyword.unsafe.html working?
Author
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. This pattern was in place for the primitives docs already. I spoke with some folks during the lang-docs office hour and the assumption is for visibility. Most people will be looking in the
Member
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. When you are in the
Member
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.
Yeah I saw that. Still, would be good to add a brief comment explaining it.
Author
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. Including in both was already set for
Member
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. That will mean that looking for
Member
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. Thinking out loud, infra team can likely add redirections for these items.
Member
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.
Would it? We don't get duplicates for e.g.
Author
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. I believe it's only searching in the crate you're in currently. So if if the includes are removed from So I don't believe it's show up twice. If anything removing from
Member
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.
Ah indeed. That is... surprising. Oh well, if it works let's use it then. =D |
||
|
|
||
| // Include a number of private modules that exist solely to provide | ||
| // the rustdoc documentation for the existing keywords. Using `include!` | ||
| // because rustdoc only looks for these modules at the crate level. | ||
| include!("keyword_docs.rs"); | ||
| include!("../../core/src/keyword_docs.rs"); | ||
|
|
||
| // Include private modules that exist solely to provide rustdoc | ||
| // documentation for built-in attributes. Using `include!` because rustdoc | ||
| // only looks for these modules at the crate level. | ||
| include!("attribute_docs.rs"); | ||
| // Include a number of private modules that exist solely to provide | ||
| // the rustdoc documentation for primitive types. Using `include!` | ||
| // because rustdoc only looks for these modules at the crate level. | ||
| include!("../../core/src/primitive_docs.rs"); | ||
|
|
||
| // This is required to avoid an unstable error when `restricted-std` is not | ||
| // enabled. The use of #![feature(restricted_std)] in rustc-std-workspace-std | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks like a test coverage regression, since it will be ignored on all targets now
View changes since the review
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there a way to ignore a doc test for a specific target?
When these docs were in
std, the test did not run for thewasm32-wasip1target in CI. However incoreit does. The log of the failed try run earlier indicated that theexplicit_tail_callsfeature is not supported for this target.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes: