Suppress fallback and ambiguity errors

If the infcx has observed other errors, then suppress both default type
parameter fallback (which can be unreliable, as the full constraint set
is not available) and errors related to unresovled
variables (annoyingly, integer type variables cannot currently be
unified with error, so that has to be a separate mechanism). Also add a
flag to `infcx` to allow us to independently indicate when we have
observed an error and hence should trigger this suppression mode.
This commit is contained in:
Niko Matsakis 2016-03-15 04:49:10 -04:00
parent 933000613b
commit ccaa2f855e
13 changed files with 166 additions and 10 deletions

View file

@ -0,0 +1,20 @@
// Copyright 2015 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// RFC 401 test extracted into distinct file. This is because some the
// change to suppress "derived" errors wound up suppressing this error
// message, since the fallback for `3` doesn't occur.
fn main() {
let _ = 3 as bool;
//~^ ERROR cannot cast as `bool`
//~| HELP see a detailed explanation
//~| HELP compare with zero
}

View file

@ -58,7 +58,7 @@ fn main()
let _ = f as *const u8;
//~^ ERROR casting
//~^^ HELP through a usize first
let _ = 3 as bool;
let _ = 3_i32 as bool;
//~^ ERROR cannot cast as `bool`
//~^^ HELP compare with zero
//~^^^ HELP run `rustc --explain E0054` to see a detailed explanation

View file

@ -0,0 +1,27 @@
// Copyright 2012 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// Test that the resolve failure does not lead to downstream type errors.
// See issue #31997.
trait TheTrait { }
fn closure<F, T>(x: F) -> Result<T, ()>
where F: FnMut() -> T, T: TheTrait,
{
unimplemented!()
}
fn foo() -> Result<(), ()> {
try!(closure(|| bar(0 as *mut _))); //~ ERROR unresolved name `bar`
Ok(())
}
fn main() { }

View file

@ -31,7 +31,6 @@ macro_rules! write {
macro_rules! cast {
($x:expr) => ($x as ())
//~^ ERROR non-scalar cast: `i32` as `()`
}
fn main() {
@ -40,5 +39,4 @@ fn main() {
//~^ NOTE in this expansion of write!
cast!(2);
//~^ NOTE in this expansion of cast!
}