Auto merge of #122140 - oli-obk:track_errors13, r=davidtwco

Run a single huge par_body_owners instead of many small ones after each other.

This improves parallel rustc parallelism by avoiding the bottleneck after each individual `par_body_owners` (because it needs to wait for queries to finish, so if there is one long running one, a lot of cores will be idle while waiting for the single query).
This commit is contained in:
bors 2024-03-11 14:26:09 +00:00
commit 65cd843ae0
33 changed files with 419 additions and 443 deletions

View File

@ -336,7 +336,8 @@ pub fn print<'tcx>(sess: &Session, ppm: PpMode, ex: PrintExtra<'tcx>) {
ThirTree => { ThirTree => {
let tcx = ex.tcx(); let tcx = ex.tcx();
let mut out = String::new(); let mut out = String::new();
if rustc_hir_analysis::check_crate(tcx).is_err() { rustc_hir_analysis::check_crate(tcx);
if tcx.dcx().has_errors().is_some() {
FatalError.raise(); FatalError.raise();
} }
debug!("pretty printing THIR tree"); debug!("pretty printing THIR tree");
@ -348,7 +349,8 @@ pub fn print<'tcx>(sess: &Session, ppm: PpMode, ex: PrintExtra<'tcx>) {
ThirFlat => { ThirFlat => {
let tcx = ex.tcx(); let tcx = ex.tcx();
let mut out = String::new(); let mut out = String::new();
if rustc_hir_analysis::check_crate(tcx).is_err() { rustc_hir_analysis::check_crate(tcx);
if tcx.dcx().has_errors().is_some() {
FatalError.raise(); FatalError.raise();
} }
debug!("pretty printing THIR flat"); debug!("pretty printing THIR flat");

View File

@ -5,22 +5,20 @@ use rustc_hir::intravisit::{self, Visitor};
use rustc_hir::{self as hir, def, Expr, ImplItem, Item, Node, TraitItem}; use rustc_hir::{self as hir, def, Expr, ImplItem, Item, Node, TraitItem};
use rustc_middle::hir::nested_filter; use rustc_middle::hir::nested_filter;
use rustc_middle::ty::{self, Ty, TyCtxt, TypeVisitableExt}; use rustc_middle::ty::{self, Ty, TyCtxt, TypeVisitableExt};
use rustc_span::{sym, ErrorGuaranteed, DUMMY_SP}; use rustc_span::{sym, DUMMY_SP};
use crate::errors::{TaitForwardCompat, TypeOf, UnconstrainedOpaqueType}; use crate::errors::{TaitForwardCompat, TypeOf, UnconstrainedOpaqueType};
pub fn test_opaque_hidden_types(tcx: TyCtxt<'_>) -> Result<(), ErrorGuaranteed> { pub fn test_opaque_hidden_types(tcx: TyCtxt<'_>) {
let mut res = Ok(());
if tcx.has_attr(CRATE_DEF_ID, sym::rustc_hidden_type_of_opaques) { if tcx.has_attr(CRATE_DEF_ID, sym::rustc_hidden_type_of_opaques) {
for id in tcx.hir().items() { for id in tcx.hir().items() {
if matches!(tcx.def_kind(id.owner_id), DefKind::OpaqueTy) { if matches!(tcx.def_kind(id.owner_id), DefKind::OpaqueTy) {
let type_of = tcx.type_of(id.owner_id).instantiate_identity(); let type_of = tcx.type_of(id.owner_id).instantiate_identity();
res = Err(tcx.dcx().emit_err(TypeOf { span: tcx.def_span(id.owner_id), type_of })); tcx.dcx().emit_err(TypeOf { span: tcx.def_span(id.owner_id), type_of });
} }
} }
} }
res
} }
/// Checks "defining uses" of opaque `impl Trait` in associated types. /// Checks "defining uses" of opaque `impl Trait` in associated types.

View File

@ -98,7 +98,6 @@ mod outlives;
pub mod structured_errors; pub mod structured_errors;
mod variance; mod variance;
use rustc_errors::ErrorGuaranteed;
use rustc_hir as hir; use rustc_hir as hir;
use rustc_middle::middle; use rustc_middle::middle;
use rustc_middle::query::Providers; use rustc_middle::query::Providers;
@ -156,11 +155,13 @@ pub fn provide(providers: &mut Providers) {
hir_wf_check::provide(providers); hir_wf_check::provide(providers);
} }
pub fn check_crate(tcx: TyCtxt<'_>) -> Result<(), ErrorGuaranteed> { pub fn check_crate(tcx: TyCtxt<'_>) {
let _prof_timer = tcx.sess.timer("type_check_crate"); let _prof_timer = tcx.sess.timer("type_check_crate");
if tcx.features().rustc_attrs { if tcx.features().rustc_attrs {
tcx.sess.time("outlives_testing", || outlives::test::test_inferred_outlives(tcx))?; tcx.sess.time("outlives_testing", || outlives::test::test_inferred_outlives(tcx));
tcx.sess.time("variance_testing", || variance::test::test_variance(tcx));
collect::test_opaque_hidden_types(tcx);
} }
tcx.sess.time("coherence_checking", || { tcx.sess.time("coherence_checking", || {
@ -176,14 +177,6 @@ pub fn check_crate(tcx: TyCtxt<'_>) -> Result<(), ErrorGuaranteed> {
let _ = tcx.ensure().crate_inherent_impls_overlap_check(()); let _ = tcx.ensure().crate_inherent_impls_overlap_check(());
}); });
if tcx.features().rustc_attrs {
tcx.sess.time("variance_testing", || variance::test::test_variance(tcx))?;
}
if tcx.features().rustc_attrs {
collect::test_opaque_hidden_types(tcx)?;
}
// Make sure we evaluate all static and (non-associated) const items, even if unused. // Make sure we evaluate all static and (non-associated) const items, even if unused.
// If any of these fail to evaluate, we do not want this crate to pass compilation. // If any of these fail to evaluate, we do not want this crate to pass compilation.
tcx.hir().par_body_owners(|item_def_id| { tcx.hir().par_body_owners(|item_def_id| {
@ -198,21 +191,6 @@ pub fn check_crate(tcx: TyCtxt<'_>) -> Result<(), ErrorGuaranteed> {
// Freeze definitions as we don't add new ones at this point. This improves performance by // Freeze definitions as we don't add new ones at this point. This improves performance by
// allowing lock-free access to them. // allowing lock-free access to them.
tcx.untracked().definitions.freeze(); tcx.untracked().definitions.freeze();
// FIXME: Remove this when we implement creating `DefId`s
// for anon constants during their parents' typeck.
// Typeck all body owners in parallel will produce queries
// cycle errors because it may typeck on anon constants directly.
tcx.hir().par_body_owners(|item_def_id| {
let def_kind = tcx.def_kind(item_def_id);
if !matches!(def_kind, DefKind::AnonConst) {
tcx.ensure().typeck(item_def_id);
}
});
tcx.ensure().check_unused_traits(());
Ok(())
} }
/// A quasi-deprecated helper used in rustdoc and clippy to get /// A quasi-deprecated helper used in rustdoc and clippy to get

View File

@ -1,8 +1,7 @@
use rustc_middle::ty::{self, TyCtxt}; use rustc_middle::ty::{self, TyCtxt};
use rustc_span::{symbol::sym, ErrorGuaranteed}; use rustc_span::symbol::sym;
pub fn test_inferred_outlives(tcx: TyCtxt<'_>) -> Result<(), ErrorGuaranteed> { pub fn test_inferred_outlives(tcx: TyCtxt<'_>) {
let mut res = Ok(());
for id in tcx.hir().items() { for id in tcx.hir().items() {
// For unit testing: check for a special "rustc_outlives" // For unit testing: check for a special "rustc_outlives"
// attribute and report an error with various results if found. // attribute and report an error with various results if found.
@ -23,8 +22,7 @@ pub fn test_inferred_outlives(tcx: TyCtxt<'_>) -> Result<(), ErrorGuaranteed> {
for p in pred { for p in pred {
err.note(p); err.note(p);
} }
res = Err(err.emit()); err.emit();
} }
} }
res
} }

View File

@ -2,21 +2,19 @@ use rustc_hir::def::DefKind;
use rustc_hir::def_id::CRATE_DEF_ID; use rustc_hir::def_id::CRATE_DEF_ID;
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
use rustc_span::symbol::sym; use rustc_span::symbol::sym;
use rustc_span::ErrorGuaranteed;
use crate::errors; use crate::errors;
pub fn test_variance(tcx: TyCtxt<'_>) -> Result<(), ErrorGuaranteed> { pub fn test_variance(tcx: TyCtxt<'_>) {
let mut res = Ok(());
if tcx.has_attr(CRATE_DEF_ID, sym::rustc_variance_of_opaques) { if tcx.has_attr(CRATE_DEF_ID, sym::rustc_variance_of_opaques) {
for id in tcx.hir().items() { for id in tcx.hir().items() {
if matches!(tcx.def_kind(id.owner_id), DefKind::OpaqueTy) { if matches!(tcx.def_kind(id.owner_id), DefKind::OpaqueTy) {
let variances_of = tcx.variances_of(id.owner_id); let variances_of = tcx.variances_of(id.owner_id);
res = Err(tcx.dcx().emit_err(errors::VariancesOf { tcx.dcx().emit_err(errors::VariancesOf {
span: tcx.def_span(id.owner_id), span: tcx.def_span(id.owner_id),
variances_of: format!("{variances_of:?}"), variances_of: format!("{variances_of:?}"),
})); });
} }
} }
} }
@ -27,11 +25,10 @@ pub fn test_variance(tcx: TyCtxt<'_>) -> Result<(), ErrorGuaranteed> {
if tcx.has_attr(id.owner_id, sym::rustc_variance) { if tcx.has_attr(id.owner_id, sym::rustc_variance) {
let variances_of = tcx.variances_of(id.owner_id); let variances_of = tcx.variances_of(id.owner_id);
res = Err(tcx.dcx().emit_err(errors::VariancesOf { tcx.dcx().emit_err(errors::VariancesOf {
span: tcx.def_span(id.owner_id), span: tcx.def_span(id.owner_id),
variances_of: format!("{variances_of:?}"), variances_of: format!("{variances_of:?}"),
})); });
} }
} }
res
} }

View File

@ -734,19 +734,22 @@ fn analysis(tcx: TyCtxt<'_>, (): ()) -> Result<()> {
}); });
// passes are timed inside typeck // passes are timed inside typeck
rustc_hir_analysis::check_crate(tcx)?; rustc_hir_analysis::check_crate(tcx);
sess.time("MIR_borrow_checking", || { sess.time("typeck_and_mir_analyses", || {
tcx.hir().par_body_owners(|def_id| { tcx.hir().par_body_owners(|def_id| {
let def_kind = tcx.def_kind(def_id);
// FIXME: Remove this when we implement creating `DefId`s
// for anon constants during their parents' typeck.
// Typeck all body owners in parallel will produce queries
// cycle errors because it may typeck on anon constants directly.
if !matches!(def_kind, rustc_hir::def::DefKind::AnonConst) {
tcx.ensure().typeck(def_id);
}
// Run unsafety check because it's responsible for stealing and // Run unsafety check because it's responsible for stealing and
// deallocating THIR. // deallocating THIR.
tcx.ensure().check_unsafety(def_id); tcx.ensure().check_unsafety(def_id);
tcx.ensure().mir_borrowck(def_id) tcx.ensure().mir_borrowck(def_id);
});
});
sess.time("MIR_effect_checking", || {
for def_id in tcx.hir().body_owners() {
if !tcx.sess.opts.unstable_opts.thir_unsafeck { if !tcx.sess.opts.unstable_opts.thir_unsafeck {
rustc_mir_transform::check_unsafety::check_unsafety(tcx, def_id); rustc_mir_transform::check_unsafety::check_unsafety(tcx, def_id);
} }
@ -761,15 +764,15 @@ fn analysis(tcx: TyCtxt<'_>, (): ()) -> Result<()> {
tcx.ensure().mir_drops_elaborated_and_const_checked(def_id); tcx.ensure().mir_drops_elaborated_and_const_checked(def_id);
tcx.ensure().unused_generic_params(ty::InstanceDef::Item(def_id.to_def_id())); tcx.ensure().unused_generic_params(ty::InstanceDef::Item(def_id.to_def_id()));
} }
}
if tcx.is_coroutine(def_id.to_def_id()) {
tcx.ensure().mir_coroutine_witnesses(def_id);
tcx.ensure().check_coroutine_obligations(def_id);
}
})
}); });
tcx.hir().par_body_owners(|def_id| { tcx.ensure().check_unused_traits(());
if tcx.is_coroutine(def_id.to_def_id()) {
tcx.ensure().mir_coroutine_witnesses(def_id);
tcx.ensure().check_coroutine_obligations(def_id);
}
});
sess.time("layout_testing", || layout_test::test_layout(tcx)); sess.time("layout_testing", || layout_test::test_layout(tcx));
sess.time("abi_testing", || abi_test::test_abi(tcx)); sess.time("abi_testing", || abi_test::test_abi(tcx));

View File

@ -1,3 +1,16 @@
error[E0381]: used binding `xs` isn't initialized
--> $DIR/issue-77910-1.rs:3:5
|
LL | let xs;
| -- binding declared here but left uninitialized
LL | xs
| ^^ `xs` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let xs = todo!();
| +++++++++
error[E0369]: binary operation `==` cannot be applied to type `for<'a> fn(&'a i32) -> &'a i32 {foo}` error[E0369]: binary operation `==` cannot be applied to type `for<'a> fn(&'a i32) -> &'a i32 {foo}`
--> $DIR/issue-77910-1.rs:8:5 --> $DIR/issue-77910-1.rs:8:5
| |
@ -22,19 +35,6 @@ LL | assert_eq!(foo, y);
= help: use parentheses to call this function: `foo(/* &i32 */)` = help: use parentheses to call this function: `foo(/* &i32 */)`
= note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0381]: used binding `xs` isn't initialized
--> $DIR/issue-77910-1.rs:3:5
|
LL | let xs;
| -- binding declared here but left uninitialized
LL | xs
| ^^ `xs` used here but it isn't initialized
|
help: consider assigning a value
|
LL | let xs = todo!();
| +++++++++
error: aborting due to 3 previous errors error: aborting due to 3 previous errors
Some errors have detailed explanations: E0277, E0369, E0381. Some errors have detailed explanations: E0277, E0369, E0381.

View File

@ -1,16 +1,3 @@
error[E0369]: binary operation `==` cannot be applied to type `for<'a> fn(&'a i32) -> &'a i32 {foo}`
--> $DIR/issue-77910-2.rs:7:12
|
LL | if foo == y {}
| --- ^^ - _
| |
| for<'a> fn(&'a i32) -> &'a i32 {foo}
|
help: use parentheses to call this function
|
LL | if foo(/* &i32 */) == y {}
| ++++++++++++
error[E0381]: used binding `xs` isn't initialized error[E0381]: used binding `xs` isn't initialized
--> $DIR/issue-77910-2.rs:3:5 --> $DIR/issue-77910-2.rs:3:5
| |
@ -24,6 +11,19 @@ help: consider assigning a value
LL | let xs = todo!(); LL | let xs = todo!();
| +++++++++ | +++++++++
error[E0369]: binary operation `==` cannot be applied to type `for<'a> fn(&'a i32) -> &'a i32 {foo}`
--> $DIR/issue-77910-2.rs:7:12
|
LL | if foo == y {}
| --- ^^ - _
| |
| for<'a> fn(&'a i32) -> &'a i32 {foo}
|
help: use parentheses to call this function
|
LL | if foo(/* &i32 */) == y {}
| ++++++++++++
error: aborting due to 2 previous errors error: aborting due to 2 previous errors
Some errors have detailed explanations: E0369, E0381. Some errors have detailed explanations: E0369, E0381.

View File

@ -13,6 +13,15 @@ help: use `addr_of_mut!` instead to create a raw pointer
LL | c1(addr_of_mut!(Y)); LL | c1(addr_of_mut!(Y));
| ~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~
error[E0594]: cannot assign to `x`, as it is not declared as mutable
--> $DIR/issue-55492-borrowck-migrate-scans-parents.rs:9:46
|
LL | pub fn e(x: &'static mut isize) {
| - help: consider changing this to be mutable: `mut x`
LL | static mut Y: isize = 3;
LL | let mut c1 = |y: &'static mut isize| x = y;
| ^^^^^ cannot assign
warning: creating a mutable reference to mutable static is discouraged warning: creating a mutable reference to mutable static is discouraged
--> $DIR/issue-55492-borrowck-migrate-scans-parents.rs:27:16 --> $DIR/issue-55492-borrowck-migrate-scans-parents.rs:27:16
| |
@ -27,29 +36,6 @@ help: use `addr_of_mut!` instead to create a raw pointer
LL | c1(addr_of_mut!(Z)); LL | c1(addr_of_mut!(Z));
| ~~~~~~~~~~~~~~~ | ~~~~~~~~~~~~~~~
warning: creating a mutable reference to mutable static is discouraged
--> $DIR/issue-55492-borrowck-migrate-scans-parents.rs:64:37
|
LL | borrowck_closures_unique::e(&mut X);
| ^^^^^^ mutable reference to mutable static
|
= note: for more information, see issue #114447 <https://github.com/rust-lang/rust/issues/114447>
= note: this will be a hard error in the 2024 edition
= note: this mutable reference has lifetime `'static`, but if the static gets accessed (read or written) by any other means, or any other reference is created, then any further use of this mutable reference is Undefined Behavior
help: use `addr_of_mut!` instead to create a raw pointer
|
LL | borrowck_closures_unique::e(addr_of_mut!(X));
| ~~~~~~~~~~~~~~~
error[E0594]: cannot assign to `x`, as it is not declared as mutable
--> $DIR/issue-55492-borrowck-migrate-scans-parents.rs:9:46
|
LL | pub fn e(x: &'static mut isize) {
| - help: consider changing this to be mutable: `mut x`
LL | static mut Y: isize = 3;
LL | let mut c1 = |y: &'static mut isize| x = y;
| ^^^^^ cannot assign
error[E0594]: cannot assign to `x`, as it is not declared as mutable error[E0594]: cannot assign to `x`, as it is not declared as mutable
--> $DIR/issue-55492-borrowck-migrate-scans-parents.rs:22:50 --> $DIR/issue-55492-borrowck-migrate-scans-parents.rs:22:50
| |
@ -95,6 +81,20 @@ LL | || {
LL | &mut x.0; LL | &mut x.0;
| ^^^^^^^^ cannot borrow as mutable | ^^^^^^^^ cannot borrow as mutable
warning: creating a mutable reference to mutable static is discouraged
--> $DIR/issue-55492-borrowck-migrate-scans-parents.rs:64:37
|
LL | borrowck_closures_unique::e(&mut X);
| ^^^^^^ mutable reference to mutable static
|
= note: for more information, see issue #114447 <https://github.com/rust-lang/rust/issues/114447>
= note: this will be a hard error in the 2024 edition
= note: this mutable reference has lifetime `'static`, but if the static gets accessed (read or written) by any other means, or any other reference is created, then any further use of this mutable reference is Undefined Behavior
help: use `addr_of_mut!` instead to create a raw pointer
|
LL | borrowck_closures_unique::e(addr_of_mut!(X));
| ~~~~~~~~~~~~~~~
error: aborting due to 6 previous errors; 3 warnings emitted error: aborting due to 6 previous errors; 3 warnings emitted
Some errors have detailed explanations: E0594, E0596. Some errors have detailed explanations: E0594, E0596.

View File

@ -21,6 +21,12 @@ LL | impl<const N: u64> Q for [u8; N] {}
| | | |
| unsatisfied trait bound introduced here | unsatisfied trait bound introduced here
error[E0308]: mismatched types
--> $DIR/type_mismatch.rs:8:31
|
LL | impl<const N: u64> Q for [u8; N] {}
| ^ expected `usize`, found `u64`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/type_mismatch.rs:12:20 --> $DIR/type_mismatch.rs:12:20
| |
@ -29,12 +35,6 @@ LL | pub fn q_user() -> [u8; <[u8; 13] as Q>::ASSOC] {}
| | | |
| implicitly returns `()` as its body has no tail or `return` expression | implicitly returns `()` as its body has no tail or `return` expression
error[E0308]: mismatched types
--> $DIR/type_mismatch.rs:8:31
|
LL | impl<const N: u64> Q for [u8; N] {}
| ^ expected `usize`, found `u64`
error: aborting due to 4 previous errors error: aborting due to 4 previous errors
Some errors have detailed explanations: E0046, E0308. Some errors have detailed explanations: E0046, E0308.

View File

@ -34,14 +34,6 @@ LL + #[derive(ConstParamTy)]
LL | struct Foo(u8); LL | struct Foo(u8);
| |
error: unconstrained generic constant
--> $DIR/unify-op-with-fn-call.rs:30:12
|
LL | bar2::<{ std::ops::Add::add(N, N) }>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: try adding a `where` bound using this expression: `where [(); { std::ops::Add::add(N, N) }]:`
error[E0015]: cannot call non-const operator in constants error[E0015]: cannot call non-const operator in constants
--> $DIR/unify-op-with-fn-call.rs:20:39 --> $DIR/unify-op-with-fn-call.rs:20:39
| |
@ -65,6 +57,14 @@ LL | bar::<{ std::ops::Add::add(N, N) }>();
= note: calls in constants are limited to constant functions, tuple structs and tuple variants = note: calls in constants are limited to constant functions, tuple structs and tuple variants
= help: add `#![feature(effects)]` to the crate attributes to enable = help: add `#![feature(effects)]` to the crate attributes to enable
error: unconstrained generic constant
--> $DIR/unify-op-with-fn-call.rs:30:12
|
LL | bar2::<{ std::ops::Add::add(N, N) }>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: try adding a `where` bound using this expression: `where [(); { std::ops::Add::add(N, N) }]:`
error[E0015]: cannot call non-const fn `<usize as Add>::add` in constants error[E0015]: cannot call non-const fn `<usize as Add>::add` in constants
--> $DIR/unify-op-with-fn-call.rs:30:14 --> $DIR/unify-op-with-fn-call.rs:30:14
| |

View File

@ -16,6 +16,18 @@ LL | std::mem::transmute(v)
= note: source type: `[[u32; H]; W]` (this type does not have a fixed size) = note: source type: `[[u32; H]; W]` (this type does not have a fixed size)
= note: target type: `[[u32; W]; H]` (size can vary because of [u32; W]) = note: target type: `[[u32; W]; H]` (size can vary because of [u32; W])
error[E0308]: mismatched types
--> $DIR/transmute-fail.rs:12:53
|
LL | fn bar<const W: bool, const H: usize>(v: [[u32; H]; W]) -> [[u32; W]; H] {
| ^ expected `usize`, found `bool`
error[E0308]: mismatched types
--> $DIR/transmute-fail.rs:12:67
|
LL | fn bar<const W: bool, const H: usize>(v: [[u32; H]; W]) -> [[u32; W]; H] {
| ^ expected `usize`, found `bool`
error[E0512]: cannot transmute between types of different sizes, or dependently-sized types error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
--> $DIR/transmute-fail.rs:23:5 --> $DIR/transmute-fail.rs:23:5
| |
@ -34,18 +46,6 @@ LL | std::mem::transmute(v)
= note: source type: `[[[u32; 8888888]; 9999999]; 777777777]` (values of the type `[[u32; 8888888]; 9999999]` are too big for the current architecture) = note: source type: `[[[u32; 8888888]; 9999999]; 777777777]` (values of the type `[[u32; 8888888]; 9999999]` are too big for the current architecture)
= note: target type: `[[[u32; 9999999]; 777777777]; 8888888]` (values of the type `[[u32; 9999999]; 777777777]` are too big for the current architecture) = note: target type: `[[[u32; 9999999]; 777777777]; 8888888]` (values of the type `[[u32; 9999999]; 777777777]` are too big for the current architecture)
error[E0308]: mismatched types
--> $DIR/transmute-fail.rs:12:53
|
LL | fn bar<const W: bool, const H: usize>(v: [[u32; H]; W]) -> [[u32; W]; H] {
| ^ expected `usize`, found `bool`
error[E0308]: mismatched types
--> $DIR/transmute-fail.rs:12:67
|
LL | fn bar<const W: bool, const H: usize>(v: [[u32; H]; W]) -> [[u32; W]; H] {
| ^ expected `usize`, found `bool`
error: aborting due to 6 previous errors error: aborting due to 6 previous errors
Some errors have detailed explanations: E0308, E0512. Some errors have detailed explanations: E0308, E0512.

View File

@ -10,6 +10,12 @@ note: required by a bound in `bar`
LL | fn bar<const N: u8>() -> [u8; N] {} LL | fn bar<const N: u8>() -> [u8; N] {}
| ^^^^^^^^^^^ required by this bound in `bar` | ^^^^^^^^^^^ required by this bound in `bar`
error[E0308]: mismatched types
--> $DIR/type_mismatch.rs:2:11
|
LL | bar::<N>()
| ^ expected `u8`, found `usize`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/type_mismatch.rs:6:26 --> $DIR/type_mismatch.rs:6:26
| |
@ -18,12 +24,6 @@ LL | fn bar<const N: u8>() -> [u8; N] {}
| | | |
| implicitly returns `()` as its body has no tail or `return` expression | implicitly returns `()` as its body has no tail or `return` expression
error[E0308]: mismatched types
--> $DIR/type_mismatch.rs:2:11
|
LL | bar::<N>()
| ^ expected `u8`, found `usize`
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/type_mismatch.rs:6:31 --> $DIR/type_mismatch.rs:6:31
| |

View File

@ -16,12 +16,6 @@ LL | become _g1();
= note: expected unit type `()` = note: expected unit type `()`
found type `!` found type `!`
error[E0308]: mismatched types
--> $DIR/return-mismatches.rs:21:5
|
LL | become _g2();
| ^^^^^^^^^^^^ expected `u32`, found `u16`
warning: function cannot return without recursing warning: function cannot return without recursing
--> $DIR/return-mismatches.rs:16:1 --> $DIR/return-mismatches.rs:16:1
| |
@ -33,6 +27,12 @@ LL | become _g1();
= help: a `loop` may express intention better if this is on purpose = help: a `loop` may express intention better if this is on purpose
= note: `#[warn(unconditional_recursion)]` on by default = note: `#[warn(unconditional_recursion)]` on by default
error[E0308]: mismatched types
--> $DIR/return-mismatches.rs:21:5
|
LL | become _g2();
| ^^^^^^^^^^^^ expected `u32`, found `u16`
error: aborting due to 3 previous errors; 1 warning emitted error: aborting due to 3 previous errors; 1 warning emitted
For more information about this error, try `rustc --explain E0308`. For more information about this error, try `rustc --explain E0308`.

View File

@ -1,3 +1,12 @@
error[E0515]: cannot return reference to temporary value
--> $DIR/if-no-match-bindings.rs:8:38
|
LL | fn b_mut_ref<'a>() -> &'a mut bool { &mut true }
| ^^^^^----
| | |
| | temporary value created here
| returns a reference to data owned by the current function
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/if-no-match-bindings.rs:19:8 --> $DIR/if-no-match-bindings.rs:19:8
| |
@ -90,15 +99,6 @@ LL - while &mut true {}
LL + while true {} LL + while true {}
| |
error[E0515]: cannot return reference to temporary value
--> $DIR/if-no-match-bindings.rs:8:38
|
LL | fn b_mut_ref<'a>() -> &'a mut bool { &mut true }
| ^^^^^----
| | |
| | temporary value created here
| returns a reference to data owned by the current function
error: aborting due to 9 previous errors error: aborting due to 9 previous errors
Some errors have detailed explanations: E0308, E0515. Some errors have detailed explanations: E0308, E0515.

View File

@ -1,3 +1,19 @@
error[E0597]: `a` does not live long enough
--> $DIR/issue-74684-2.rs:13:25
|
LL | fn bug<'a, T: ?Sized + Fun<F<'a> = [u8]>>(t: Box<T>) -> &'static T::F<'a> {
| -- lifetime `'a` defined here
LL | let a = [0; 1];
| - binding `a` declared here
LL | let x = T::identity(&a);
| ------------^^-
| | |
| | borrowed value does not live long enough
| argument requires that `a` is borrowed for `'a`
LL | todo!()
LL | }
| - `a` dropped here while still borrowed
error[E0271]: type mismatch resolving `<{integer} as Fun>::F<'_> == [u8]` error[E0271]: type mismatch resolving `<{integer} as Fun>::F<'_> == [u8]`
--> $DIR/issue-74684-2.rs:21:9 --> $DIR/issue-74684-2.rs:21:9
| |
@ -17,22 +33,6 @@ note: required by a bound in `bug`
LL | fn bug<'a, T: ?Sized + Fun<F<'a> = [u8]>>(t: Box<T>) -> &'static T::F<'a> { LL | fn bug<'a, T: ?Sized + Fun<F<'a> = [u8]>>(t: Box<T>) -> &'static T::F<'a> {
| ^^^^^^^^^^^^ required by this bound in `bug` | ^^^^^^^^^^^^ required by this bound in `bug`
error[E0597]: `a` does not live long enough
--> $DIR/issue-74684-2.rs:13:25
|
LL | fn bug<'a, T: ?Sized + Fun<F<'a> = [u8]>>(t: Box<T>) -> &'static T::F<'a> {
| -- lifetime `'a` defined here
LL | let a = [0; 1];
| - binding `a` declared here
LL | let x = T::identity(&a);
| ------------^^-
| | |
| | borrowed value does not live long enough
| argument requires that `a` is borrowed for `'a`
LL | todo!()
LL | }
| - `a` dropped here while still borrowed
error: aborting due to 2 previous errors error: aborting due to 2 previous errors
Some errors have detailed explanations: E0271, E0597. Some errors have detailed explanations: E0271, E0597.

View File

@ -18,6 +18,19 @@ help: consider further restricting this bound
LL | where F : Foo<'x> + for<'tcx> Foo<'tcx> LL | where F : Foo<'x> + for<'tcx> Foo<'tcx>
| +++++++++++++++++++++ | +++++++++++++++++++++
warning: function cannot return without recursing
--> $DIR/hrtb-higher-ranker-supertraits.rs:21:1
|
LL | / fn want_foo_for_any_tcx<F>(f: &F)
LL | | where F : for<'tcx> Foo<'tcx>
| |_________________________________^ cannot return without recursing
...
LL | want_foo_for_any_tcx(f);
| ----------------------- recursive call site
|
= help: a `loop` may express intention better if this is on purpose
= note: `#[warn(unconditional_recursion)]` on by default
error[E0277]: the trait bound `for<'ccx> B: Bar<'ccx>` is not satisfied error[E0277]: the trait bound `for<'ccx> B: Bar<'ccx>` is not satisfied
--> $DIR/hrtb-higher-ranker-supertraits.rs:35:26 --> $DIR/hrtb-higher-ranker-supertraits.rs:35:26
| |
@ -38,19 +51,6 @@ help: consider further restricting this bound
LL | where B : Bar<'x> + for<'ccx> Bar<'ccx> LL | where B : Bar<'x> + for<'ccx> Bar<'ccx>
| +++++++++++++++++++++ | +++++++++++++++++++++
warning: function cannot return without recursing
--> $DIR/hrtb-higher-ranker-supertraits.rs:21:1
|
LL | / fn want_foo_for_any_tcx<F>(f: &F)
LL | | where F : for<'tcx> Foo<'tcx>
| |_________________________________^ cannot return without recursing
...
LL | want_foo_for_any_tcx(f);
| ----------------------- recursive call site
|
= help: a `loop` may express intention better if this is on purpose
= note: `#[warn(unconditional_recursion)]` on by default
warning: function cannot return without recursing warning: function cannot return without recursing
--> $DIR/hrtb-higher-ranker-supertraits.rs:38:1 --> $DIR/hrtb-higher-ranker-supertraits.rs:38:1
| |

View File

@ -1,3 +1,12 @@
error[E0515]: cannot return value referencing local variable `r`
--> $DIR/issue-11374.rs:20:5
|
LL | Container::wrap(&mut r as &mut dyn io::Read)
| ^^^^^^^^^^^^^^^^------^^^^^^^^^^^^^^^^^^^^^^
| | |
| | `r` is borrowed here
| returns a value referencing data owned by the current function
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/issue-11374.rs:27:15 --> $DIR/issue-11374.rs:27:15
| |
@ -18,15 +27,6 @@ help: consider mutably borrowing here
LL | c.read_to(&mut v); LL | c.read_to(&mut v);
| ++++ | ++++
error[E0515]: cannot return value referencing local variable `r`
--> $DIR/issue-11374.rs:20:5
|
LL | Container::wrap(&mut r as &mut dyn io::Read)
| ^^^^^^^^^^^^^^^^------^^^^^^^^^^^^^^^^^^^^^^
| | |
| | `r` is borrowed here
| returns a value referencing data owned by the current function
error: aborting due to 2 previous errors error: aborting due to 2 previous errors
Some errors have detailed explanations: E0308, E0515. Some errors have detailed explanations: E0308, E0515.

View File

@ -74,6 +74,15 @@ help: consider restricting type parameter `T`
LL | fn g<T: std::marker::Copy>(val: T) { LL | fn g<T: std::marker::Copy>(val: T) {
| +++++++++++++++++++ | +++++++++++++++++++
error: lifetime may not live long enough
--> $DIR/kindck-impl-type-params.rs:30:13
|
LL | fn foo<'a>() {
| -- lifetime `'a` defined here
LL | let t: S<&'a isize> = S(marker::PhantomData);
LL | let a = &t as &dyn Gettable<&'a isize>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static`
error[E0277]: the trait bound `String: Copy` is not satisfied error[E0277]: the trait bound `String: Copy` is not satisfied
--> $DIR/kindck-impl-type-params.rs:36:13 --> $DIR/kindck-impl-type-params.rs:36:13
| |
@ -111,15 +120,6 @@ LL + #[derive(Copy)]
LL | struct Foo; // does not impl Copy LL | struct Foo; // does not impl Copy
| |
error: lifetime may not live long enough
--> $DIR/kindck-impl-type-params.rs:30:13
|
LL | fn foo<'a>() {
| -- lifetime `'a` defined here
LL | let t: S<&'a isize> = S(marker::PhantomData);
LL | let a = &t as &dyn Gettable<&'a isize>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type annotation requires that `'a` must outlive `'static`
error: aborting due to 7 previous errors error: aborting due to 7 previous errors
For more information about this error, try `rustc --explain E0277`. For more information about this error, try `rustc --explain E0277`.

View File

@ -12,6 +12,14 @@ note: required by a bound in `assert_send`
LL | fn assert_send<T:Send+'static>() { } LL | fn assert_send<T:Send+'static>() { }
| ^^^^ required by this bound in `assert_send` | ^^^^ required by this bound in `assert_send`
error: lifetime may not live long enough
--> $DIR/kindck-send-object1.rs:14:5
|
LL | fn test52<'a>() {
| -- lifetime `'a` defined here
LL | assert_send::<&'a (dyn Dummy + Sync)>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static`
error[E0277]: `(dyn Dummy + 'a)` cannot be sent between threads safely error[E0277]: `(dyn Dummy + 'a)` cannot be sent between threads safely
--> $DIR/kindck-send-object1.rs:29:19 --> $DIR/kindck-send-object1.rs:29:19
| |
@ -28,14 +36,6 @@ note: required by a bound in `assert_send`
LL | fn assert_send<T:Send+'static>() { } LL | fn assert_send<T:Send+'static>() { }
| ^^^^ required by this bound in `assert_send` | ^^^^ required by this bound in `assert_send`
error: lifetime may not live long enough
--> $DIR/kindck-send-object1.rs:14:5
|
LL | fn test52<'a>() {
| -- lifetime `'a` defined here
LL | assert_send::<&'a (dyn Dummy + Sync)>();
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static`
error: aborting due to 3 previous errors error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0277`. For more information about this error, try `rustc --explain E0277`.

View File

@ -1,3 +1,19 @@
error: lifetime may not live long enough
--> $DIR/issue-17728.rs:15:28
|
LL | fn attemptTraverse(&self, room: &Room, directionStr: &str) -> Result<&Room, &str> {
| - - let's call the lifetime of this reference `'1`
| |
| let's call the lifetime of this reference `'2`
...
LL | Some(entry) => Ok(entry),
| ^^^^^^^^^ method was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter
|
LL | fn attemptTraverse<'a>(&'a self, room: &'a Room, directionStr: &str) -> Result<&Room, &str> {
| ++++ ++ ++
error[E0308]: `match` arms have incompatible types error[E0308]: `match` arms have incompatible types
--> $DIR/issue-17728.rs:108:14 --> $DIR/issue-17728.rs:108:14
| |
@ -16,22 +32,6 @@ LL | | }
= note: expected enum `RoomDirection` = note: expected enum `RoomDirection`
found enum `Option<_>` found enum `Option<_>`
error: lifetime may not live long enough
--> $DIR/issue-17728.rs:15:28
|
LL | fn attemptTraverse(&self, room: &Room, directionStr: &str) -> Result<&Room, &str> {
| - - let's call the lifetime of this reference `'1`
| |
| let's call the lifetime of this reference `'2`
...
LL | Some(entry) => Ok(entry),
| ^^^^^^^^^ method was supposed to return data with lifetime `'2` but it is returning data with lifetime `'1`
|
help: consider introducing a named lifetime parameter
|
LL | fn attemptTraverse<'a>(&'a self, room: &'a Room, directionStr: &str) -> Result<&Room, &str> {
| ++++ ++ ++
error: aborting due to 2 previous errors error: aborting due to 2 previous errors
For more information about this error, try `rustc --explain E0308`. For more information about this error, try `rustc --explain E0308`.

View File

@ -40,12 +40,6 @@ LL | b += 1;
= help: maybe it is overwritten before being read? = help: maybe it is overwritten before being read?
= note: `#[warn(unused_assignments)]` implied by `#[warn(unused)]` = note: `#[warn(unused_assignments)]` implied by `#[warn(unused)]`
warning: unused variable: `z`
--> $DIR/liveness-consts.rs:60:13
|
LL | let z = 42;
| ^ help: if this is intentional, prefix it with an underscore: `_z`
warning: value assigned to `t` is never read warning: value assigned to `t` is never read
--> $DIR/liveness-consts.rs:42:9 --> $DIR/liveness-consts.rs:42:9
| |
@ -60,5 +54,11 @@ warning: unused variable: `w`
LL | let w = 10; LL | let w = 10;
| ^ help: if this is intentional, prefix it with an underscore: `_w` | ^ help: if this is intentional, prefix it with an underscore: `_w`
warning: unused variable: `z`
--> $DIR/liveness-consts.rs:60:13
|
LL | let z = 42;
| ^ help: if this is intentional, prefix it with an underscore: `_z`
warning: 8 warnings emitted warning: 8 warnings emitted

View File

@ -1,3 +1,14 @@
warning: function cannot return without recursing
--> $DIR/liveness-forgot-ret.rs:1:1
|
LL | fn god_exists(a: isize) -> bool { return god_exists(a); }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ------------- recursive call site
| |
| cannot return without recursing
|
= help: a `loop` may express intention better if this is on purpose
= note: `#[warn(unconditional_recursion)]` on by default
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/liveness-forgot-ret.rs:4:19 --> $DIR/liveness-forgot-ret.rs:4:19
| |
@ -11,17 +22,6 @@ help: consider returning the local binding `a`
LL | fn f(a: isize) -> isize { if god_exists(a) { return 5; }; a } LL | fn f(a: isize) -> isize { if god_exists(a) { return 5; }; a }
| + | +
warning: function cannot return without recursing
--> $DIR/liveness-forgot-ret.rs:1:1
|
LL | fn god_exists(a: isize) -> bool { return god_exists(a); }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ------------- recursive call site
| |
| cannot return without recursing
|
= help: a `loop` may express intention better if this is on purpose
= note: `#[warn(unconditional_recursion)]` on by default
error: aborting due to 1 previous error; 1 warning emitted error: aborting due to 1 previous error; 1 warning emitted
For more information about this error, try `rustc --explain E0308`. For more information about this error, try `rustc --explain E0308`.

View File

@ -1,18 +1,3 @@
warning: unreachable statement
--> $DIR/liveness-unused.rs:92:9
|
LL | continue;
| -------- any code following this expression is unreachable
LL | drop(*x as i32);
| ^^^^^^^^^^^^^^^^ unreachable statement
|
note: the lint level is defined here
--> $DIR/liveness-unused.rs:1:9
|
LL | #![warn(unused)]
| ^^^^^^
= note: `#[warn(unreachable_code)]` implied by `#[warn(unused)]`
error: unused variable: `x` error: unused variable: `x`
--> $DIR/liveness-unused.rs:8:7 --> $DIR/liveness-unused.rs:8:7
| |
@ -90,6 +75,21 @@ error: unused variable: `x`
LL | for (x, _) in [1, 2, 3].iter().enumerate() { } LL | for (x, _) in [1, 2, 3].iter().enumerate() { }
| ^ help: if this is intentional, prefix it with an underscore: `_x` | ^ help: if this is intentional, prefix it with an underscore: `_x`
warning: unreachable statement
--> $DIR/liveness-unused.rs:92:9
|
LL | continue;
| -------- any code following this expression is unreachable
LL | drop(*x as i32);
| ^^^^^^^^^^^^^^^^ unreachable statement
|
note: the lint level is defined here
--> $DIR/liveness-unused.rs:1:9
|
LL | #![warn(unused)]
| ^^^^^^
= note: `#[warn(unreachable_code)]` implied by `#[warn(unused)]`
error: unused variable: `x` error: unused variable: `x`
--> $DIR/liveness-unused.rs:89:13 --> $DIR/liveness-unused.rs:89:13
| |

View File

@ -1,14 +1,3 @@
error[E0308]: mismatched types
--> $DIR/region-lifetime-bounds-on-fns-where-clause.rs:20:43
|
LL | let _: fn(&mut &isize, &mut &isize) = a;
| ---------------------------- ^ one type is more general than the other
| |
| expected due to this
|
= note: expected fn pointer `for<'a, 'b, 'c, 'd> fn(&'a mut &'b _, &'c mut &'d _)`
found fn item `for<'a, 'b> fn(&'a mut &_, &'b mut &_) {a::<'_, '_>}`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/region-lifetime-bounds-on-fns-where-clause.rs:8:5 --> $DIR/region-lifetime-bounds-on-fns-where-clause.rs:8:5
| |
@ -38,6 +27,17 @@ LL | a(x, y);
= note: mutable references are invariant over their type parameter = note: mutable references are invariant over their type parameter
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error[E0308]: mismatched types
--> $DIR/region-lifetime-bounds-on-fns-where-clause.rs:20:43
|
LL | let _: fn(&mut &isize, &mut &isize) = a;
| ---------------------------- ^ one type is more general than the other
| |
| expected due to this
|
= note: expected fn pointer `for<'a, 'b, 'c, 'd> fn(&'a mut &'b _, &'c mut &'d _)`
found fn item `for<'a, 'b> fn(&'a mut &_, &'b mut &_) {a::<'_, '_>}`
error: aborting due to 3 previous errors error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0308`. For more information about this error, try `rustc --explain E0308`.

View File

@ -1,14 +1,3 @@
error[E0308]: mismatched types
--> $DIR/region-multiple-lifetime-bounds-on-fns-where-clause.rs:22:56
|
LL | let _: fn(&mut &isize, &mut &isize, &mut &isize) = a;
| ----------------------------------------- ^ one type is more general than the other
| |
| expected due to this
|
= note: expected fn pointer `for<'a, 'b, 'c, 'd, 'e, 'f> fn(&'a mut &'b _, &'c mut &'d _, &'e mut &'f _)`
found fn item `for<'a, 'b, 'c> fn(&'a mut &_, &'b mut &_, &'c mut &_) {a::<'_, '_, '_>}`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/region-multiple-lifetime-bounds-on-fns-where-clause.rs:9:5 --> $DIR/region-multiple-lifetime-bounds-on-fns-where-clause.rs:9:5
| |
@ -38,6 +27,17 @@ LL | a(x, y, z);
= note: mutable references are invariant over their type parameter = note: mutable references are invariant over their type parameter
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error[E0308]: mismatched types
--> $DIR/region-multiple-lifetime-bounds-on-fns-where-clause.rs:22:56
|
LL | let _: fn(&mut &isize, &mut &isize, &mut &isize) = a;
| ----------------------------------------- ^ one type is more general than the other
| |
| expected due to this
|
= note: expected fn pointer `for<'a, 'b, 'c, 'd, 'e, 'f> fn(&'a mut &'b _, &'c mut &'d _, &'e mut &'f _)`
found fn item `for<'a, 'b, 'c> fn(&'a mut &_, &'b mut &_, &'c mut &_) {a::<'_, '_, '_>}`
error: aborting due to 3 previous errors error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0308`. For more information about this error, try `rustc --explain E0308`.

View File

@ -1,14 +1,3 @@
error[E0308]: mismatched types
--> $DIR/regions-lifetime-bounds-on-fns.rs:20:43
|
LL | let _: fn(&mut &isize, &mut &isize) = a;
| ---------------------------- ^ one type is more general than the other
| |
| expected due to this
|
= note: expected fn pointer `for<'a, 'b, 'c, 'd> fn(&'a mut &'b _, &'c mut &'d _)`
found fn item `for<'a, 'b> fn(&'a mut &_, &'b mut &_) {a::<'_, '_>}`
error: lifetime may not live long enough error: lifetime may not live long enough
--> $DIR/regions-lifetime-bounds-on-fns.rs:8:5 --> $DIR/regions-lifetime-bounds-on-fns.rs:8:5
| |
@ -38,6 +27,17 @@ LL | a(x, y);
= note: mutable references are invariant over their type parameter = note: mutable references are invariant over their type parameter
= help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance = help: see <https://doc.rust-lang.org/nomicon/subtyping.html> for more information about variance
error[E0308]: mismatched types
--> $DIR/regions-lifetime-bounds-on-fns.rs:20:43
|
LL | let _: fn(&mut &isize, &mut &isize) = a;
| ---------------------------- ^ one type is more general than the other
| |
| expected due to this
|
= note: expected fn pointer `for<'a, 'b, 'c, 'd> fn(&'a mut &'b _, &'c mut &'d _)`
found fn item `for<'a, 'b> fn(&'a mut &_, &'b mut &_) {a::<'_, '_>}`
error: aborting due to 3 previous errors error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0308`. For more information about this error, try `rustc --explain E0308`.

View File

@ -1,3 +1,19 @@
error[E0507]: cannot move out of an `Arc`
--> $DIR/issue-102892.rs:11:18
|
LL | let (a, b) = **arc; // suggests putting `&**arc` here; with that, fixed!
| - - ^^^^^
| | |
| | ...and here
| data moved here
|
= note: move occurs because these variables have types that don't implement the `Copy` trait
help: consider removing the dereference here
|
LL - let (a, b) = **arc; // suggests putting `&**arc` here; with that, fixed!
LL + let (a, b) = *arc; // suggests putting `&**arc` here; with that, fixed!
|
error[E0308]: mismatched types error[E0308]: mismatched types
--> $DIR/issue-102892.rs:16:26 --> $DIR/issue-102892.rs:16:26
| |
@ -52,22 +68,6 @@ help: alternatively, consider changing the type annotation
LL | let (a, b): ((A, B), &A) = (&mut *mutation, &(**arc).0); // suggests putting `&**arc` here too LL | let (a, b): ((A, B), &A) = (&mut *mutation, &(**arc).0); // suggests putting `&**arc` here too
| + | +
error[E0507]: cannot move out of an `Arc`
--> $DIR/issue-102892.rs:11:18
|
LL | let (a, b) = **arc; // suggests putting `&**arc` here; with that, fixed!
| - - ^^^^^
| | |
| | ...and here
| data moved here
|
= note: move occurs because these variables have types that don't implement the `Copy` trait
help: consider removing the dereference here
|
LL - let (a, b) = **arc; // suggests putting `&**arc` here; with that, fixed!
LL + let (a, b) = *arc; // suggests putting `&**arc` here; with that, fixed!
|
error: aborting due to 4 previous errors error: aborting due to 4 previous errors
Some errors have detailed explanations: E0308, E0507. Some errors have detailed explanations: E0308, E0507.

View File

@ -1,3 +1,69 @@
error: [*, o]
--> $DIR/variance.rs:8:29
|
LL | type NotCapturedEarly<'a> = impl Sized;
| ^^^^^^^^^^
error: [*, o]
--> $DIR/variance.rs:11:26
|
LL | type CapturedEarly<'a> = impl Sized + Captures<'a>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, o, o]
--> $DIR/variance.rs:14:56
|
LL | type NotCapturedLate<'a> = dyn for<'b> Iterator<Item = impl Sized>;
| ^^^^^^^^^^
error: [*, o, o]
--> $DIR/variance.rs:18:49
|
LL | type Captured<'a> = dyn for<'b> Iterator<Item = impl Sized + Captures<'a>>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, *, o, o, o]
--> $DIR/variance.rs:22:27
|
LL | type Bar<'a, 'b: 'b, T> = impl Sized;
| ^^^^^^^^^^
error: [*, *, o, o]
--> $DIR/variance.rs:34:32
|
LL | type ImplicitCapture<'a> = impl Sized;
| ^^^^^^^^^^
error: [*, *, o, o]
--> $DIR/variance.rs:37:42
|
LL | type ExplicitCaptureFromHeader<'a> = impl Sized + Captures<'i>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, *, o, o]
--> $DIR/variance.rs:40:39
|
LL | type ExplicitCaptureFromGat<'a> = impl Sized + Captures<'a>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, *, o, o]
--> $DIR/variance.rs:45:32
|
LL | type ImplicitCapture<'a> = impl Sized;
| ^^^^^^^^^^
error: [*, *, o, o]
--> $DIR/variance.rs:48:42
|
LL | type ExplicitCaptureFromHeader<'a> = impl Sized + Captures<'i>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, *, o, o]
--> $DIR/variance.rs:51:39
|
LL | type ExplicitCaptureFromGat<'a> = impl Sized + Captures<'a>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0657]: `impl Trait` cannot capture higher-ranked lifetime from `dyn` type error[E0657]: `impl Trait` cannot capture higher-ranked lifetime from `dyn` type
--> $DIR/variance.rs:14:56 --> $DIR/variance.rs:14:56
| |
@ -110,72 +176,6 @@ LL | type ExplicitCaptureFromGat<'a> = impl Sized + Captures<'a>;
| |
= note: `ExplicitCaptureFromGat` must be used in combination with a concrete type within the same impl = note: `ExplicitCaptureFromGat` must be used in combination with a concrete type within the same impl
error: [*, o]
--> $DIR/variance.rs:8:29
|
LL | type NotCapturedEarly<'a> = impl Sized;
| ^^^^^^^^^^
error: [*, o]
--> $DIR/variance.rs:11:26
|
LL | type CapturedEarly<'a> = impl Sized + Captures<'a>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, o, o]
--> $DIR/variance.rs:14:56
|
LL | type NotCapturedLate<'a> = dyn for<'b> Iterator<Item = impl Sized>;
| ^^^^^^^^^^
error: [*, o, o]
--> $DIR/variance.rs:18:49
|
LL | type Captured<'a> = dyn for<'b> Iterator<Item = impl Sized + Captures<'a>>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, *, o, o, o]
--> $DIR/variance.rs:22:27
|
LL | type Bar<'a, 'b: 'b, T> = impl Sized;
| ^^^^^^^^^^
error: [*, *, o, o]
--> $DIR/variance.rs:34:32
|
LL | type ImplicitCapture<'a> = impl Sized;
| ^^^^^^^^^^
error: [*, *, o, o]
--> $DIR/variance.rs:37:42
|
LL | type ExplicitCaptureFromHeader<'a> = impl Sized + Captures<'i>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, *, o, o]
--> $DIR/variance.rs:40:39
|
LL | type ExplicitCaptureFromGat<'a> = impl Sized + Captures<'a>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, *, o, o]
--> $DIR/variance.rs:45:32
|
LL | type ImplicitCapture<'a> = impl Sized;
| ^^^^^^^^^^
error: [*, *, o, o]
--> $DIR/variance.rs:48:42
|
LL | type ExplicitCaptureFromHeader<'a> = impl Sized + Captures<'i>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, *, o, o]
--> $DIR/variance.rs:51:39
|
LL | type ExplicitCaptureFromGat<'a> = impl Sized + Captures<'a>;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 24 previous errors error: aborting due to 24 previous errors
For more information about this error, try `rustc --explain E0657`. For more information about this error, try `rustc --explain E0657`.

View File

@ -1,3 +1,9 @@
error: [o]
--> $DIR/variance-associated-consts.rs:13:1
|
LL | struct Foo<T: Trait> {
| ^^^^^^^^^^^^^^^^^^^^
error: unconstrained generic constant error: unconstrained generic constant
--> $DIR/variance-associated-consts.rs:14:12 --> $DIR/variance-associated-consts.rs:14:12
| |
@ -6,11 +12,5 @@ LL | field: [u8; <T as Trait>::Const]
| |
= help: try adding a `where` bound using this expression: `where [(); <T as Trait>::Const]:` = help: try adding a `where` bound using this expression: `where [(); <T as Trait>::Const]:`
error: [o]
--> $DIR/variance-associated-consts.rs:13:1
|
LL | struct Foo<T: Trait> {
| ^^^^^^^^^^^^^^^^^^^^
error: aborting due to 2 previous errors error: aborting due to 2 previous errors

View File

@ -1,11 +1,3 @@
error[E0392]: lifetime parameter `'a` is never used
--> $DIR/variance-regions-direct.rs:52:14
|
LL | struct Test7<'a> {
| ^^ unused lifetime parameter
|
= help: consider removing `'a`, referring to it in a field, or using a marker such as `PhantomData`
error: [+, +, +] error: [+, +, +]
--> $DIR/variance-regions-direct.rs:9:1 --> $DIR/variance-regions-direct.rs:9:1
| |
@ -48,6 +40,14 @@ error: [-, +, o]
LL | enum Test8<'a, 'b, 'c:'b> { LL | enum Test8<'a, 'b, 'c:'b> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0392]: lifetime parameter `'a` is never used
--> $DIR/variance-regions-direct.rs:52:14
|
LL | struct Test7<'a> {
| ^^ unused lifetime parameter
|
= help: consider removing `'a`, referring to it in a field, or using a marker such as `PhantomData`
error: aborting due to 8 previous errors error: aborting due to 8 previous errors
For more information about this error, try `rustc --explain E0392`. For more information about this error, try `rustc --explain E0392`.

View File

@ -1,3 +1,33 @@
error: [-, +, o, *]
--> $DIR/variance-regions-indirect.rs:8:1
|
LL | enum Base<'a, 'b, 'c:'b, 'd> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, o, +, -]
--> $DIR/variance-regions-indirect.rs:16:1
|
LL | struct Derived1<'w, 'x:'y, 'y, 'z> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: [o, o, *]
--> $DIR/variance-regions-indirect.rs:22:1
|
LL | struct Derived2<'a, 'b:'a, 'c> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: [o, +, *]
--> $DIR/variance-regions-indirect.rs:28:1
|
LL | struct Derived3<'a:'b, 'b, 'c> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: [-, +, o]
--> $DIR/variance-regions-indirect.rs:34:1
|
LL | struct Derived4<'a, 'b, 'c:'b> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0392]: lifetime parameter `'d` is never used error[E0392]: lifetime parameter `'d` is never used
--> $DIR/variance-regions-indirect.rs:8:26 --> $DIR/variance-regions-indirect.rs:8:26
| |
@ -30,36 +60,6 @@ LL | struct Derived3<'a:'b, 'b, 'c> {
| |
= help: consider removing `'c`, referring to it in a field, or using a marker such as `PhantomData` = help: consider removing `'c`, referring to it in a field, or using a marker such as `PhantomData`
error: [-, +, o, *]
--> $DIR/variance-regions-indirect.rs:8:1
|
LL | enum Base<'a, 'b, 'c:'b, 'd> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, o, +, -]
--> $DIR/variance-regions-indirect.rs:16:1
|
LL | struct Derived1<'w, 'x:'y, 'y, 'z> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: [o, o, *]
--> $DIR/variance-regions-indirect.rs:22:1
|
LL | struct Derived2<'a, 'b:'a, 'c> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: [o, +, *]
--> $DIR/variance-regions-indirect.rs:28:1
|
LL | struct Derived3<'a:'b, 'b, 'c> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: [-, +, o]
--> $DIR/variance-regions-indirect.rs:34:1
|
LL | struct Derived4<'a, 'b, 'c:'b> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 9 previous errors error: aborting due to 9 previous errors
For more information about this error, try `rustc --explain E0392`. For more information about this error, try `rustc --explain E0392`.

View File

@ -1,3 +1,27 @@
error: [+, +]
--> $DIR/variance-trait-bounds.rs:16:1
|
LL | struct TestStruct<U,T:Setter<U>> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, +]
--> $DIR/variance-trait-bounds.rs:21:1
|
LL | enum TestEnum<U,T:Setter<U>> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, +]
--> $DIR/variance-trait-bounds.rs:27:1
|
LL | struct TestContraStruct<U,T:Setter<U>> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, +]
--> $DIR/variance-trait-bounds.rs:33:1
|
LL | struct TestBox<U,T:Getter<U>+Setter<U>> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error[E0392]: type parameter `U` is never used error[E0392]: type parameter `U` is never used
--> $DIR/variance-trait-bounds.rs:21:15 --> $DIR/variance-trait-bounds.rs:21:15
| |
@ -25,30 +49,6 @@ LL | struct TestBox<U,T:Getter<U>+Setter<U>> {
= help: consider removing `U`, referring to it in a field, or using a marker such as `PhantomData` = help: consider removing `U`, referring to it in a field, or using a marker such as `PhantomData`
= help: if you intended `U` to be a const parameter, use `const U: /* Type */` instead = help: if you intended `U` to be a const parameter, use `const U: /* Type */` instead
error: [+, +]
--> $DIR/variance-trait-bounds.rs:16:1
|
LL | struct TestStruct<U,T:Setter<U>> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, +]
--> $DIR/variance-trait-bounds.rs:21:1
|
LL | enum TestEnum<U,T:Setter<U>> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, +]
--> $DIR/variance-trait-bounds.rs:27:1
|
LL | struct TestContraStruct<U,T:Setter<U>> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: [*, +]
--> $DIR/variance-trait-bounds.rs:33:1
|
LL | struct TestBox<U,T:Getter<U>+Setter<U>> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 7 previous errors error: aborting due to 7 previous errors
For more information about this error, try `rustc --explain E0392`. For more information about this error, try `rustc --explain E0392`.