mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Rollup merge of #98415 - compiler-errors:rustc-borrowck-session-diagnostic-1, r=davidtwco
Migrate some `rustc_borrowck` diagnostics to `SessionDiagnostic` Self-explanatory r? ```@davidtwco```
This commit is contained in:
commit
d10497bba2
@ -3595,6 +3595,7 @@ dependencies = [
|
|||||||
"rustc_index",
|
"rustc_index",
|
||||||
"rustc_infer",
|
"rustc_infer",
|
||||||
"rustc_lexer",
|
"rustc_lexer",
|
||||||
|
"rustc_macros",
|
||||||
"rustc_middle",
|
"rustc_middle",
|
||||||
"rustc_mir_dataflow",
|
"rustc_mir_dataflow",
|
||||||
"rustc_serialize",
|
"rustc_serialize",
|
||||||
|
@ -19,6 +19,7 @@ rustc_hir = { path = "../rustc_hir" }
|
|||||||
rustc_index = { path = "../rustc_index" }
|
rustc_index = { path = "../rustc_index" }
|
||||||
rustc_infer = { path = "../rustc_infer" }
|
rustc_infer = { path = "../rustc_infer" }
|
||||||
rustc_lexer = { path = "../rustc_lexer" }
|
rustc_lexer = { path = "../rustc_lexer" }
|
||||||
|
rustc_macros = { path = "../rustc_macros" }
|
||||||
rustc_middle = { path = "../rustc_middle" }
|
rustc_middle = { path = "../rustc_middle" }
|
||||||
rustc_const_eval = { path = "../rustc_const_eval" }
|
rustc_const_eval = { path = "../rustc_const_eval" }
|
||||||
rustc_mir_dataflow = { path = "../rustc_mir_dataflow" }
|
rustc_mir_dataflow = { path = "../rustc_mir_dataflow" }
|
||||||
|
@ -19,6 +19,9 @@ use std::fmt;
|
|||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
use crate::region_infer::values::RegionElement;
|
use crate::region_infer::values::RegionElement;
|
||||||
|
use crate::session_diagnostics::HigherRankedErrorCause;
|
||||||
|
use crate::session_diagnostics::HigherRankedLifetimeError;
|
||||||
|
use crate::session_diagnostics::HigherRankedSubtypeError;
|
||||||
use crate::MirBorrowckCtxt;
|
use crate::MirBorrowckCtxt;
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
@ -69,7 +72,7 @@ impl<'tcx> UniverseInfo<'tcx> {
|
|||||||
// up in the existing UI tests. Consider investigating this
|
// up in the existing UI tests. Consider investigating this
|
||||||
// some more.
|
// some more.
|
||||||
mbcx.buffer_error(
|
mbcx.buffer_error(
|
||||||
mbcx.infcx.tcx.sess.struct_span_err(cause.span, "higher-ranked subtype error"),
|
mbcx.infcx.tcx.sess.create_err(HigherRankedSubtypeError { span: cause.span }),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -216,9 +219,12 @@ impl<'tcx> TypeOpInfo<'tcx> for PredicateQuery<'tcx> {
|
|||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
span: Span,
|
span: Span,
|
||||||
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
||||||
let mut err = tcx.sess.struct_span_err(span, "higher-ranked lifetime error");
|
tcx.sess.create_err(HigherRankedLifetimeError {
|
||||||
err.note(&format!("could not prove {}", self.canonical_query.value.value.predicate));
|
cause: Some(HigherRankedErrorCause::CouldNotProve {
|
||||||
err
|
predicate: self.canonical_query.value.value.predicate.to_string(),
|
||||||
|
}),
|
||||||
|
span,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn base_universe(&self) -> ty::UniverseIndex {
|
fn base_universe(&self) -> ty::UniverseIndex {
|
||||||
@ -263,9 +269,12 @@ where
|
|||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
span: Span,
|
span: Span,
|
||||||
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
||||||
let mut err = tcx.sess.struct_span_err(span, "higher-ranked lifetime error");
|
tcx.sess.create_err(HigherRankedLifetimeError {
|
||||||
err.note(&format!("could not normalize `{}`", self.canonical_query.value.value.value));
|
cause: Some(HigherRankedErrorCause::CouldNotNormalize {
|
||||||
err
|
value: self.canonical_query.value.value.value.to_string(),
|
||||||
|
}),
|
||||||
|
span,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn base_universe(&self) -> ty::UniverseIndex {
|
fn base_universe(&self) -> ty::UniverseIndex {
|
||||||
@ -326,7 +335,7 @@ impl<'tcx> TypeOpInfo<'tcx> for AscribeUserTypeQuery<'tcx> {
|
|||||||
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
||||||
// FIXME: This error message isn't great, but it doesn't show up in the existing UI tests,
|
// FIXME: This error message isn't great, but it doesn't show up in the existing UI tests,
|
||||||
// and is only the fallback when the nice error fails. Consider improving this some more.
|
// and is only the fallback when the nice error fails. Consider improving this some more.
|
||||||
tcx.sess.struct_span_err(span, "higher-ranked lifetime error")
|
tcx.sess.create_err(HigherRankedLifetimeError { cause: None, span })
|
||||||
}
|
}
|
||||||
|
|
||||||
fn base_universe(&self) -> ty::UniverseIndex {
|
fn base_universe(&self) -> ty::UniverseIndex {
|
||||||
@ -366,7 +375,7 @@ impl<'tcx> TypeOpInfo<'tcx> for crate::type_check::InstantiateOpaqueType<'tcx> {
|
|||||||
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
) -> DiagnosticBuilder<'tcx, ErrorGuaranteed> {
|
||||||
// FIXME: This error message isn't great, but it doesn't show up in the existing UI tests,
|
// FIXME: This error message isn't great, but it doesn't show up in the existing UI tests,
|
||||||
// and is only the fallback when the nice error fails. Consider improving this some more.
|
// and is only the fallback when the nice error fails. Consider improving this some more.
|
||||||
tcx.sess.struct_span_err(span, "higher-ranked lifetime error for opaque type!")
|
tcx.sess.create_err(HigherRankedLifetimeError { cause: None, span })
|
||||||
}
|
}
|
||||||
|
|
||||||
fn base_universe(&self) -> ty::UniverseIndex {
|
fn base_universe(&self) -> ty::UniverseIndex {
|
||||||
|
@ -24,6 +24,7 @@ use rustc_span::symbol::Ident;
|
|||||||
use rustc_span::Span;
|
use rustc_span::Span;
|
||||||
|
|
||||||
use crate::borrowck_errors;
|
use crate::borrowck_errors;
|
||||||
|
use crate::session_diagnostics::GenericDoesNotLiveLongEnough;
|
||||||
|
|
||||||
use super::{OutlivesSuggestionBuilder, RegionName};
|
use super::{OutlivesSuggestionBuilder, RegionName};
|
||||||
use crate::region_infer::BlameConstraint;
|
use crate::region_infer::BlameConstraint;
|
||||||
@ -196,9 +197,11 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
|
|||||||
// to report it; we could probably handle it by
|
// to report it; we could probably handle it by
|
||||||
// iterating over the universal regions and reporting
|
// iterating over the universal regions and reporting
|
||||||
// an error that multiple bounds are required.
|
// an error that multiple bounds are required.
|
||||||
self.buffer_error(self.infcx.tcx.sess.struct_span_err(
|
self.buffer_error(self.infcx.tcx.sess.create_err(
|
||||||
type_test_span,
|
GenericDoesNotLiveLongEnough {
|
||||||
&format!("`{}` does not live long enough", type_test.generic_kind),
|
kind: type_test.generic_kind.to_string(),
|
||||||
|
span: type_test_span,
|
||||||
|
},
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,6 +76,7 @@ mod places_conflict;
|
|||||||
mod prefixes;
|
mod prefixes;
|
||||||
mod region_infer;
|
mod region_infer;
|
||||||
mod renumber;
|
mod renumber;
|
||||||
|
mod session_diagnostics;
|
||||||
mod type_check;
|
mod type_check;
|
||||||
mod universal_regions;
|
mod universal_regions;
|
||||||
mod used_muts;
|
mod used_muts;
|
||||||
|
44
compiler/rustc_borrowck/src/session_diagnostics.rs
Normal file
44
compiler/rustc_borrowck/src/session_diagnostics.rs
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
use rustc_macros::{SessionDiagnostic, SessionSubdiagnostic};
|
||||||
|
use rustc_middle::ty::Ty;
|
||||||
|
use rustc_span::Span;
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[error(borrowck::move_unsized, code = "E0161")]
|
||||||
|
pub(crate) struct MoveUnsized<'tcx> {
|
||||||
|
pub ty: Ty<'tcx>,
|
||||||
|
#[primary_span]
|
||||||
|
#[label]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[error(borrowck::higher_ranked_lifetime_error)]
|
||||||
|
pub(crate) struct HigherRankedLifetimeError {
|
||||||
|
#[subdiagnostic]
|
||||||
|
pub cause: Option<HigherRankedErrorCause>,
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionSubdiagnostic)]
|
||||||
|
pub(crate) enum HigherRankedErrorCause {
|
||||||
|
#[note(borrowck::could_not_prove)]
|
||||||
|
CouldNotProve { predicate: String },
|
||||||
|
#[note(borrowck::could_not_normalize)]
|
||||||
|
CouldNotNormalize { value: String },
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[error(borrowck::higher_ranked_subtype_error)]
|
||||||
|
pub(crate) struct HigherRankedSubtypeError {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(SessionDiagnostic)]
|
||||||
|
#[error(borrowck::generic_does_not_live_long_enough)]
|
||||||
|
pub(crate) struct GenericDoesNotLiveLongEnough {
|
||||||
|
pub kind: String,
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
@ -9,7 +9,6 @@ use hir::OpaqueTyOrigin;
|
|||||||
use rustc_data_structures::frozen::Frozen;
|
use rustc_data_structures::frozen::Frozen;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_data_structures::vec_map::VecMap;
|
use rustc_data_structures::vec_map::VecMap;
|
||||||
use rustc_errors::struct_span_err;
|
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::DefKind;
|
use rustc_hir::def::DefKind;
|
||||||
use rustc_hir::def_id::LocalDefId;
|
use rustc_hir::def_id::LocalDefId;
|
||||||
@ -48,6 +47,7 @@ use rustc_mir_dataflow::impls::MaybeInitializedPlaces;
|
|||||||
use rustc_mir_dataflow::move_paths::MoveData;
|
use rustc_mir_dataflow::move_paths::MoveData;
|
||||||
use rustc_mir_dataflow::ResultsCursor;
|
use rustc_mir_dataflow::ResultsCursor;
|
||||||
|
|
||||||
|
use crate::session_diagnostics::MoveUnsized;
|
||||||
use crate::{
|
use crate::{
|
||||||
borrow_set::BorrowSet,
|
borrow_set::BorrowSet,
|
||||||
constraints::{OutlivesConstraint, OutlivesConstraintSet},
|
constraints::{OutlivesConstraint, OutlivesConstraintSet},
|
||||||
@ -1780,19 +1780,10 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
|
|||||||
// slot or local, so to find all unsized rvalues it is enough
|
// slot or local, so to find all unsized rvalues it is enough
|
||||||
// to check all temps, return slots and locals.
|
// to check all temps, return slots and locals.
|
||||||
if self.reported_errors.replace((ty, span)).is_none() {
|
if self.reported_errors.replace((ty, span)).is_none() {
|
||||||
let mut diag = struct_span_err!(
|
|
||||||
self.tcx().sess,
|
|
||||||
span,
|
|
||||||
E0161,
|
|
||||||
"cannot move a value of type {0}: the size of {0} \
|
|
||||||
cannot be statically determined",
|
|
||||||
ty
|
|
||||||
);
|
|
||||||
|
|
||||||
// While this is located in `nll::typeck` this error is not
|
// While this is located in `nll::typeck` this error is not
|
||||||
// an NLL error, it's a required check to prevent creation
|
// an NLL error, it's a required check to prevent creation
|
||||||
// of unsized rvalues in a call expression.
|
// of unsized rvalues in a call expression.
|
||||||
diag.emit();
|
self.tcx().sess.emit_err(MoveUnsized { ty, span });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
18
compiler/rustc_error_messages/locales/en-US/borrowck.ftl
Normal file
18
compiler/rustc_error_messages/locales/en-US/borrowck.ftl
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
borrowck-move-unsized =
|
||||||
|
cannot move a value of type `{$ty}`
|
||||||
|
.label = the size of `{$ty}` cannot be statically determined
|
||||||
|
|
||||||
|
borrowck-higher-ranked-lifetime-error =
|
||||||
|
higher-ranked lifetime error
|
||||||
|
|
||||||
|
borrowck-could-not-prove =
|
||||||
|
could not prove `{$predicate}`
|
||||||
|
|
||||||
|
borrowck-could-not-normalize =
|
||||||
|
could not normalize `{$value}`
|
||||||
|
|
||||||
|
borrowck-higher-ranked-subtype-error =
|
||||||
|
higher-ranked subtype error
|
||||||
|
|
||||||
|
generic-does-not-live-long-enough =
|
||||||
|
`{$kind}` does not live long enough
|
@ -35,6 +35,7 @@ fluent_messages! {
|
|||||||
privacy => "../locales/en-US/privacy.ftl",
|
privacy => "../locales/en-US/privacy.ftl",
|
||||||
typeck => "../locales/en-US/typeck.ftl",
|
typeck => "../locales/en-US/typeck.ftl",
|
||||||
builtin_macros => "../locales/en-US/builtin_macros.ftl",
|
builtin_macros => "../locales/en-US/builtin_macros.ftl",
|
||||||
|
borrowck => "../locales/en-US/borrowck.ftl",
|
||||||
}
|
}
|
||||||
|
|
||||||
pub use fluent_generated::{self as fluent, DEFAULT_LOCALE_RESOURCES};
|
pub use fluent_generated::{self as fluent, DEFAULT_LOCALE_RESOURCES};
|
||||||
|
@ -281,9 +281,19 @@ pub trait Emitter {
|
|||||||
let message = bundle.get_message(&identifier).expect("missing diagnostic in fluent bundle");
|
let message = bundle.get_message(&identifier).expect("missing diagnostic in fluent bundle");
|
||||||
let value = match attr {
|
let value = match attr {
|
||||||
Some(attr) => {
|
Some(attr) => {
|
||||||
message.get_attribute(attr).expect("missing attribute in fluent message").value()
|
if let Some(attr) = message.get_attribute(attr) {
|
||||||
|
attr.value()
|
||||||
|
} else {
|
||||||
|
panic!("missing attribute `{attr}` in fluent message `{identifier}`")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
if let Some(value) = message.value() {
|
||||||
|
value
|
||||||
|
} else {
|
||||||
|
panic!("missing value in fluent message `{identifier}`")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
None => message.value().expect("missing value in fluent message"),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut err = vec![];
|
let mut err = vec![];
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
error[E0161]: cannot move a value of type str: the size of str cannot be statically determined
|
error[E0161]: cannot move a value of type `str`
|
||||||
--> $DIR/dst-index.rs:31:5
|
--> $DIR/dst-index.rs:31:5
|
||||||
|
|
|
|
||||||
LL | S[0];
|
LL | S[0];
|
||||||
| ^^^^
|
| ^^^^ the size of `str` cannot be statically determined
|
||||||
|
|
||||||
error[E0161]: cannot move a value of type dyn Debug: the size of dyn Debug cannot be statically determined
|
error[E0161]: cannot move a value of type `dyn Debug`
|
||||||
--> $DIR/dst-index.rs:34:5
|
--> $DIR/dst-index.rs:34:5
|
||||||
|
|
|
|
||||||
LL | T[0];
|
LL | T[0];
|
||||||
| ^^^^
|
| ^^^^ the size of `dyn Debug` cannot be statically determined
|
||||||
|
|
||||||
error[E0507]: cannot move out of index of `S`
|
error[E0507]: cannot move out of index of `S`
|
||||||
--> $DIR/dst-index.rs:31:5
|
--> $DIR/dst-index.rs:31:5
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
error[E0161]: cannot move a value of type dyn Bar: the size of dyn Bar cannot be statically determined
|
error[E0161]: cannot move a value of type `dyn Bar`
|
||||||
--> $DIR/E0161.rs:16:5
|
--> $DIR/E0161.rs:16:5
|
||||||
|
|
|
|
||||||
LL | x.f();
|
LL | x.f();
|
||||||
| ^^^^^
|
| ^^^^^ the size of `dyn Bar` cannot be statically determined
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ error: higher-ranked lifetime error
|
|||||||
LL | v.t(|| {});
|
LL | v.t(|| {});
|
||||||
| ^^^^^^^^^^
|
| ^^^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: could not prove [closure@$DIR/issue-59311.rs:17:9: 17:14] well-formed
|
= note: could not prove `[closure@$DIR/issue-59311.rs:17:9: 17:14] well-formed`
|
||||||
|
|
||||||
error: higher-ranked lifetime error
|
error: higher-ranked lifetime error
|
||||||
--> $DIR/issue-59311.rs:17:9
|
--> $DIR/issue-59311.rs:17:9
|
||||||
@ -12,7 +12,7 @@ error: higher-ranked lifetime error
|
|||||||
LL | v.t(|| {});
|
LL | v.t(|| {});
|
||||||
| ^^^^^
|
| ^^^^^
|
||||||
|
|
|
|
||||||
= note: could not prove for<'a> &'a V: 'static
|
= note: could not prove `for<'a> &'a V: 'static`
|
||||||
|
|
||||||
error: aborting due to 2 previous errors
|
error: aborting due to 2 previous errors
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ error: higher-ranked lifetime error
|
|||||||
LL | foo(&10);
|
LL | foo(&10);
|
||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
|
|
|
|
||||||
= note: could not prove for<'b, 'r> &'b (): 'r
|
= note: could not prove `for<'b, 'r> &'b (): 'r`
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
struct Bug {
|
struct Bug {
|
||||||
A: [(); { *"" }.len()],
|
A: [(); { *"" }.len()],
|
||||||
//~^ ERROR: cannot move a value of type str
|
//~^ ERROR: cannot move a value of type `str`
|
||||||
//~| ERROR: cannot move out of a shared reference
|
//~| ERROR: cannot move out of a shared reference
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
error[E0161]: cannot move a value of type str: the size of str cannot be statically determined
|
error[E0161]: cannot move a value of type `str`
|
||||||
--> $DIR/issue-67947.rs:2:13
|
--> $DIR/issue-67947.rs:2:13
|
||||||
|
|
|
|
||||||
LL | A: [(); { *"" }.len()],
|
LL | A: [(); { *"" }.len()],
|
||||||
| ^^^^^^^
|
| ^^^^^^^ the size of `str` cannot be statically determined
|
||||||
|
|
||||||
error[E0507]: cannot move out of a shared reference
|
error[E0507]: cannot move out of a shared reference
|
||||||
--> $DIR/issue-67947.rs:2:15
|
--> $DIR/issue-67947.rs:2:15
|
||||||
|
@ -12,7 +12,7 @@ trait Baz {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn use_bar(t: Box<dyn Bar>) {
|
fn use_bar(t: Box<dyn Bar>) {
|
||||||
t.bar() //~ ERROR cannot move a value of type dyn Bar
|
t.bar() //~ ERROR cannot move a value of type `dyn Bar`
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() { }
|
fn main() { }
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
error[E0161]: cannot move a value of type dyn Bar: the size of dyn Bar cannot be statically determined
|
error[E0161]: cannot move a value of type `dyn Bar`
|
||||||
--> $DIR/object-safety-by-value-self-use.rs:15:5
|
--> $DIR/object-safety-by-value-self-use.rs:15:5
|
||||||
|
|
|
|
||||||
LL | t.bar()
|
LL | t.bar()
|
||||||
| ^^^^^^^
|
| ^^^^^^^ the size of `dyn Bar` cannot be statically determined
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ trait Foo {
|
|||||||
fn foo(f: Option<&dyn Foo>) {
|
fn foo(f: Option<&dyn Foo>) {
|
||||||
if let Some(f) = f {
|
if let Some(f) = f {
|
||||||
let _ = f.foo();
|
let _ = f.foo();
|
||||||
//~^ ERROR cannot move a value of type [u8]: the size of [u8] cannot be statically determined
|
//~^ ERROR cannot move a value of type `[u8]`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
error[E0161]: cannot move a value of type [u8]: the size of [u8] cannot be statically determined
|
error[E0161]: cannot move a value of type `[u8]`
|
||||||
--> $DIR/return-unsized-from-trait-method.rs:9:17
|
--> $DIR/return-unsized-from-trait-method.rs:9:17
|
||||||
|
|
|
|
||||||
LL | let _ = f.foo();
|
LL | let _ = f.foo();
|
||||||
| ^^^^^^^
|
| ^^^^^^^ the size of `[u8]` cannot be statically determined
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user