Skip to content

Continue evaluating after item-type checking #60126

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Apr 23, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions src/librustc_interface/passes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 4 additions & 6 deletions src/librustc_typeck/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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));

Expand Down
22 changes: 10 additions & 12 deletions src/test/ui/c-variadic/variadic-ffi-1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,18 @@ extern {
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
}
}
77 changes: 75 additions & 2 deletions src/test/ui/c-variadic/variadic-ffi-1.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
29 changes: 0 additions & 29 deletions src/test/ui/c-variadic/variadic-ffi-3.rs

This file was deleted.

76 changes: 0 additions & 76 deletions src/test/ui/c-variadic/variadic-ffi-3.stderr

This file was deleted.

2 changes: 1 addition & 1 deletion src/test/ui/in-band-lifetimes/mismatched_trait_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}

Expand Down
12 changes: 11 additions & 1 deletion src/test/ui/in-band-lifetimes/mismatched_trait_impl.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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

1 change: 1 addition & 0 deletions src/test/ui/infinite/infinite-tag-type-recursion.rs
Original file line number Diff line number Diff line change
@@ -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)); }
14 changes: 12 additions & 2 deletions src/test/ui/infinite/infinite-tag-type-recursion.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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 } }`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This note doesn't seem like something the user would understand... :)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It doesn't. There hard error removal is causing some spurious and duplicated errors that I want to hide, but for now I want to put these changes out asap so that's we can capture any lurking ICEs.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we have a lot of cycle errors without comprehensible diagnostics. This is something that needs to be addressed in general and is not specific to this PR

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Filed #60178


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`.
2 changes: 2 additions & 0 deletions src/test/ui/issues/issue-16048.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ impl<'a> NoLifetime for Foo<'a> {
//~^ 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.
}
}

Expand Down
13 changes: 11 additions & 2 deletions src/test/ui/issues/issue-16048.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
// compile-flags: --test

use std::num::ParseIntError;
use std::num::ParseFloatError;

#[test]
fn can_parse_zero_as_f32() -> Result<f32, ParseIntError> { //~ ERROR
fn can_parse_zero_as_f32() -> Result<f32, ParseFloatError> { //~ ERROR
"0".parse()
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
error[E0277]: `main` has invalid return type `std::result::Result<f32, std::num::ParseIntError>`
error[E0277]: `main` has invalid return type `std::result::Result<f32, std::num::ParseFloatError>`
--> $DIR/termination-trait-test-wrong-type.rs:6:1
|
LL | / fn can_parse_zero_as_f32() -> Result<f32, ParseIntError> {
LL | / fn can_parse_zero_as_f32() -> Result<f32, ParseFloatError> {
LL | | "0".parse()
LL | | }
| |_^ `main` can only return types that implement `std::process::Termination`
|
= help: the trait `std::process::Termination` is not implemented for `std::result::Result<f32, std::num::ParseIntError>`
= help: the trait `std::process::Termination` is not implemented for `std::result::Result<f32, std::num::ParseFloatError>`
= note: required by `test::assert_test_result`

error: aborting due to previous error
Expand Down
19 changes: 0 additions & 19 deletions src/test/ui/structs/struct-base-wrong-type-2.rs

This file was deleted.

21 changes: 0 additions & 21 deletions src/test/ui/structs/struct-base-wrong-type-2.stderr

This file was deleted.

Loading