]> git.lizzy.rs Git - rust.git/commitdiff
Continue evaluating after item-type checking
authorEsteban Küber <esteban@kuber.com.ar>
Fri, 19 Apr 2019 22:37:34 +0000 (15:37 -0700)
committerEsteban Küber <esteban@kuber.com.ar>
Mon, 22 Apr 2019 18:31:35 +0000 (11:31 -0700)
16 files changed:
src/librustc_interface/passes.rs
src/librustc_typeck/lib.rs
src/test/ui/c-variadic/variadic-ffi-1.rs
src/test/ui/c-variadic/variadic-ffi-1.stderr
src/test/ui/in-band-lifetimes/mismatched_trait_impl.rs
src/test/ui/in-band-lifetimes/mismatched_trait_impl.stderr
src/test/ui/infinite/infinite-tag-type-recursion.rs
src/test/ui/infinite/infinite-tag-type-recursion.stderr
src/test/ui/issues/issue-16048.rs
src/test/ui/issues/issue-16048.stderr
src/test/ui/rfc-1937-termination-trait/termination-trait-test-wrong-type.rs
src/test/ui/rfc-1937-termination-trait/termination-trait-test-wrong-type.stderr
src/test/ui/structs/struct-base-wrong-type.rs
src/test/ui/structs/struct-base-wrong-type.stderr
src/test/ui/wrong-mul-method-signature.rs
src/test/ui/wrong-mul-method-signature.stderr

index 2f01254ed5f9b675004bdff9ec0cd9c2c37a5639..fddf706cc8bcc3f8a15ddc62dc7c419b038629d2 100644 (file)
@@ -966,8 +966,7 @@ fn analysis<'tcx>(
     time(sess, "layout testing", || layout_test::test_layout(tcx));
 
     // Avoid overwhelming user with errors if borrow checking failed.
-    // I'm not sure how helpful this is, to be honest, but it avoids
-    // a
+    // I'm not sure how helpful this is, to be honest, but it avoids a
     // lot of annoying errors in the compile-fail tests (basically,
     // lint warnings and so on -- kindck used to do this abort, but
     // kindck is gone now). -nmatsakis
index 9bc221fac1b0b58422340f69a9aae2af9d855b72..95f7c2949cb5686507bb2307563133474f98227f 100644 (file)
@@ -357,12 +357,10 @@ pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>)
     time(tcx.sess, "wf checking", || check::check_wf_new(tcx))?;
 
     time(tcx.sess, "item-types checking", || {
-        tcx.sess.track_errors(|| {
-            for &module in tcx.hir().krate().modules.keys() {
-                tcx.ensure().check_mod_item_types(tcx.hir().local_def_id(module));
-            }
-        })
-    })?;
+        for &module in tcx.hir().krate().modules.keys() {
+            tcx.ensure().check_mod_item_types(tcx.hir().local_def_id(module));
+        }
+    });
 
     time(tcx.sess, "item-bodies checking", || tcx.typeck_item_bodies(LOCAL_CRATE));
 
index 61b2ad4bed576338b2822c765885087de599aac5..6a3ff24b6740fccfa9a0fb94281807205e9e3199 100644 (file)
 extern "C" fn bar(f: isize, x: u8) {}
 
 fn main() {
-    // errors below are no longer checked because error above aborts
-    // compilation; see variadic-ffi-3.rs for corresponding test.
     unsafe {
-        foo();
-        foo(1);
+        foo();  //~ ERROR this function takes at least 2 parameters but 0 parameters were supplied
+        foo(1); //~ ERROR this function takes at least 2 parameters but 1 parameter was supplied
 
-        let x: unsafe extern "C" fn(f: isize, x: u8) = foo;
-        let y: extern "C" fn(f: isize, x: u8, ...) = bar;
+        let x: unsafe extern "C" fn(f: isize, x: u8) = foo; //~ ERROR mismatched types
+        let y: extern "C" fn(f: isize, x: u8, ...) = bar; //~ ERROR mismatched types
 
-        foo(1, 2, 3f32);
-        foo(1, 2, true);
-        foo(1, 2, 1i8);
-        foo(1, 2, 1u8);
-        foo(1, 2, 1i16);
-        foo(1, 2, 1u16);
+        foo(1, 2, 3f32); //~ ERROR can't pass
+        foo(1, 2, true); //~ ERROR can't pass
+        foo(1, 2, 1i8);  //~ ERROR can't pass
+        foo(1, 2, 1u8);  //~ ERROR can't pass
+        foo(1, 2, 1i16); //~ ERROR can't pass
+        foo(1, 2, 1u16); //~ ERROR can't pass
     }
 }
index 1a2bb4419b582344910d455ab61835d28b7f8b6b..e16d15a98bf9dad0943caaca807a5735d6af8299 100644 (file)
@@ -4,6 +4,79 @@ error[E0045]: C-variadic function must have C or cdecl calling convention
 LL |     fn printf(_: *const u8, ...);
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ C-variadics require C or cdecl calling convention
 
-error: aborting due to previous error
+error[E0060]: this function takes at least 2 parameters but 0 parameters were supplied
+  --> $DIR/variadic-ffi-1.rs:16:9
+   |
+LL |     fn foo(f: isize, x: u8, ...);
+   |     ----------------------------- defined here
+...
+LL |         foo();
+   |         ^^^^^ expected at least 2 parameters
+
+error[E0060]: this function takes at least 2 parameters but 1 parameter was supplied
+  --> $DIR/variadic-ffi-1.rs:17:9
+   |
+LL |     fn foo(f: isize, x: u8, ...);
+   |     ----------------------------- defined here
+...
+LL |         foo(1);
+   |         ^^^^^^ expected at least 2 parameters
+
+error[E0308]: mismatched types
+  --> $DIR/variadic-ffi-1.rs:19:56
+   |
+LL |         let x: unsafe extern "C" fn(f: isize, x: u8) = foo;
+   |                                                        ^^^ expected non-variadic fn, found variadic function
+   |
+   = note: expected type `unsafe extern "C" fn(isize, u8)`
+              found type `for<'r> unsafe extern "C" fn(isize, u8, std::ffi::VaList<'r>, ...) {foo}`
+
+error[E0308]: mismatched types
+  --> $DIR/variadic-ffi-1.rs:20:54
+   |
+LL |         let y: extern "C" fn(f: isize, x: u8, ...) = bar;
+   |                                                      ^^^ expected variadic fn, found non-variadic function
+   |
+   = note: expected type `for<'r> extern "C" fn(isize, u8, std::ffi::VaList<'r>, ...)`
+              found type `extern "C" fn(isize, u8) {bar}`
+
+error[E0617]: can't pass `f32` to variadic function
+  --> $DIR/variadic-ffi-1.rs:22:19
+   |
+LL |         foo(1, 2, 3f32);
+   |                   ^^^^ help: cast the value to `c_double`: `3f32 as c_double`
+
+error[E0617]: can't pass `bool` to variadic function
+  --> $DIR/variadic-ffi-1.rs:23:19
+   |
+LL |         foo(1, 2, true);
+   |                   ^^^^ help: cast the value to `c_int`: `true as c_int`
+
+error[E0617]: can't pass `i8` to variadic function
+  --> $DIR/variadic-ffi-1.rs:24:19
+   |
+LL |         foo(1, 2, 1i8);
+   |                   ^^^ help: cast the value to `c_int`: `1i8 as c_int`
+
+error[E0617]: can't pass `u8` to variadic function
+  --> $DIR/variadic-ffi-1.rs:25:19
+   |
+LL |         foo(1, 2, 1u8);
+   |                   ^^^ help: cast the value to `c_uint`: `1u8 as c_uint`
+
+error[E0617]: can't pass `i16` to variadic function
+  --> $DIR/variadic-ffi-1.rs:26:19
+   |
+LL |         foo(1, 2, 1i16);
+   |                   ^^^^ help: cast the value to `c_int`: `1i16 as c_int`
+
+error[E0617]: can't pass `u16` to variadic function
+  --> $DIR/variadic-ffi-1.rs:27:19
+   |
+LL |         foo(1, 2, 1u16);
+   |                   ^^^^ help: cast the value to `c_uint`: `1u16 as c_uint`
+
+error: aborting due to 11 previous errors
 
-For more information about this error, try `rustc --explain E0045`.
+Some errors have detailed explanations: E0045, E0060, E0308, E0617.
+For more information about an error, try `rustc --explain E0045`.
index 654d2bddfd0410f74152f5003976e1e8a1f39148..f2ba81af9b63883185bbc4e6f43eba22f1e3e8c6 100644 (file)
@@ -7,7 +7,7 @@ trait Get {
 
 impl Get for i32 {
     fn foo(&self, x: &u32, y: &'a u32) -> &'a u32 { //~ ERROR cannot infer
-        x
+        x //~ ERROR lifetime mismatch
     }
 }
 
index cd65bab2d4668688d6c83df001b8203c83bc4ee1..80f15b7c5847f4cbc82b051dd67e2e28c5d3d308 100644 (file)
@@ -20,5 +20,15 @@ LL |     fn foo(&self, x: &u32, y: &'a u32) -> &'a u32 {
            expected fn(&i32, &'a u32, &u32) -> &'a u32
               found fn(&i32, &u32, &u32) -> &u32
 
-error: aborting due to previous error
+error[E0623]: lifetime mismatch
+  --> $DIR/mismatched_trait_impl.rs:10:9
+   |
+LL |     fn foo(&self, x: &u32, y: &'a u32) -> &'a u32 {
+   |                      ----                 -------
+   |                      |
+   |                      this parameter and the return type are declared with different lifetimes...
+LL |         x
+   |         ^ ...but data from `x` is returned here
+
+error: aborting due to 2 previous errors
 
index 87a9e08dd381a64837b7cc68765386a86fec5ce6..bbfaaa62f0d32285bb9ef94108d3461d1abe2c95 100644 (file)
@@ -1,4 +1,5 @@
 enum MList { Cons(isize, MList), Nil }
 //~^ ERROR recursive type `MList` has infinite size
+//~| ERROR cycle detected when processing `MList`
 
 fn main() { let a = MList::Cons(10, MList::Cons(11, MList::Nil)); }
index 88dad0033ddcfa27eca2ca555fa09409c24984d0..8f6529db0bec5b77666601153d240242697c163f 100644 (file)
@@ -8,6 +8,16 @@ LL | enum MList { Cons(isize, MList), Nil }
    |
    = help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `MList` representable
 
-error: aborting due to previous error
+error[E0391]: cycle detected when processing `MList`
+  --> $DIR/infinite-tag-type-recursion.rs:1:1
+   |
+LL | enum MList { Cons(isize, MList), Nil }
+   | ^^^^^^^^^^
+   |
+   = note: ...which again requires processing `MList`, completing the cycle
+   = note: cycle used when computing dropck types for `Canonical { max_universe: U0, variables: [], value: ParamEnvAnd { param_env: ParamEnv { caller_bounds: [], reveal: UserFacing, def_id: None }, value: MList } }`
+
+error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0072`.
+Some errors have detailed explanations: E0072, E0391.
+For more information about an error, try `rustc --explain E0072`.
index 5910481bf7e0dce714e935437f1e332fa8f5fc88..7d24f3a40a742e2669664ff54553ceae0d400e69 100644 (file)
@@ -22,6 +22,8 @@ fn get<'p, T : Test<'a>>(&self) -> T {
     //~^ ERROR E0195
     //~| NOTE lifetimes do not match method in trait
         return *self as T;
+        //~^ ERROR non-primitive cast: `Foo<'a>` as `T`
+        //~| NOTE an `as` expression can only be used to convert between primitive types.
     }
 }
 
index 18e59bd2410ff1afdfe26f145113cb81acb63c1b..a137bcdf1915edd39ec053786aa664e5bc76a514 100644 (file)
@@ -7,6 +7,15 @@ LL |     fn get<'p, T : Test<'p>>(&self) -> T;
 LL |     fn get<'p, T : Test<'a>>(&self) -> T {
    |           ^^^^^^^^^^^^^^^^^^ lifetimes do not match method in trait
 
-error: aborting due to previous error
+error[E0605]: non-primitive cast: `Foo<'a>` as `T`
+  --> $DIR/issue-16048.rs:24:16
+   |
+LL |         return *self as T;
+   |                ^^^^^^^^^^
+   |
+   = note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait
+
+error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0195`.
+Some errors have detailed explanations: E0195, E0605.
+For more information about an error, try `rustc --explain E0195`.
index c648f5428571c8854c236638c22802cd5ed144ce..f49111c3fc7bf27c8261ebed93f5925f5b6fbd2d 100644 (file)
@@ -4,5 +4,5 @@
 
 #[test]
 fn can_parse_zero_as_f32() -> Result<f32, ParseIntError> { //~ ERROR
-    "0".parse()
+    "0".parse() //~ ERROR type mismatch resolving
 }
index 18115541af9510c5d578fecfe2239e2d7d412077..ce79c0c80894d1528074ccb82c60b4d93022568a 100644 (file)
@@ -9,6 +9,16 @@ LL | | }
    = help: the trait `std::process::Termination` is not implemented for `std::result::Result<f32, std::num::ParseIntError>`
    = note: required by `test::assert_test_result`
 
-error: aborting due to previous error
+error[E0271]: type mismatch resolving `<f32 as std::str::FromStr>::Err == std::num::ParseIntError`
+  --> $DIR/termination-trait-test-wrong-type.rs:7:9
+   |
+LL |     "0".parse()
+   |         ^^^^^ expected struct `std::num::ParseFloatError`, found struct `std::num::ParseIntError`
+   |
+   = note: expected type `std::num::ParseFloatError`
+              found type `std::num::ParseIntError`
+
+error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0277`.
+Some errors have detailed explanations: E0271, E0277.
+For more information about an error, try `rustc --explain E0271`.
index 6252673c296fb1d63bc5dc248e8618595294f5d3..58aa35046d9f5ffc1be79f36b05b7e292e5f3b77 100644 (file)
@@ -18,10 +18,7 @@ struct Bar { x: isize }
 
 fn main() {
     let b = Bar { x: 5 };
-    // errors below are no longer caught since error above causes
-    // compilation to abort before we bother checking function bodies.
-    // See also struct-base-wrong-type-2.rs, which checks that we
-    // would catch these errors eventually.
-    let f = Foo { a: 2, ..b };
-    let f__isize = Foo { a: 2, ..4 };
+    // See also struct-base-wrong-type-2.rs, which checks these errors on isolation.
+    let f = Foo { a: 2, ..b };        //~ ERROR mismatched types
+    let f__isize = Foo { a: 2, ..4 }; //~ ERROR mismatched types
 }
index 2491296c5eff48128d3abe1417284defd2368de0..00c2e1e0dd518e52a0ee4f91904245b9cd1ede6c 100644 (file)
@@ -16,6 +16,24 @@ LL | static foo_i: Foo = Foo { a: 2, ..4 };
    = note: expected type `Foo`
               found type `{integer}`
 
-error: aborting due to 2 previous errors
+error[E0308]: mismatched types
+  --> $DIR/struct-base-wrong-type.rs:22:27
+   |
+LL |     let f = Foo { a: 2, ..b };
+   |                           ^ expected struct `Foo`, found struct `Bar`
+   |
+   = note: expected type `Foo`
+              found type `Bar`
+
+error[E0308]: mismatched types
+  --> $DIR/struct-base-wrong-type.rs:23:34
+   |
+LL |     let f__isize = Foo { a: 2, ..4 };
+   |                                  ^ expected struct `Foo`, found integer
+   |
+   = note: expected type `Foo`
+              found type `{integer}`
+
+error: aborting due to 4 previous errors
 
 For more information about this error, try `rustc --explain E0308`.
index 54e2af55259200cf7111932a030bb52e70412de4..1c2f865599e8bf569ba6d599faaf28cfb0cd474a 100644 (file)
@@ -61,9 +61,8 @@ pub fn main() {
     let x: Vec1 = Vec1 { x: 1.0 } * 2.0; // this is OK
 
     let x: Vec2 = Vec2 { x: 1.0, y: 2.0 } * 2.0; // trait had reversed order
-    // (we no longer signal a compile error here, since the
-    //  error in the trait signature will cause compilation to
-    //  abort before we bother looking at function bodies.)
+    //~^ ERROR mismatched types
+    //~| ERROR mismatched types
 
     let x: i32 = Vec3 { x: 1.0, y: 2.0, z: 3.0 } * 2.0;
 }
index 8630ebcb58042b46e9aaea5f893ccdd37d6a1c74..2317bf8e8293c1dfdbd949d8bdec4c4ad173b03c 100644 (file)
@@ -25,6 +25,25 @@ LL |     fn mul(self, s: f64) -> f64 {
    = note: expected type `fn(Vec3, f64) -> i32`
               found type `fn(Vec3, f64) -> f64`
 
-error: aborting due to 3 previous errors
+error[E0308]: mismatched types
+  --> $DIR/wrong-mul-method-signature.rs:63:45
+   |
+LL |     let x: Vec2 = Vec2 { x: 1.0, y: 2.0 } * 2.0; // trait had reversed order
+   |                                             ^^^ expected struct `Vec2`, found floating-point number
+   |
+   = note: expected type `Vec2`
+              found type `{float}`
+
+error[E0308]: mismatched types
+  --> $DIR/wrong-mul-method-signature.rs:63:19
+   |
+LL |     let x: Vec2 = Vec2 { x: 1.0, y: 2.0 } * 2.0; // trait had reversed order
+   |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected struct `Vec2`, found f64
+   |
+   = note: expected type `Vec2`
+              found type `f64`
+
+error: aborting due to 5 previous errors
 
-For more information about this error, try `rustc --explain E0053`.
+Some errors have detailed explanations: E0053, E0308.
+For more information about an error, try `rustc --explain E0053`.