mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-30 18:53:39 +00:00
check extra args even if the function is not c_variadic
This commit is contained in:
parent
69f11fff33
commit
3f17dae37d
@ -281,6 +281,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
self.demand_suptype(provided_arg.span, formal_input_ty, coerced_ty);
|
||||
};
|
||||
|
||||
let minimum_input_count = formal_input_tys.len();
|
||||
|
||||
// Check the arguments.
|
||||
// We do this in a pretty awful way: first we type-check any arguments
|
||||
// that are not closures, then we type-check the closures. This is so
|
||||
@ -303,7 +305,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
})
|
||||
}
|
||||
|
||||
let minimum_input_count = formal_input_tys.len();
|
||||
for (idx, arg) in provided_args.iter().enumerate() {
|
||||
// Warn only for the first loop (the "no closures" one).
|
||||
// Closure arguments themselves can't be diverging, but
|
||||
@ -456,17 +457,18 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
err.emit();
|
||||
}
|
||||
|
||||
// We also need to make sure we at least write the ty of the other
|
||||
// arguments which we skipped above.
|
||||
if c_variadic {
|
||||
fn variadic_error<'tcx>(sess: &Session, span: Span, ty: Ty<'tcx>, cast_ty: &str) {
|
||||
use crate::structured_errors::MissingCastForVariadicArg;
|
||||
for arg in provided_args.iter().skip(minimum_input_count) {
|
||||
let arg_ty = self.check_expr(&arg);
|
||||
|
||||
MissingCastForVariadicArg { sess, span, ty, cast_ty }.diagnostic().emit();
|
||||
}
|
||||
if c_variadic {
|
||||
// We also need to make sure we at least write the ty of the other
|
||||
// arguments which we skipped above, either because they were additional
|
||||
// c_variadic args, or because we had an argument count mismatch.
|
||||
fn variadic_error<'tcx>(sess: &Session, span: Span, ty: Ty<'tcx>, cast_ty: &str) {
|
||||
use crate::structured_errors::MissingCastForVariadicArg;
|
||||
|
||||
for arg in provided_args.iter().skip(expected_arg_count) {
|
||||
let arg_ty = self.check_expr(&arg);
|
||||
MissingCastForVariadicArg { sess, span, ty, cast_ty }.diagnostic().emit();
|
||||
}
|
||||
|
||||
// There are a few types which get autopromoted when passed via varargs
|
||||
// in C but we just error out instead and require explicit casts.
|
||||
|
6
src/test/ui/tuple/wrong_argument_ice-4.rs
Normal file
6
src/test/ui/tuple/wrong_argument_ice-4.rs
Normal file
@ -0,0 +1,6 @@
|
||||
fn main() {
|
||||
(|| {})(|| {
|
||||
//~^ ERROR this function takes 0 arguments but 1 argument was supplied
|
||||
let b = 1;
|
||||
});
|
||||
}
|
15
src/test/ui/tuple/wrong_argument_ice-4.stderr
Normal file
15
src/test/ui/tuple/wrong_argument_ice-4.stderr
Normal file
@ -0,0 +1,15 @@
|
||||
error[E0057]: this function takes 0 arguments but 1 argument was supplied
|
||||
--> $DIR/wrong_argument_ice-4.rs:2:5
|
||||
|
|
||||
LL | (|| {})(|| {
|
||||
| _____^^^^^^^_-
|
||||
| | |
|
||||
| | expected 0 arguments
|
||||
LL | |
|
||||
LL | | let b = 1;
|
||||
LL | | });
|
||||
| |_____- supplied 1 argument
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0057`.
|
Loading…
Reference in New Issue
Block a user