Rollup merge of #94636 - compiler-errors:issue-94599, r=davidtwco

Check extra function arg exprs even if the fn is not C-variadic

We should still call check_expr on the args that exceed the formal input ty count, so that we have expr types to emit during writeback.

Not sure where this regressed, but it wasn't due to the same root cause as #94334 I think. I thought this might've regressed in #92360, but I think that is in stable, ad the test I provided (which minimizes #94599) passes on stable in playground. Maybe it regressed in #93118.

Anywho, fixes #94599.
This commit is contained in:
Matthias Krüger 2022-03-07 06:44:02 +01:00 committed by GitHub
commit 9c7ff1add7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 10 deletions

View file

@ -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.

View file

@ -0,0 +1,6 @@
fn main() {
(|| {})(|| {
//~^ ERROR this function takes 0 arguments but 1 argument was supplied
let b = 1;
});
}

View 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`.