better spans for WF errors
This commit is contained in:
parent
c2a7e684cd
commit
3bd8bcb8bb
7 changed files with 28 additions and 19 deletions
|
@ -118,7 +118,7 @@ fn dump_abi_of_fn_type(tcx: TyCtxt<'_>, item_def_id: LocalDefId, attr: &Attribut
|
||||||
let param_env = tcx.param_env(item_def_id);
|
let param_env = tcx.param_env(item_def_id);
|
||||||
let ty = tcx.type_of(item_def_id).instantiate_identity();
|
let ty = tcx.type_of(item_def_id).instantiate_identity();
|
||||||
let span = tcx.def_span(item_def_id);
|
let span = tcx.def_span(item_def_id);
|
||||||
if !ensure_wf(tcx, param_env, ty, span) {
|
if !ensure_wf(tcx, param_env, ty, item_def_id, span) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let meta_items = attr.meta_item_list().unwrap_or_default();
|
let meta_items = attr.meta_item_list().unwrap_or_default();
|
||||||
|
|
|
@ -38,12 +38,17 @@ pub fn ensure_wf<'tcx>(
|
||||||
tcx: TyCtxt<'tcx>,
|
tcx: TyCtxt<'tcx>,
|
||||||
param_env: ParamEnv<'tcx>,
|
param_env: ParamEnv<'tcx>,
|
||||||
ty: Ty<'tcx>,
|
ty: Ty<'tcx>,
|
||||||
|
def_id: LocalDefId,
|
||||||
span: Span,
|
span: Span,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let pred = ty::ClauseKind::WellFormed(ty.into());
|
let pred = ty::ClauseKind::WellFormed(ty.into());
|
||||||
let obligation = traits::Obligation::new(
|
let obligation = traits::Obligation::new(
|
||||||
tcx,
|
tcx,
|
||||||
traits::ObligationCause::dummy_with_span(span),
|
traits::ObligationCause::new(
|
||||||
|
span,
|
||||||
|
def_id,
|
||||||
|
traits::ObligationCauseCode::WellFormed(Some(traits::WellFormedLoc::Ty(def_id))),
|
||||||
|
),
|
||||||
param_env,
|
param_env,
|
||||||
pred,
|
pred,
|
||||||
);
|
);
|
||||||
|
@ -64,7 +69,7 @@ fn dump_layout_of(tcx: TyCtxt<'_>, item_def_id: LocalDefId, attr: &Attribute) {
|
||||||
let param_env = tcx.param_env(item_def_id);
|
let param_env = tcx.param_env(item_def_id);
|
||||||
let ty = tcx.type_of(item_def_id).instantiate_identity();
|
let ty = tcx.type_of(item_def_id).instantiate_identity();
|
||||||
let span = tcx.def_span(item_def_id.to_def_id());
|
let span = tcx.def_span(item_def_id.to_def_id());
|
||||||
if !ensure_wf(tcx, param_env, ty, span) {
|
if !ensure_wf(tcx, param_env, ty, item_def_id, span) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
match tcx.layout_of(param_env.and(ty)) {
|
match tcx.layout_of(param_env.and(ty)) {
|
||||||
|
|
|
@ -852,10 +852,10 @@ LL | type TestAbiNeSign = (fn(i32), fn(u32));
|
||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0277]: the size for values of type `str` cannot be known at compilation time
|
error[E0277]: the size for values of type `str` cannot be known at compilation time
|
||||||
--> $DIR/debug.rs:53:1
|
--> $DIR/debug.rs:53:46
|
||||||
|
|
|
|
||||||
LL | type TestAbiEqNonsense = (fn((str, str)), fn((str, str)));
|
LL | type TestAbiEqNonsense = (fn((str, str)), fn((str, str)));
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
| ^^^^^^^^^^ doesn't have a size known at compile-time
|
||||||
|
|
|
|
||||||
= help: the trait `Sized` is not implemented for `str`
|
= help: the trait `Sized` is not implemented for `str`
|
||||||
= note: only the last element of a tuple may have a dynamically sized type
|
= note: only the last element of a tuple may have a dynamically sized type
|
||||||
|
|
16
tests/ui/associated-types/issue-85103-layout-debug.stderr
Normal file
16
tests/ui/associated-types/issue-85103-layout-debug.stderr
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
error[E0277]: the trait bound `[E]: ToOwned` is not satisfied
|
||||||
|
--> $DIR/issue-85103-layout-debug.rs:6:21
|
||||||
|
|
|
||||||
|
LL | type Edges<'a, E> = Cow<'a, [E]>;
|
||||||
|
| ^^^^^^^^^^^^ the trait `ToOwned` is not implemented for `[E]`
|
||||||
|
|
|
||||||
|
note: required by a bound in `Cow`
|
||||||
|
--> $SRC_DIR/alloc/src/borrow.rs:LL:COL
|
||||||
|
help: consider introducing a `where` clause, but there might be an alternative better way to express this requirement
|
||||||
|
|
|
||||||
|
LL | type Edges<'a, E> where [E]: ToOwned = Cow<'a, [E]>;
|
||||||
|
| ++++++++++++++++++
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
|
@ -1,12 +0,0 @@
|
||||||
error[E0277]: the trait bound `[E]: ToOwned` is not satisfied
|
|
||||||
--> $DIR/issue-85103.rs:6:1
|
|
||||||
|
|
|
||||||
LL | type Edges<'a, E> = Cow<'a, [E]>;
|
|
||||||
| ^^^^^^^^^^^^^^^^^ the trait `ToOwned` is not implemented for `[E]`
|
|
||||||
|
|
|
||||||
note: required by a bound in `Cow`
|
|
||||||
--> $SRC_DIR/alloc/src/borrow.rs:LL:COL
|
|
||||||
|
|
||||||
error: aborting due to previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0277`.
|
|
|
@ -558,10 +558,10 @@ LL | const C: () = ();
|
||||||
| ^^^^^^^^^^^
|
| ^^^^^^^^^^^
|
||||||
|
|
||||||
error[E0277]: the size for values of type `str` cannot be known at compilation time
|
error[E0277]: the size for values of type `str` cannot be known at compilation time
|
||||||
--> $DIR/debug.rs:78:1
|
--> $DIR/debug.rs:78:19
|
||||||
|
|
|
|
||||||
LL | type Impossible = (str, str);
|
LL | type Impossible = (str, str);
|
||||||
| ^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
| ^^^^^^^^^^ doesn't have a size known at compile-time
|
||||||
|
|
|
|
||||||
= help: the trait `Sized` is not implemented for `str`
|
= help: the trait `Sized` is not implemented for `str`
|
||||||
= note: only the last element of a tuple may have a dynamically sized type
|
= note: only the last element of a tuple may have a dynamically sized type
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue