From 1571abae53d77f36352b543a595969f1ef21503b Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Sun, 2 Nov 2014 19:26:14 -0800 Subject: [PATCH 1/2] Fix ICE when checking call overload If the overloaded method does not have a tuple or unit type as its first non-self parameter, produce a list of error types with the correct length to prevent a later index bound panic. This typically occurs due to propagation of an earlier type error or unconstrained type variable. Closes #18532 --- src/librustc/middle/typeck/check/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustc/middle/typeck/check/mod.rs b/src/librustc/middle/typeck/check/mod.rs index f334d8016927d..60eefbcededcb 100644 --- a/src/librustc/middle/typeck/check/mod.rs +++ b/src/librustc/middle/typeck/check/mod.rs @@ -2536,7 +2536,7 @@ fn check_argument_types<'a>(fcx: &FnCtxt, span_err!(tcx.sess, sp, E0059, "cannot use call notation; the first type parameter \ for the function trait is neither a tuple nor unit"); - err_args(supplied_arg_count) + err_args(args.len()) } } } else if expected_arg_count == supplied_arg_count { From 7a8e73e4f53a3aef95bb4d819b0d48bff3b93f56 Mon Sep 17 00:00:00 2001 From: Brian Koropoff Date: Sun, 2 Nov 2014 19:36:15 -0800 Subject: [PATCH 2/2] Add regression test for #18532 --- src/test/compile-fail/issue-18532.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/test/compile-fail/issue-18532.rs diff --git a/src/test/compile-fail/issue-18532.rs b/src/test/compile-fail/issue-18532.rs new file mode 100644 index 0000000000000..a67f4c851bf8a --- /dev/null +++ b/src/test/compile-fail/issue-18532.rs @@ -0,0 +1,22 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test that overloaded call parameter checking does not ICE +// when a type error or unconstrained type variable propagates +// into it. + +#![feature(overloaded_calls)] + +fn main() { + (return)((),()); + //~^ ERROR the type of this value must be known + //~^^ ERROR the type of this value must be known + //~^^^ ERROR cannot use call notation +}