Skip to content

Commit 0d3a8d7

Browse files
committed
Extract splatted typeck into a fn and cleanup error handling
fixup! Impl HIR typeck for #[splat]
1 parent ede9033 commit 0d3a8d7

10 files changed

Lines changed: 639 additions & 286 deletions

File tree

compiler/rustc_hir_typeck/src/callee.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -601,8 +601,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
601601
fn_sig.output(),
602602
expected,
603603
arg_exprs,
604-
fn_sig.fn_sig_kind,
605-
TupleArgumentsFlag::NotCallOper,
604+
fn_sig.fn_sig_kind.c_variadic(),
605+
TupleArgumentsFlag::with_fn_sig_kind(fn_sig.fn_sig_kind, false),
606606
def_id,
607607
callee_generic_args,
608608
);
@@ -915,8 +915,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
915915
fn_sig.output(),
916916
expected,
917917
arg_exprs,
918-
fn_sig.fn_sig_kind,
919-
TupleArgumentsFlag::TupleAllCallArgs,
918+
fn_sig.fn_sig_kind.c_variadic(),
919+
TupleArgumentsFlag::rust_fn_trait_call(),
920920
Some(closure_def_id.to_def_id()),
921921
None,
922922
);
@@ -1002,8 +1002,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
10021002
method.sig.output(),
10031003
expected,
10041004
arg_exprs,
1005-
method.sig.fn_sig_kind,
1006-
TupleArgumentsFlag::TupleAllCallArgs,
1005+
method.sig.fn_sig_kind.c_variadic(),
1006+
TupleArgumentsFlag::rust_fn_trait_call(),
10071007
Some(method.def_id),
10081008
None,
10091009
);

compiler/rustc_hir_typeck/src/expr.rs

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@ use rustc_infer::infer::{self, DefineOpaqueTypes, InferOk, RegionVariableOrigin}
2828
use rustc_infer::traits::query::NoSolution;
2929
use rustc_middle::ty::adjustment::{Adjust, Adjustment, AllowTwoPhase};
3030
use rustc_middle::ty::error::{ExpectedFound, TypeError};
31-
use rustc_middle::ty::{
32-
self, AdtKind, FnSigKind, GenericArgsRef, Ty, TypeVisitableExt, Unnormalized,
33-
};
31+
use rustc_middle::ty::{self, AdtKind, GenericArgsRef, Ty, TypeVisitableExt, Unnormalized};
3432
use rustc_middle::{bug, span_bug};
3533
use rustc_session::errors::{ExprParenthesesNeeded, feature_err};
3634
use rustc_span::edit_distance::find_best_match_for_name;
@@ -1468,17 +1466,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
14681466
// Handle splatted method arguments
14691467
// self is already handled as `rcvr`, so it's never splatted here
14701468
let method_inputs = &method.sig.inputs()[1..];
1471-
let method_fn_sig_kind = if let Some(splatted_arg_index) =
1472-
method.sig.fn_sig_kind.splatted()
1473-
{
1474-
method
1475-
.sig
1476-
.fn_sig_kind
1477-
.set_splatted(Some(splatted_arg_index.strict_sub(1)), method_inputs.len())
1478-
.unwrap()
1479-
} else {
1480-
method.sig.fn_sig_kind
1481-
};
1469+
let method_tuple_args_flag =
1470+
TupleArgumentsFlag::with_fn_sig_kind(method.sig.fn_sig_kind, true);
14821471

14831472
self.check_argument_types(
14841473
segment.ident.span,
@@ -1487,8 +1476,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
14871476
method.sig.output(),
14881477
expected,
14891478
args,
1490-
method_fn_sig_kind,
1491-
TupleArgumentsFlag::NotCallOper,
1479+
method.sig.fn_sig_kind.c_variadic(),
1480+
method_tuple_args_flag,
14921481
Some(method.def_id),
14931482
Some(method.args),
14941483
);
@@ -1510,9 +1499,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
15101499
err_output,
15111500
NoExpectation,
15121501
args,
1513-
// Avoid spurious unsafe errors by using a safe dummy sig
1514-
FnSigKind::dummy(),
1515-
TupleArgumentsFlag::NotCallOper,
1502+
false,
1503+
TupleArgumentsFlag::DontTupleArgs,
15161504
None,
15171505
Some(GenericArgsRef::default()),
15181506
);

0 commit comments

Comments
 (0)