Make rustc_on_unimplemented std-agnostic

This commit is contained in:
Rageking8 2023-06-26 20:40:06 +08:00
parent 25b5af1b3a
commit 48544c1b12
6 changed files with 60 additions and 30 deletions

View File

@ -532,7 +532,7 @@ pub trait Into<T>: Sized {
#[rustc_diagnostic_item = "From"] #[rustc_diagnostic_item = "From"]
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_on_unimplemented(on( #[rustc_on_unimplemented(on(
all(_Self = "&str", T = "std::string::String"), all(_Self = "&str", any(T = "alloc::string::String", T = "std::string::String")),
note = "to coerce a `{T}` into a `{Self}`, use `&*` as a prefix", note = "to coerce a `{T}` into a `{Self}`, use `&*` as a prefix",
))] ))]
pub trait From<T>: Sized { pub trait From<T>: Sized {

View File

@ -26,13 +26,13 @@ fn _assert_is_object_safe(_: &dyn Iterator<Item = ()>) {}
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
#[rustc_on_unimplemented( #[rustc_on_unimplemented(
on( on(
_Self = "std::ops::RangeTo<Idx>", any(_Self = "core::ops::RangeTo<Idx>", _Self = "std::ops::RangeTo<Idx>"),
label = "if you meant to iterate until a value, add a starting value", label = "if you meant to iterate until a value, add a starting value",
note = "`..end` is a `RangeTo`, which cannot be iterated on; you might have meant to have a \ note = "`..end` is a `RangeTo`, which cannot be iterated on; you might have meant to have a \
bounded `Range`: `0..end`" bounded `Range`: `0..end`"
), ),
on( on(
_Self = "std::ops::RangeToInclusive<Idx>", any(_Self = "core::ops::RangeToInclusive<Idx>", _Self = "std::ops::RangeToInclusive<Idx>"),
label = "if you meant to iterate until a value (including it), add a starting value", label = "if you meant to iterate until a value (including it), add a starting value",
note = "`..=end` is a `RangeToInclusive`, which cannot be iterated on; you might have meant \ note = "`..=end` is a `RangeToInclusive`, which cannot be iterated on; you might have meant \
to have a bounded `RangeInclusive`: `0..=end`" to have a bounded `RangeInclusive`: `0..=end`"
@ -43,7 +43,7 @@ fn _assert_is_object_safe(_: &dyn Iterator<Item = ()>) {}
), ),
on(_Self = "&[]", label = "`{Self}` is not an iterator; try calling `.iter()`"), on(_Self = "&[]", label = "`{Self}` is not an iterator; try calling `.iter()`"),
on( on(
_Self = "std::vec::Vec<T, A>", any(_Self = "alloc::vec::Vec<T, A>", _Self = "std::vec::Vec<T, A>"),
label = "`{Self}` is not an iterator; try calling `.into_iter()` or `.iter()`" label = "`{Self}` is not an iterator; try calling `.into_iter()` or `.iter()`"
), ),
on( on(
@ -51,7 +51,7 @@ fn _assert_is_object_safe(_: &dyn Iterator<Item = ()>) {}
label = "`{Self}` is not an iterator; try calling `.chars()` or `.bytes()`" label = "`{Self}` is not an iterator; try calling `.chars()` or `.bytes()`"
), ),
on( on(
_Self = "std::string::String", any(_Self = "alloc::string::String", _Self = "std::string::String"),
label = "`{Self}` is not an iterator; try calling `.chars()` or `.bytes()`" label = "`{Self}` is not an iterator; try calling `.chars()` or `.bytes()`"
), ),
on( on(

View File

@ -575,59 +575,59 @@ impl<T: ?Sized> Copy for &T {}
#[lang = "sync"] #[lang = "sync"]
#[rustc_on_unimplemented( #[rustc_on_unimplemented(
on( on(
_Self = "std::cell::OnceCell<T>", any(_Self = "core::cell:OnceCell<T>", _Self = "std::cell::OnceCell<T>"),
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::OnceLock` instead" note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::OnceLock` instead"
), ),
on( on(
_Self = "std::cell::Cell<u8>", any(_Self = "core::cell::Cell<u8>", _Self = "std::cell::Cell<u8>"),
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicU8` instead", note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicU8` instead",
), ),
on( on(
_Self = "std::cell::Cell<u16>", any(_Self = "core::cell::Cell<u16>", _Self = "std::cell::Cell<u16>"),
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicU16` instead", note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicU16` instead",
), ),
on( on(
_Self = "std::cell::Cell<u32>", any(_Self = "core::cell::Cell<u32>", _Self = "std::cell::Cell<u32>"),
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicU32` instead", note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicU32` instead",
), ),
on( on(
_Self = "std::cell::Cell<u64>", any(_Self = "core::cell::Cell<u64>", _Self = "std::cell::Cell<u64>"),
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicU64` instead", note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicU64` instead",
), ),
on( on(
_Self = "std::cell::Cell<usize>", any(_Self = "core::cell::Cell<usize>", _Self = "std::cell::Cell<usize>"),
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicUsize` instead", note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicUsize` instead",
), ),
on( on(
_Self = "std::cell::Cell<i8>", any(_Self = "core::cell::Cell<i8>", _Self = "std::cell::Cell<i8>"),
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicI8` instead", note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicI8` instead",
), ),
on( on(
_Self = "std::cell::Cell<i16>", any(_Self = "core::cell::Cell<i16>", _Self = "std::cell::Cell<i16>"),
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicI16` instead", note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicI16` instead",
), ),
on( on(
_Self = "std::cell::Cell<i32>", any(_Self = "core::cell::Cell<i32>", _Self = "std::cell::Cell<i32>"),
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicI32` instead", note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicI32` instead",
), ),
on( on(
_Self = "std::cell::Cell<i64>", any(_Self = "core::cell::Cell<i64>", _Self = "std::cell::Cell<i64>"),
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicI64` instead", note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicI64` instead",
), ),
on( on(
_Self = "std::cell::Cell<isize>", any(_Self = "core::cell::Cell<isize>", _Self = "std::cell::Cell<isize>"),
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicIsize` instead", note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicIsize` instead",
), ),
on( on(
_Self = "std::cell::Cell<bool>", any(_Self = "core::cell::Cell<bool>", _Self = "std::cell::Cell<bool>"),
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicBool` instead", note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicBool` instead",
), ),
on( on(
_Self = "std::cell::Cell<T>", any(_Self = "core::cell::Cell<T>", _Self = "std::cell::Cell<T>"),
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock`", note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock`",
), ),
on( on(
_Self = "std::cell::RefCell<T>", any(_Self = "core::cell::RefCell<T>", _Self = "std::cell::RefCell<T>"),
note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` instead", note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` instead",
), ),
message = "`{Self}` cannot be shared between threads safely", message = "`{Self}` cannot be shared between threads safely",

View File

@ -153,7 +153,7 @@ see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#ind
see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>" see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>"
), ),
on( on(
_Self = "std::string::String", any(_Self = "alloc::string::String", _Self = "std::string::String"),
note = "you can use `.chars().nth()` or `.bytes().nth()` note = "you can use `.chars().nth()` or `.bytes().nth()`
see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>" see chapter in The Book <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>"
), ),

View File

@ -226,8 +226,14 @@ pub trait Try: FromResidual {
on( on(
all( all(
from_desugaring = "QuestionMark", from_desugaring = "QuestionMark",
_Self = "std::result::Result<T, E>", any(
R = "std::option::Option<std::convert::Infallible>" _Self = "core::result::Result<T, E>",
_Self = "std::result::Result<T, E>",
),
any(
R = "core::option::Option<core::convert::Infallible>",
R = "std::option::Option<std::convert::Infallible>",
)
), ),
message = "the `?` operator can only be used on `Result`s, not `Option`s, \ message = "the `?` operator can only be used on `Result`s, not `Option`s, \
in {ItemContext} that returns `Result`", in {ItemContext} that returns `Result`",
@ -237,7 +243,10 @@ pub trait Try: FromResidual {
on( on(
all( all(
from_desugaring = "QuestionMark", from_desugaring = "QuestionMark",
_Self = "std::result::Result<T, E>", any(
_Self = "core::result::Result<T, E>",
_Self = "std::result::Result<T, E>",
)
), ),
// There's a special error message in the trait selection code for // There's a special error message in the trait selection code for
// `From` in `?`, so this is not shown for result-in-result errors, // `From` in `?`, so this is not shown for result-in-result errors,
@ -250,8 +259,14 @@ pub trait Try: FromResidual {
on( on(
all( all(
from_desugaring = "QuestionMark", from_desugaring = "QuestionMark",
_Self = "std::option::Option<T>", any(
R = "std::result::Result<T, E>", _Self = "core::option::Option<T>",
_Self = "std::option::Option<T>",
),
any(
R = "core::result::Result<T, E>",
R = "std::result::Result<T, E>",
)
), ),
message = "the `?` operator can only be used on `Option`s, not `Result`s, \ message = "the `?` operator can only be used on `Option`s, not `Result`s, \
in {ItemContext} that returns `Option`", in {ItemContext} that returns `Option`",
@ -261,7 +276,10 @@ pub trait Try: FromResidual {
on( on(
all( all(
from_desugaring = "QuestionMark", from_desugaring = "QuestionMark",
_Self = "std::option::Option<T>", any(
_Self = "core::option::Option<T>",
_Self = "std::option::Option<T>",
)
), ),
// `Option`-in-`Option` always works, as there's only one possible // `Option`-in-`Option` always works, as there's only one possible
// residual, so this can also be phrased strongly. // residual, so this can also be phrased strongly.
@ -273,8 +291,14 @@ pub trait Try: FromResidual {
on( on(
all( all(
from_desugaring = "QuestionMark", from_desugaring = "QuestionMark",
_Self = "std::ops::ControlFlow<B, C>", any(
R = "std::ops::ControlFlow<B, C>", _Self = "core::ops::ControlFlow<B, C>",
_Self = "std::ops::ControlFlow<B, C>",
),
any(
R = "core::ops::ControlFlow<B, C>",
R = "std::ops::ControlFlow<B, C>",
)
), ),
message = "the `?` operator in {ItemContext} that returns `ControlFlow<B, _>` \ message = "the `?` operator in {ItemContext} that returns `ControlFlow<B, _>` \
can only be used on other `ControlFlow<B, _>`s (with the same Break type)", can only be used on other `ControlFlow<B, _>`s (with the same Break type)",
@ -285,7 +309,10 @@ pub trait Try: FromResidual {
on( on(
all( all(
from_desugaring = "QuestionMark", from_desugaring = "QuestionMark",
_Self = "std::ops::ControlFlow<B, C>", any(
_Self = "core::ops::ControlFlow<B, C>",
_Self = "std::ops::ControlFlow<B, C>",
)
// `R` is not a `ControlFlow`, as that case was matched previously // `R` is not a `ControlFlow`, as that case was matched previously
), ),
message = "the `?` operator can only be used on `ControlFlow`s \ message = "the `?` operator can only be used on `ControlFlow`s \

View File

@ -152,7 +152,10 @@ mod private_slice_index {
#[rustc_on_unimplemented( #[rustc_on_unimplemented(
on(T = "str", label = "string indices are ranges of `usize`",), on(T = "str", label = "string indices are ranges of `usize`",),
on( on(
all(any(T = "str", T = "&str", T = "std::string::String"), _Self = "{integer}"), all(
any(T = "str", T = "&str", T = "alloc::string::String", T = "std::string::String"),
_Self = "{integer}"
),
note = "you can use `.chars().nth()` or `.bytes().nth()`\n\ note = "you can use `.chars().nth()` or `.bytes().nth()`\n\
for more information, see chapter 8 in The Book: \ for more information, see chapter 8 in The Book: \
<https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>" <https://doc.rust-lang.org/book/ch08-02-strings.html#indexing-into-strings>"