mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Auto merge of #89903 - matthiaskrgr:rollup-s0c69xl, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - #86011 (move implicit `Sized` predicate to end of list) - #89821 (Add a strange test for `unsafe_code` lint.) - #89859 (add dedicated error variant for writing the discriminant of an uninhabited enum variant) - #89870 (Suggest Box::pin when Pin::new is used instead) - #89880 (Use non-checking TLS relocation in aarch64 asm! sym test.) - #89885 (add long explanation for E0183) - #89894 (Remove unused dependencies from rustc_const_eval) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
72d66064e7
@ -3736,8 +3736,6 @@ dependencies = [
|
||||
name = "rustc_const_eval"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"either",
|
||||
"gsgdt",
|
||||
"rustc_apfloat",
|
||||
"rustc_ast",
|
||||
"rustc_attr",
|
||||
|
@ -7,8 +7,6 @@ edition = "2021"
|
||||
doctest = false
|
||||
|
||||
[dependencies]
|
||||
either = "1.5.0"
|
||||
gsgdt = "0.1.2"
|
||||
tracing = "0.1"
|
||||
rustc_apfloat = { path = "../rustc_apfloat" }
|
||||
rustc_ast = { path = "../rustc_ast" }
|
||||
|
@ -618,6 +618,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
}
|
||||
|
||||
/// Read discriminant, return the runtime value as well as the variant index.
|
||||
/// Can also legally be called on non-enums (e.g. through the discriminant_value intrinsic)!
|
||||
pub fn read_discriminant(
|
||||
&self,
|
||||
op: &OpTy<'tcx, M::PointerTag>,
|
||||
|
@ -988,10 +988,23 @@ where
|
||||
variant_index: VariantIdx,
|
||||
dest: &PlaceTy<'tcx, M::PointerTag>,
|
||||
) -> InterpResult<'tcx> {
|
||||
// This must be an enum or generator.
|
||||
match dest.layout.ty.kind() {
|
||||
ty::Adt(adt, _) => assert!(adt.is_enum()),
|
||||
ty::Generator(..) => {}
|
||||
_ => span_bug!(
|
||||
self.cur_span(),
|
||||
"write_discriminant called on non-variant-type (neither enum nor generator)"
|
||||
),
|
||||
}
|
||||
// Layout computation excludes uninhabited variants from consideration
|
||||
// therefore there's no way to represent those variants in the given layout.
|
||||
// Essentially, uninhabited variants do not have a tag that corresponds to their
|
||||
// discriminant, so we cannot do anything here.
|
||||
// When evaluating we will always error before even getting here, but ConstProp 'executes'
|
||||
// dead code, so we cannot ICE here.
|
||||
if dest.layout.for_variant(self, variant_index).abi.is_uninhabited() {
|
||||
throw_ub!(Unreachable);
|
||||
throw_ub!(UninhabitedEnumVariantWritten)
|
||||
}
|
||||
|
||||
match dest.layout.variants {
|
||||
|
@ -92,6 +92,7 @@ E0164: include_str!("./error_codes/E0164.md"),
|
||||
E0165: include_str!("./error_codes/E0165.md"),
|
||||
E0170: include_str!("./error_codes/E0170.md"),
|
||||
E0178: include_str!("./error_codes/E0178.md"),
|
||||
E0183: include_str!("./error_codes/E0183.md"),
|
||||
E0184: include_str!("./error_codes/E0184.md"),
|
||||
E0185: include_str!("./error_codes/E0185.md"),
|
||||
E0186: include_str!("./error_codes/E0186.md"),
|
||||
@ -513,7 +514,6 @@ E0785: include_str!("./error_codes/E0785.md"),
|
||||
// E0173, // manual implementations of unboxed closure traits are experimental
|
||||
// E0174,
|
||||
// E0182, // merged into E0229
|
||||
E0183,
|
||||
// E0187, // cannot infer the kind of the closure
|
||||
// E0188, // can not cast an immutable reference to a mutable pointer
|
||||
// E0189, // deprecated: can only cast a boxed pointer to a boxed object
|
||||
|
39
compiler/rustc_error_codes/src/error_codes/E0183.md
Normal file
39
compiler/rustc_error_codes/src/error_codes/E0183.md
Normal file
@ -0,0 +1,39 @@
|
||||
Manual implemetation of a `Fn*` trait.
|
||||
|
||||
Erroneous code example:
|
||||
|
||||
```compile_fail,E0183
|
||||
struct MyClosure {
|
||||
foo: i32
|
||||
}
|
||||
|
||||
impl FnOnce<()> for MyClosure { // error
|
||||
type Output = ();
|
||||
extern "rust-call" fn call_once(self, args: ()) -> Self::Output {
|
||||
println!("{}", self.foo);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Manually implementing `Fn`, `FnMut` or `FnOnce` is unstable
|
||||
and requires `#![feature(fn_traits, unboxed_closures)]`.
|
||||
|
||||
```
|
||||
#![feature(fn_traits, unboxed_closures)]
|
||||
|
||||
struct MyClosure {
|
||||
foo: i32
|
||||
}
|
||||
|
||||
impl FnOnce<()> for MyClosure { // ok!
|
||||
type Output = ();
|
||||
extern "rust-call" fn call_once(self, args: ()) -> Self::Output {
|
||||
println!("{}", self.foo);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The argumements must be a tuple representing the argument list.
|
||||
For more info, see the [tracking issue][iss29625]:
|
||||
|
||||
[iss29625]: https://github.com/rust-lang/rust/issues/29625
|
@ -287,6 +287,8 @@ pub enum UndefinedBehaviorInfo<'tcx> {
|
||||
target_size: u64,
|
||||
data_size: u64,
|
||||
},
|
||||
/// A discriminant of an uninhabited enum variant is written.
|
||||
UninhabitedEnumVariantWritten,
|
||||
}
|
||||
|
||||
impl fmt::Display for UndefinedBehaviorInfo<'_> {
|
||||
@ -391,6 +393,9 @@ impl fmt::Display for UndefinedBehaviorInfo<'_> {
|
||||
"scalar size mismatch: expected {} bytes but got {} bytes instead",
|
||||
target_size, data_size
|
||||
),
|
||||
UninhabitedEnumVariantWritten => {
|
||||
write!(f, "writing discriminant of an uninhabited enum")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -64,16 +64,16 @@ impl<'tcx> Bounds<'tcx> {
|
||||
})
|
||||
});
|
||||
|
||||
sized_predicate
|
||||
.into_iter()
|
||||
.chain(self.region_bounds.iter().map(|&(region_bound, span)| {
|
||||
self.region_bounds
|
||||
.iter()
|
||||
.map(|&(region_bound, span)| {
|
||||
(
|
||||
region_bound
|
||||
.map_bound(|region_bound| ty::OutlivesPredicate(param_ty, region_bound))
|
||||
.to_predicate(tcx),
|
||||
span,
|
||||
)
|
||||
}))
|
||||
})
|
||||
.chain(self.trait_bounds.iter().map(|&(bound_trait_ref, span, constness)| {
|
||||
let predicate = bound_trait_ref.with_constness(constness).to_predicate(tcx);
|
||||
(predicate, span)
|
||||
@ -83,6 +83,7 @@ impl<'tcx> Bounds<'tcx> {
|
||||
.iter()
|
||||
.map(|&(projection, span)| (projection.to_predicate(tcx), span)),
|
||||
)
|
||||
.chain(sized_predicate.into_iter())
|
||||
.collect()
|
||||
}
|
||||
}
|
||||
|
@ -8,11 +8,11 @@ use rustc_errors::{Applicability, DiagnosticBuilder};
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def::{CtorOf, DefKind};
|
||||
use rustc_hir::lang_items::LangItem;
|
||||
use rustc_hir::{Expr, ExprKind, ItemKind, Node, Stmt, StmtKind};
|
||||
use rustc_hir::{Expr, ExprKind, ItemKind, Node, Path, QPath, Stmt, StmtKind, TyKind};
|
||||
use rustc_infer::infer;
|
||||
use rustc_middle::lint::in_external_macro;
|
||||
use rustc_middle::ty::{self, Binder, Ty};
|
||||
use rustc_span::symbol::kw;
|
||||
use rustc_span::symbol::{kw, sym};
|
||||
|
||||
use std::iter;
|
||||
|
||||
@ -350,6 +350,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
}
|
||||
|
||||
/// When encountering an `impl Future` where `BoxFuture` is expected, suggest `Box::pin`.
|
||||
#[instrument(skip(self, err))]
|
||||
pub(in super::super) fn suggest_calling_boxed_future_when_appropriate(
|
||||
&self,
|
||||
err: &mut DiagnosticBuilder<'_>,
|
||||
@ -368,13 +369,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
if pin_did.is_none() || self.tcx.lang_items().owned_box().is_none() {
|
||||
return false;
|
||||
}
|
||||
match expected.kind() {
|
||||
ty::Adt(def, _) if Some(def.did) == pin_did => (),
|
||||
_ => return false,
|
||||
}
|
||||
let box_found = self.tcx.mk_box(found);
|
||||
let pin_box_found = self.tcx.mk_lang_item(box_found, LangItem::Pin).unwrap();
|
||||
let pin_found = self.tcx.mk_lang_item(found, LangItem::Pin).unwrap();
|
||||
match expected.kind() {
|
||||
ty::Adt(def, _) if Some(def.did) == pin_did => {
|
||||
if self.can_coerce(pin_box_found, expected) {
|
||||
debug!("can coerce {:?} to {:?}, suggesting Box::pin", pin_box_found, expected);
|
||||
match found.kind() {
|
||||
@ -405,6 +404,37 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
false
|
||||
}
|
||||
}
|
||||
ty::Adt(def, _) if def.is_box() && self.can_coerce(box_found, expected) => {
|
||||
// Check if the parent expression is a call to Pin::new. If it
|
||||
// is and we were expecting a Box, ergo Pin<Box<expected>>, we
|
||||
// can suggest Box::pin.
|
||||
let parent = self.tcx.hir().get_parent_node(expr.hir_id);
|
||||
let fn_name = match self.tcx.hir().find(parent) {
|
||||
Some(Node::Expr(Expr { kind: ExprKind::Call(fn_name, _), .. })) => fn_name,
|
||||
_ => return false,
|
||||
};
|
||||
match fn_name.kind {
|
||||
ExprKind::Path(QPath::TypeRelative(
|
||||
hir::Ty {
|
||||
kind: TyKind::Path(QPath::Resolved(_, Path { res: recv_ty, .. })),
|
||||
..
|
||||
},
|
||||
method,
|
||||
)) if Some(recv_ty.def_id()) == pin_did && method.ident.name == sym::new => {
|
||||
err.span_suggestion(
|
||||
fn_name.span,
|
||||
"use `Box::pin` to pin and box this expression",
|
||||
"Box::pin".to_string(),
|
||||
Applicability::MachineApplicable,
|
||||
);
|
||||
true
|
||||
}
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
_ => false,
|
||||
}
|
||||
}
|
||||
|
||||
/// A common error is to forget to add a semicolon at the end of a block, e.g.,
|
||||
///
|
||||
|
@ -55,7 +55,7 @@ macro_rules! static_tls_addr {
|
||||
// Add the top 12 bits of the symbol's offset
|
||||
"add {out}, {out}, :tprel_hi12:{sym}",
|
||||
// And the bottom 12 bits
|
||||
"add {out}, {out}, :tprel_lo12:{sym}",
|
||||
"add {out}, {out}, :tprel_lo12_nc:{sym}",
|
||||
out = out(reg) result,
|
||||
sym = sym $s
|
||||
);
|
||||
|
@ -11,7 +11,7 @@ note: required by a bound in `std::hash::Hash::hash`
|
||||
--> $SRC_DIR/core/src/hash/mod.rs:LL:COL
|
||||
|
|
||||
LL | fn hash<H: Hasher>(&self, state: &mut H);
|
||||
| ^ required by this bound in `std::hash::Hash::hash`
|
||||
| ^^^^^^ required by this bound in `std::hash::Hash::hash`
|
||||
= note: this error originates in the derive macro `Hash` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -11,7 +11,7 @@ note: required by a bound in `std::hash::Hash::hash`
|
||||
--> $SRC_DIR/core/src/hash/mod.rs:LL:COL
|
||||
|
|
||||
LL | fn hash<H: Hasher>(&self, state: &mut H);
|
||||
| ^ required by this bound in `std::hash::Hash::hash`
|
||||
| ^^^^^^ required by this bound in `std::hash::Hash::hash`
|
||||
= note: this error originates in the derive macro `Hash` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -11,7 +11,7 @@ note: required by a bound in `std::hash::Hash::hash`
|
||||
--> $SRC_DIR/core/src/hash/mod.rs:LL:COL
|
||||
|
|
||||
LL | fn hash<H: Hasher>(&self, state: &mut H);
|
||||
| ^ required by this bound in `std::hash::Hash::hash`
|
||||
| ^^^^^^ required by this bound in `std::hash::Hash::hash`
|
||||
= note: this error originates in the derive macro `Hash` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -11,7 +11,7 @@ note: required by a bound in `std::hash::Hash::hash`
|
||||
--> $SRC_DIR/core/src/hash/mod.rs:LL:COL
|
||||
|
|
||||
LL | fn hash<H: Hasher>(&self, state: &mut H);
|
||||
| ^ required by this bound in `std::hash::Hash::hash`
|
||||
| ^^^^^^ required by this bound in `std::hash::Hash::hash`
|
||||
= note: this error originates in the derive macro `Hash` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -101,5 +101,5 @@ LL | impl FnOnce<()> for Baz {
|
||||
|
||||
error: aborting due to 12 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0229, E0658.
|
||||
For more information about an error, try `rustc --explain E0229`.
|
||||
Some errors have detailed explanations: E0183, E0229, E0658.
|
||||
For more information about an error, try `rustc --explain E0183`.
|
||||
|
@ -26,4 +26,5 @@ LL | impl FnOnce<(u32, u32)> for Test {
|
||||
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0658`.
|
||||
Some errors have detailed explanations: E0183, E0658.
|
||||
For more information about an error, try `rustc --explain E0183`.
|
||||
|
@ -1,19 +1,3 @@
|
||||
error[E0277]: the trait bound `Self: Trait1` is not satisfied
|
||||
--> $DIR/issue-74816.rs:9:5
|
||||
|
|
||||
LL | type Associated: Trait1 = Self;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait1` is not implemented for `Self`
|
||||
|
|
||||
note: required by a bound in `Trait2::Associated`
|
||||
--> $DIR/issue-74816.rs:9:22
|
||||
|
|
||||
LL | type Associated: Trait1 = Self;
|
||||
| ^^^^^^ required by this bound in `Trait2::Associated`
|
||||
help: consider further restricting `Self`
|
||||
|
|
||||
LL | trait Trait2: Trait1 {
|
||||
| ++++++++
|
||||
|
||||
error[E0277]: the size for values of type `Self` cannot be known at compilation time
|
||||
--> $DIR/issue-74816.rs:9:5
|
||||
|
|
||||
@ -30,6 +14,22 @@ help: consider further restricting `Self`
|
||||
LL | trait Trait2: Sized {
|
||||
| +++++++
|
||||
|
||||
error[E0277]: the trait bound `Self: Trait1` is not satisfied
|
||||
--> $DIR/issue-74816.rs:9:5
|
||||
|
|
||||
LL | type Associated: Trait1 = Self;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait1` is not implemented for `Self`
|
||||
|
|
||||
note: required by a bound in `Trait2::Associated`
|
||||
--> $DIR/issue-74816.rs:9:22
|
||||
|
|
||||
LL | type Associated: Trait1 = Self;
|
||||
| ^^^^^^ required by this bound in `Trait2::Associated`
|
||||
help: consider further restricting `Self`
|
||||
|
|
||||
LL | trait Trait2: Trait1 {
|
||||
| ++++++++
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
|
@ -20,13 +20,13 @@ LL | for<'a> T: 'a,
|
||||
| ^^
|
||||
|
||||
error[E0311]: the parameter type `T` may not live long enough
|
||||
--> $DIR/issue-86483.rs:9:5
|
||||
--> $DIR/issue-86483.rs:9:19
|
||||
|
|
||||
LL | pub trait IceIce<T>
|
||||
| - help: consider adding an explicit lifetime bound...: `T: 'a`
|
||||
...
|
||||
LL | type Ice<'v>: IntoIterator<Item = &'v T>;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds...
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds...
|
||||
|
|
||||
note: ...that is required by this bound
|
||||
--> $DIR/issue-86483.rs:7:16
|
||||
|
@ -6,10 +6,10 @@ LL | impl Tsized for () {}
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `[()]`
|
||||
note: required by a bound in `Tsized`
|
||||
--> $DIR/issue-61631-default-type-param-can-reference-self-in-trait.rs:17:14
|
||||
--> $DIR/issue-61631-default-type-param-can-reference-self-in-trait.rs:17:17
|
||||
|
|
||||
LL | trait Tsized<P: Sized = [Self]> {}
|
||||
| ^ required by this bound in `Tsized`
|
||||
| ^^^^^ required by this bound in `Tsized`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -1,11 +1,21 @@
|
||||
error[E0282]: type annotations needed
|
||||
error[E0283]: type annotations needed
|
||||
--> $DIR/issue-16966.rs:2:5
|
||||
|
|
||||
LL | panic!(std::default::Default::default());
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type for type parameter `M` declared on the function `begin_panic`
|
||||
|
|
||||
= note: cannot satisfy `_: Any`
|
||||
note: required by a bound in `begin_panic`
|
||||
--> $SRC_DIR/std/src/panicking.rs:LL:COL
|
||||
|
|
||||
LL | pub fn begin_panic<M: Any + Send>(msg: M) -> ! {
|
||||
| ^^^ required by this bound in `begin_panic`
|
||||
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
help: consider specifying the type argument in the function call
|
||||
|
|
||||
LL | $crate::rt::begin_panic::<M>($msg)
|
||||
| +++++
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0282`.
|
||||
For more information about this error, try `rustc --explain E0283`.
|
||||
|
@ -10,7 +10,7 @@ note: required by a bound in `std::hash::Hash::hash`
|
||||
--> $SRC_DIR/core/src/hash/mod.rs:LL:COL
|
||||
|
|
||||
LL | fn hash<H: Hasher>(&self, state: &mut H);
|
||||
| ^ required by this bound in `std::hash::Hash::hash`
|
||||
| ^^^^^^ required by this bound in `std::hash::Hash::hash`
|
||||
= note: this error originates in the derive macro `Hash` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error: aborting due to previous error
|
||||
|
@ -1,4 +1,4 @@
|
||||
error[E0275]: overflow evaluating the requirement `<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<T as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next: Sized`
|
||||
error[E0275]: overflow evaluating the requirement `<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<T as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next as Next>::Next: Next`
|
||||
--> $DIR/issue-23122-2.rs:9:17
|
||||
|
|
||||
LL | type Next = <GetNext<T::Next> as Next>::Next;
|
||||
|
@ -12,10 +12,10 @@ LL | const ARR_LEN: usize = Tt::const_val::<[i8; 123]>();
|
||||
|
|
||||
= note: cannot satisfy `_: Tt`
|
||||
note: required by a bound in `Tt::const_val`
|
||||
--> $DIR/issue-54954.rs:5:24
|
||||
--> $DIR/issue-54954.rs:5:27
|
||||
|
|
||||
LL | const fn const_val<T: Sized>() -> usize {
|
||||
| ^ required by this bound in `Tt::const_val`
|
||||
| ^^^^^ required by this bound in `Tt::const_val`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
16
src/test/ui/lint/unsafe_code/auxiliary/forge_unsafe_block.rs
Normal file
16
src/test/ui/lint/unsafe_code/auxiliary/forge_unsafe_block.rs
Normal file
@ -0,0 +1,16 @@
|
||||
// force-host
|
||||
// no-prefer-dynamic
|
||||
|
||||
#![crate_type = "proc-macro"]
|
||||
|
||||
extern crate proc_macro;
|
||||
|
||||
use proc_macro::{Delimiter, Group, Ident, Span, TokenStream, TokenTree};
|
||||
|
||||
#[proc_macro]
|
||||
pub fn forge_unsafe_block(input: TokenStream) -> TokenStream {
|
||||
let mut output = TokenStream::new();
|
||||
output.extend(Some(TokenTree::from(Ident::new("unsafe", Span::call_site()))));
|
||||
output.extend(Some(TokenTree::from(Group::new(Delimiter::Brace, input))));
|
||||
output
|
||||
}
|
16
src/test/ui/lint/unsafe_code/forge_unsafe_block.rs
Normal file
16
src/test/ui/lint/unsafe_code/forge_unsafe_block.rs
Normal file
@ -0,0 +1,16 @@
|
||||
// check-pass
|
||||
// aux-build:forge_unsafe_block.rs
|
||||
|
||||
#[macro_use]
|
||||
extern crate forge_unsafe_block;
|
||||
|
||||
unsafe fn foo() {}
|
||||
|
||||
#[forbid(unsafe_code)]
|
||||
fn main() {
|
||||
// `forbid` doesn't work for non-user-provided unsafe blocks.
|
||||
// see `UnsafeCode::check_expr`.
|
||||
forge_unsafe_block! {
|
||||
foo();
|
||||
}
|
||||
}
|
@ -20,11 +20,11 @@ error[E0277]: the trait bound `T: Bar` is not satisfied
|
||||
LL | T::c::<T>();
|
||||
| ^^^^^^^^^ the trait `Bar` is not implemented for `T`
|
||||
|
|
||||
note: required by `Foo::c`
|
||||
--> $DIR/trait-where-clause.rs:9:5
|
||||
note: required by a bound in `Foo::c`
|
||||
--> $DIR/trait-where-clause.rs:9:10
|
||||
|
|
||||
LL | fn c<T: ~const Bar>();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^ required by this bound in `Foo::c`
|
||||
help: consider further restricting this bound
|
||||
|
|
||||
LL | const fn test1<T: ~const Foo + Bar + Bar>() {
|
||||
@ -52,11 +52,11 @@ error[E0277]: the trait bound `T: Bar` is not satisfied
|
||||
LL | T::c::<T>();
|
||||
| ^^^^^^^^^ the trait `Bar` is not implemented for `T`
|
||||
|
|
||||
note: required by `Foo::c`
|
||||
--> $DIR/trait-where-clause.rs:9:5
|
||||
note: required by a bound in `Foo::c`
|
||||
--> $DIR/trait-where-clause.rs:9:10
|
||||
|
|
||||
LL | fn c<T: ~const Bar>();
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ^ required by this bound in `Foo::c`
|
||||
help: consider further restricting this bound
|
||||
|
|
||||
LL | fn test3<T: Foo + Bar>() {
|
||||
|
@ -15,9 +15,6 @@ fn bar<F: Future<Output=i32> + Send + 'static>(x: F) -> BoxFuture<'static, i32>
|
||||
Box::new(x) //~ ERROR mismatched types
|
||||
}
|
||||
|
||||
// This case is still subpar:
|
||||
// `Pin::new(x)`: store this in the heap by calling `Box::new`: `Box::new(x)`
|
||||
// Should suggest changing the code from `Pin::new` to `Box::pin`.
|
||||
fn baz<F: Future<Output=i32> + Send + 'static>(x: F) -> BoxFuture<'static, i32> {
|
||||
Pin::new(x) //~ ERROR mismatched types
|
||||
//~^ ERROR E0277
|
||||
|
@ -27,23 +27,20 @@ LL | Box::new(x)
|
||||
= help: use `Box::pin`
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/expected-boxed-future-isnt-pinned.rs:22:14
|
||||
--> $DIR/expected-boxed-future-isnt-pinned.rs:19:14
|
||||
|
|
||||
LL | fn baz<F: Future<Output=i32> + Send + 'static>(x: F) -> BoxFuture<'static, i32> {
|
||||
| - this type parameter
|
||||
LL | Pin::new(x)
|
||||
| ^ expected struct `Box`, found type parameter `F`
|
||||
| -------- ^ expected struct `Box`, found type parameter `F`
|
||||
| |
|
||||
| help: use `Box::pin` to pin and box this expression: `Box::pin`
|
||||
|
|
||||
= note: expected struct `Box<dyn Future<Output = i32> + Send>`
|
||||
found type parameter `F`
|
||||
= note: for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html
|
||||
help: store this in the heap by calling `Box::new`
|
||||
|
|
||||
LL | Pin::new(Box::new(x))
|
||||
| +++++++++ +
|
||||
|
||||
error[E0277]: `dyn Future<Output = i32> + Send` cannot be unpinned
|
||||
--> $DIR/expected-boxed-future-isnt-pinned.rs:22:5
|
||||
--> $DIR/expected-boxed-future-isnt-pinned.rs:19:5
|
||||
|
|
||||
LL | Pin::new(x)
|
||||
| ^^^^^^^^ the trait `Unpin` is not implemented for `dyn Future<Output = i32> + Send`
|
||||
@ -56,7 +53,7 @@ LL | pub const fn new(pointer: P) -> Pin<P> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0277]: `dyn Future<Output = i32> + Send` cannot be unpinned
|
||||
--> $DIR/expected-boxed-future-isnt-pinned.rs:27:5
|
||||
--> $DIR/expected-boxed-future-isnt-pinned.rs:24:5
|
||||
|
|
||||
LL | Pin::new(Box::new(x))
|
||||
| ^^^^^^^^ the trait `Unpin` is not implemented for `dyn Future<Output = i32> + Send`
|
||||
@ -69,7 +66,7 @@ LL | pub const fn new(pointer: P) -> Pin<P> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/expected-boxed-future-isnt-pinned.rs:31:5
|
||||
--> $DIR/expected-boxed-future-isnt-pinned.rs:28:5
|
||||
|
|
||||
LL | fn zap() -> BoxFuture<'static, i32> {
|
||||
| ----------------------- expected `Pin<Box<(dyn Future<Output = i32> + Send + 'static)>>` because of return type
|
||||
|
@ -49,10 +49,10 @@ LL | f_sized(*ref_cl);
|
||||
|
|
||||
= help: the trait `Sized` is not implemented for `dyn Fn()`
|
||||
note: required by a bound in `f_sized`
|
||||
--> $DIR/issue-84973-blacklist.rs:9:12
|
||||
--> $DIR/issue-84973-blacklist.rs:9:15
|
||||
|
|
||||
LL | fn f_sized<T: Sized>(t: T) {}
|
||||
| ^ required by this bound in `f_sized`
|
||||
| ^^^^^ required by this bound in `f_sized`
|
||||
|
||||
error[E0277]: `Rc<{integer}>` cannot be sent between threads safely
|
||||
--> $DIR/issue-84973-blacklist.rs:27:12
|
||||
|
@ -1,23 +1,3 @@
|
||||
error[E0277]: the size for values of type `[i32]` cannot be known at compilation time
|
||||
--> $DIR/slice-issue-87994.rs:3:12
|
||||
|
|
||||
LL | for _ in v[1..] {
|
||||
| ^^^^^^ expected an implementor of trait `IntoIterator`
|
||||
|
|
||||
= note: the trait bound `[i32]: IntoIterator` is not satisfied
|
||||
= note: required because of the requirements on the impl of `IntoIterator` for `[i32]`
|
||||
note: required by `into_iter`
|
||||
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
||||
|
|
||||
LL | fn into_iter(self) -> Self::IntoIter;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: consider borrowing here
|
||||
|
|
||||
LL | for _ in &v[1..] {
|
||||
| +
|
||||
LL | for _ in &mut v[1..] {
|
||||
| ++++
|
||||
|
||||
error[E0277]: `[i32]` is not an iterator
|
||||
--> $DIR/slice-issue-87994.rs:3:12
|
||||
|
|
||||
@ -38,14 +18,14 @@ LL | for _ in &v[1..] {
|
||||
LL | for _ in &mut v[1..] {
|
||||
| ++++
|
||||
|
||||
error[E0277]: the size for values of type `[K]` cannot be known at compilation time
|
||||
--> $DIR/slice-issue-87994.rs:11:13
|
||||
error[E0277]: the size for values of type `[i32]` cannot be known at compilation time
|
||||
--> $DIR/slice-issue-87994.rs:3:12
|
||||
|
|
||||
LL | for i2 in v2[1..] {
|
||||
| ^^^^^^^ expected an implementor of trait `IntoIterator`
|
||||
LL | for _ in v[1..] {
|
||||
| ^^^^^^ expected an implementor of trait `IntoIterator`
|
||||
|
|
||||
= note: the trait bound `[K]: IntoIterator` is not satisfied
|
||||
= note: required because of the requirements on the impl of `IntoIterator` for `[K]`
|
||||
= note: the trait bound `[i32]: IntoIterator` is not satisfied
|
||||
= note: required because of the requirements on the impl of `IntoIterator` for `[i32]`
|
||||
note: required by `into_iter`
|
||||
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
||||
|
|
||||
@ -53,9 +33,9 @@ LL | fn into_iter(self) -> Self::IntoIter;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: consider borrowing here
|
||||
|
|
||||
LL | for i2 in &v2[1..] {
|
||||
LL | for _ in &v[1..] {
|
||||
| +
|
||||
LL | for i2 in &mut v2[1..] {
|
||||
LL | for _ in &mut v[1..] {
|
||||
| ++++
|
||||
|
||||
error[E0277]: `[K]` is not an iterator
|
||||
@ -78,6 +58,26 @@ LL | for i2 in &v2[1..] {
|
||||
LL | for i2 in &mut v2[1..] {
|
||||
| ++++
|
||||
|
||||
error[E0277]: the size for values of type `[K]` cannot be known at compilation time
|
||||
--> $DIR/slice-issue-87994.rs:11:13
|
||||
|
|
||||
LL | for i2 in v2[1..] {
|
||||
| ^^^^^^^ expected an implementor of trait `IntoIterator`
|
||||
|
|
||||
= note: the trait bound `[K]: IntoIterator` is not satisfied
|
||||
= note: required because of the requirements on the impl of `IntoIterator` for `[K]`
|
||||
note: required by `into_iter`
|
||||
--> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL
|
||||
|
|
||||
LL | fn into_iter(self) -> Self::IntoIter;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: consider borrowing here
|
||||
|
|
||||
LL | for i2 in &v2[1..] {
|
||||
| +
|
||||
LL | for i2 in &mut v2[1..] {
|
||||
| ++++
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
|
@ -5,7 +5,7 @@ use std::fmt::Debug;
|
||||
fn main() {}
|
||||
|
||||
type Two<A, B> = impl Debug;
|
||||
//~^ ERROR the trait bound `A: Foo` is not satisfied in `(A, B, <A as Foo>::Bar)`
|
||||
//~^ ERROR the trait bound `A: Foo` is not satisfied
|
||||
//~| ERROR `A` doesn't implement `Debug`
|
||||
//~| ERROR `B` doesn't implement `Debug`
|
||||
|
||||
|
@ -10,18 +10,6 @@ note: previous use here
|
||||
LL | fn two<T: Debug + Foo, U: Debug>(t: T, u: U) -> Two<T, U> {
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0277]: the trait bound `A: Foo` is not satisfied in `(A, B, <A as Foo>::Bar)`
|
||||
--> $DIR/generic_duplicate_param_use9.rs:7:18
|
||||
|
|
||||
LL | type Two<A, B> = impl Debug;
|
||||
| ^^^^^^^^^^ within `(A, B, <A as Foo>::Bar)`, the trait `Foo` is not implemented for `A`
|
||||
|
|
||||
= note: required because it appears within the type `(A, B, <A as Foo>::Bar)`
|
||||
help: consider restricting type parameter `A`
|
||||
|
|
||||
LL | type Two<A: Foo, B> = impl Debug;
|
||||
| +++++
|
||||
|
||||
error[E0277]: `A` doesn't implement `Debug`
|
||||
--> $DIR/generic_duplicate_param_use9.rs:7:18
|
||||
|
|
||||
@ -46,6 +34,18 @@ help: consider restricting type parameter `B`
|
||||
LL | type Two<A, B: std::fmt::Debug> = impl Debug;
|
||||
| +++++++++++++++++
|
||||
|
||||
error[E0277]: the trait bound `A: Foo` is not satisfied
|
||||
--> $DIR/generic_duplicate_param_use9.rs:7:18
|
||||
|
|
||||
LL | type Two<A, B> = impl Debug;
|
||||
| ^^^^^^^^^^ the trait `Foo` is not implemented for `A`
|
||||
|
|
||||
= note: required because of the requirements on the impl of `Debug` for `(A, B, <A as Foo>::Bar)`
|
||||
help: consider restricting type parameter `A`
|
||||
|
|
||||
LL | type Two<A: Foo, B> = impl Debug;
|
||||
| +++++
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0277`.
|
||||
|
@ -19,10 +19,10 @@ LL | | >(Unique<T>, A);
|
||||
| |________________- doesn't satisfy `Box<dyn Foo>: Clone`
|
||||
|
|
||||
= note: the following trait bounds were not satisfied:
|
||||
`dyn Foo: Sized`
|
||||
which is required by `Box<dyn Foo>: Clone`
|
||||
`dyn Foo: Clone`
|
||||
which is required by `Box<dyn Foo>: Clone`
|
||||
`dyn Foo: Sized`
|
||||
which is required by `Box<dyn Foo>: Clone`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -7,10 +7,10 @@ LL | fn foo<T: ?Sized>() { bar::<T>() }
|
||||
| this type parameter needs to be `std::marker::Sized`
|
||||
|
|
||||
note: required by a bound in `bar`
|
||||
--> $DIR/unsized-bare-typaram.rs:1:8
|
||||
--> $DIR/unsized-bare-typaram.rs:1:11
|
||||
|
|
||||
LL | fn bar<T: Sized>() { }
|
||||
| ^ required by this bound in `bar`
|
||||
| ^^^^^ required by this bound in `bar`
|
||||
help: consider removing the `?Sized` bound to make the type parameter `Sized`
|
||||
|
|
||||
LL - fn foo<T: ?Sized>() { bar::<T>() }
|
||||
|
@ -38,10 +38,10 @@ note: required because it appears within the type `Bar<T>`
|
||||
LL | struct Bar<T: ?Sized> { data: T }
|
||||
| ^^^
|
||||
note: required by a bound in `is_sized`
|
||||
--> $DIR/unsized-struct.rs:1:13
|
||||
--> $DIR/unsized-struct.rs:1:15
|
||||
|
|
||||
LL | fn is_sized<T:Sized>() { }
|
||||
| ^ required by this bound in `is_sized`
|
||||
| ^^^^^ required by this bound in `is_sized`
|
||||
help: consider removing the `?Sized` bound to make the type parameter `Sized`
|
||||
|
|
||||
LL - fn bar2<T: ?Sized>() { is_sized::<Bar<T>>() }
|
||||
|
Loading…
Reference in New Issue
Block a user