Check closure args and returns are WF
This commit is contained in:
parent
487cdeb039
commit
b2fea557f3
@ -10,6 +10,7 @@
|
|||||||
use rustc_hir_analysis::check::{check_function_signature, forbid_intrinsic_abi};
|
use rustc_hir_analysis::check::{check_function_signature, forbid_intrinsic_abi};
|
||||||
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
use rustc_infer::infer::type_variable::TypeVariableOrigin;
|
||||||
use rustc_infer::infer::RegionVariableOrigin;
|
use rustc_infer::infer::RegionVariableOrigin;
|
||||||
|
use rustc_infer::traits::WellFormedLoc;
|
||||||
use rustc_middle::ty::{self, Binder, Ty, TyCtxt};
|
use rustc_middle::ty::{self, Binder, Ty, TyCtxt};
|
||||||
use rustc_span::def_id::LocalDefId;
|
use rustc_span::def_id::LocalDefId;
|
||||||
use rustc_span::symbol::sym;
|
use rustc_span::symbol::sym;
|
||||||
@ -71,6 +72,18 @@ pub(super) fn check_fn<'a, 'tcx>(
|
|||||||
let inputs_hir = hir.fn_decl_by_hir_id(fn_id).map(|decl| &decl.inputs);
|
let inputs_hir = hir.fn_decl_by_hir_id(fn_id).map(|decl| &decl.inputs);
|
||||||
let inputs_fn = fn_sig.inputs().iter().copied();
|
let inputs_fn = fn_sig.inputs().iter().copied();
|
||||||
for (idx, (param_ty, param)) in inputs_fn.chain(maybe_va_list).zip(body.params).enumerate() {
|
for (idx, (param_ty, param)) in inputs_fn.chain(maybe_va_list).zip(body.params).enumerate() {
|
||||||
|
// We checked the root's signature during wfcheck, but not the child.
|
||||||
|
if fcx.tcx.is_typeck_child(fn_def_id.to_def_id()) {
|
||||||
|
fcx.register_wf_obligation(
|
||||||
|
param_ty.into(),
|
||||||
|
param.span,
|
||||||
|
traits::WellFormed(Some(WellFormedLoc::Param {
|
||||||
|
function: fn_def_id,
|
||||||
|
param_idx: idx,
|
||||||
|
})),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Check the pattern.
|
// Check the pattern.
|
||||||
let ty: Option<&hir::Ty<'_>> = inputs_hir.and_then(|h| h.get(idx));
|
let ty: Option<&hir::Ty<'_>> = inputs_hir.and_then(|h| h.get(idx));
|
||||||
let ty_span = ty.map(|ty| ty.span);
|
let ty_span = ty.map(|ty| ty.span);
|
||||||
@ -108,7 +121,13 @@ pub(super) fn check_fn<'a, 'tcx>(
|
|||||||
hir::FnRetTy::DefaultReturn(_) => body.value.span,
|
hir::FnRetTy::DefaultReturn(_) => body.value.span,
|
||||||
hir::FnRetTy::Return(ty) => ty.span,
|
hir::FnRetTy::Return(ty) => ty.span,
|
||||||
};
|
};
|
||||||
|
|
||||||
fcx.require_type_is_sized(declared_ret_ty, return_or_body_span, traits::SizedReturnType);
|
fcx.require_type_is_sized(declared_ret_ty, return_or_body_span, traits::SizedReturnType);
|
||||||
|
// We checked the root's signature during wfcheck, but not the child.
|
||||||
|
if fcx.tcx.is_typeck_child(fn_def_id.to_def_id()) {
|
||||||
|
fcx.require_type_is_sized(declared_ret_ty, return_or_body_span, traits::WellFormed(None));
|
||||||
|
}
|
||||||
|
|
||||||
fcx.is_whole_body.set(true);
|
fcx.is_whole_body.set(true);
|
||||||
fcx.check_return_expr(body.value, false);
|
fcx.check_return_expr(body.value, false);
|
||||||
|
|
||||||
|
@ -487,7 +487,7 @@ pub enum WellFormedLoc {
|
|||||||
/// The index of the parameter to use.
|
/// The index of the parameter to use.
|
||||||
/// Parameters are indexed from 0, with the return type
|
/// Parameters are indexed from 0, with the return type
|
||||||
/// being the last 'parameter'
|
/// being the last 'parameter'
|
||||||
param_idx: u16,
|
param_idx: usize,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
20
tests/ui/inference/issue-80409.compat.stderr
Normal file
20
tests/ui/inference/issue-80409.compat.stderr
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
error[E0277]: the trait bound `usize: Fsm` is not satisfied
|
||||||
|
--> $DIR/issue-80409.rs:36:31
|
||||||
|
|
|
||||||
|
LL | builder.state().on_entry(|_| {});
|
||||||
|
| ^ the trait `Fsm` is not implemented for `usize`
|
||||||
|
|
|
||||||
|
help: this trait has no implementations, consider adding one
|
||||||
|
--> $DIR/issue-80409.rs:26:1
|
||||||
|
|
|
||||||
|
LL | trait Fsm {
|
||||||
|
| ^^^^^^^^^
|
||||||
|
note: required by a bound in `StateContext`
|
||||||
|
--> $DIR/issue-80409.rs:30:31
|
||||||
|
|
|
||||||
|
LL | struct StateContext<'a, TFsm: Fsm> {
|
||||||
|
| ^^^ required by this bound in `StateContext`
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
@ -1,14 +1,20 @@
|
|||||||
error: internal compiler error: error performing operation: fully_perform
|
error[E0277]: the trait bound `usize: Fsm` is not satisfied
|
||||||
--> $DIR/issue-80409.rs:49:30
|
--> $DIR/issue-80409.rs:36:31
|
||||||
|
|
|
|
||||||
LL | builder.state().on_entry(|_| {});
|
LL | builder.state().on_entry(|_| {});
|
||||||
| ^^^
|
| ^ the trait `Fsm` is not implemented for `usize`
|
||||||
|
|
|
|
||||||
note:
|
help: this trait has no implementations, consider adding one
|
||||||
--> $DIR/issue-80409.rs:49:30
|
--> $DIR/issue-80409.rs:26:1
|
||||||
|
|
|
|
||||||
LL | builder.state().on_entry(|_| {});
|
LL | trait Fsm {
|
||||||
| ^^^
|
| ^^^^^^^^^
|
||||||
|
note: required by a bound in `StateContext`
|
||||||
|
--> $DIR/issue-80409.rs:30:31
|
||||||
|
|
|
||||||
|
LL | struct StateContext<'a, TFsm: Fsm> {
|
||||||
|
| ^^^ required by this bound in `StateContext`
|
||||||
|
|
||||||
query stack during panic:
|
error: aborting due to 1 previous error
|
||||||
end of query stack
|
|
||||||
|
For more information about this error, try `rustc --explain E0277`.
|
||||||
|
@ -1,18 +1,5 @@
|
|||||||
// This should not pass, because `usize: Fsm` does not hold. However, it currently ICEs.
|
|
||||||
|
|
||||||
// ignore-tidy-linelength
|
|
||||||
|
|
||||||
//@ revisions: compat no-compat
|
//@ revisions: compat no-compat
|
||||||
//@[compat] check-pass
|
|
||||||
//@[no-compat] compile-flags: -Zno-implied-bounds-compat
|
//@[no-compat] compile-flags: -Zno-implied-bounds-compat
|
||||||
//@[no-compat] check-fail
|
|
||||||
//@[no-compat] known-bug: #80409
|
|
||||||
//@[no-compat] failure-status: 101
|
|
||||||
//@[no-compat] normalize-stderr-test "delayed at.*" -> ""
|
|
||||||
//@[no-compat] normalize-stderr-test "note: .*\n\n" -> ""
|
|
||||||
//@[no-compat] normalize-stderr-test "thread 'rustc' panicked.*\n" -> ""
|
|
||||||
//@[no-compat] normalize-stderr-test "(error: internal compiler error: [^:]+):\d+:\d+: " -> "$1:LL:CC: "
|
|
||||||
//@[no-compat] rustc-env:RUST_BACKTRACE=0
|
|
||||||
|
|
||||||
#![allow(unreachable_code, unused)]
|
#![allow(unreachable_code, unused)]
|
||||||
|
|
||||||
@ -47,4 +34,5 @@ struct StateContext<'a, TFsm: Fsm> {
|
|||||||
fn main() {
|
fn main() {
|
||||||
let mut builder: FsmBuilder<usize> = todo!();
|
let mut builder: FsmBuilder<usize> = todo!();
|
||||||
builder.state().on_entry(|_| {});
|
builder.state().on_entry(|_| {});
|
||||||
|
//~^ ERROR the trait bound `usize: Fsm` is not satisfied
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ fn b() {
|
|||||||
fn c() {
|
fn c() {
|
||||||
[0; [|&_: _ &_| {}; 0 ].len()]
|
[0; [|&_: _ &_| {}; 0 ].len()]
|
||||||
//~^ ERROR expected `,`, found `&`
|
//~^ ERROR expected `,`, found `&`
|
||||||
|
//~| ERROR type annotations needed
|
||||||
}
|
}
|
||||||
|
|
||||||
fn d() {
|
fn d() {
|
||||||
|
@ -21,7 +21,7 @@ LL | [0; [|&_: _ &_| {}; 0 ].len()]
|
|||||||
| help: missing `,`
|
| help: missing `,`
|
||||||
|
|
||||||
error: expected identifier, found reserved identifier `_`
|
error: expected identifier, found reserved identifier `_`
|
||||||
--> $DIR/issue-66706.rs:18:26
|
--> $DIR/issue-66706.rs:19:26
|
||||||
|
|
|
|
||||||
LL | [0; match [|f @ &ref _| () ] {} ]
|
LL | [0; match [|f @ &ref _| () ] {} ]
|
||||||
| ----- ^ expected identifier, found reserved identifier
|
| ----- ^ expected identifier, found reserved identifier
|
||||||
@ -34,6 +34,12 @@ error[E0282]: type annotations needed
|
|||||||
LL | [0; [|_: _ &_| ()].len()]
|
LL | [0; [|_: _ &_| ()].len()]
|
||||||
| ^ cannot infer type
|
| ^ cannot infer type
|
||||||
|
|
||||||
error: aborting due to 5 previous errors
|
error[E0282]: type annotations needed
|
||||||
|
--> $DIR/issue-66706.rs:13:11
|
||||||
|
|
|
||||||
|
LL | [0; [|&_: _ &_| {}; 0 ].len()]
|
||||||
|
| ^^^^^ cannot infer type
|
||||||
|
|
||||||
|
error: aborting due to 6 previous errors
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0282`.
|
For more information about this error, try `rustc --explain E0282`.
|
||||||
|
@ -6,10 +6,10 @@ pub fn iso<A, B, F1, F2>(a: F1, b: F2) -> (Box<dyn Fn(A) -> B>, Box<dyn Fn(B) ->
|
|||||||
(Box::new(a), Box::new(b))
|
(Box::new(a), Box::new(b))
|
||||||
}
|
}
|
||||||
pub fn iso_un_option<A, B>() -> (Box<dyn Fn(A) -> B>, Box<dyn Fn(B) -> A>) {
|
pub fn iso_un_option<A, B>() -> (Box<dyn Fn(A) -> B>, Box<dyn Fn(B) -> A>) {
|
||||||
let left = |o_a: Option<_>| o_a.unwrap();
|
let left = |o_a: Option<_>| o_a.unwrap();
|
||||||
|
//~^ ERROR overflow
|
||||||
let right = |o_b: Option<_>| o_b.unwrap();
|
let right = |o_b: Option<_>| o_b.unwrap();
|
||||||
iso(left, right)
|
iso(left, right)
|
||||||
//~^ ERROR overflow
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
@ -1,12 +1,8 @@
|
|||||||
error[E0275]: overflow evaluating the requirement `Option<_>: Sized`
|
error[E0275]: overflow assigning `_` to `Option<_>`
|
||||||
--> $DIR/mutual-recursion-issue-75860.rs:11:5
|
--> $DIR/mutual-recursion-issue-75860.rs:9:33
|
||||||
|
|
|
|
||||||
LL | iso(left, right)
|
LL | let left = |o_a: Option<_>| o_a.unwrap();
|
||||||
| ^^^
|
| ^^^
|
||||||
|
|
|
||||||
= help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`mutual_recursion_issue_75860`)
|
|
||||||
note: required by an implicit `Sized` bound in `Option`
|
|
||||||
--> $SRC_DIR/core/src/option.rs:LL:COL
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
error[E0282]: type annotations needed
|
error[E0282]: type annotations needed
|
||||||
--> $DIR/unknown_type_for_closure.rs:2:13
|
--> $DIR/unknown_type_for_closure.rs:2:14
|
||||||
|
|
|
|
||||||
LL | let x = |b: Vec<_>| {};
|
LL | let x = |b: Vec<_>| {};
|
||||||
| ^^^^^^^^^^^^^^ cannot infer type for struct `Vec<_>`
|
| ^^^^^^^^^ cannot infer type
|
||||||
|
|
||||||
error[E0282]: type annotations needed
|
error[E0282]: type annotations needed
|
||||||
--> $DIR/unknown_type_for_closure.rs:6:14
|
--> $DIR/unknown_type_for_closure.rs:6:14
|
||||||
|
Loading…
Reference in New Issue
Block a user