Fix unresolved inference variable ICE.
This commit moves well-formedness check for the `UserTypeAnnotation::Ty(..)` case from always running to only when the code is reachable. This solves the ICE that resulted from `src/test/ui/issue-54943-1.rs` (a minimal repro of `dropck-eyepatch` run-pass tests that failed). The main well-formedness check that was intended to be run despite unreachable code still is, that being the `UserTypeAnnotation::TypeOf(..)` case. Before this PR, the other case wasn't being checked at all. It is possible to fix this ICE while still always checking well-formedness for the `UserTypeAnnotation::Ty(..)` case but that solution will ICE in unreachable code for that case, the diff for that change [can be found here](0). [0]: https://gist.github.com/davidtwco/f9751ffd9c0508f7251c0f17adc3af53
This commit is contained in:
parent
6092d92d70
commit
95c18382cb
5 changed files with 79 additions and 16 deletions
|
|
@ -70,7 +70,7 @@ pub fn change_mutability_of_reference_type() {
|
|||
|
||||
#[cfg(not(cfail1))]
|
||||
#[rustc_clean(cfg="cfail2",
|
||||
except="HirBody,TypeckTables,MirValidated")]
|
||||
except="HirBody,TypeckTables,MirValidated,MirOptimized")]
|
||||
#[rustc_clean(cfg="cfail3")]
|
||||
pub fn change_mutability_of_reference_type() {
|
||||
let _x: &mut u64;
|
||||
|
|
|
|||
15
src/test/ui/issue-54943-1.rs
Normal file
15
src/test/ui/issue-54943-1.rs
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
#![feature(nll)]
|
||||
|
||||
// This test is a minimal version of an ICE in the dropck-eyepatch tests
|
||||
// found in the fix for #54943.
|
||||
|
||||
// compile-pass
|
||||
|
||||
fn foo<T>(_t: T) {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
struct A<'a, B: 'a>(&'a B);
|
||||
let (a1, a2): (String, A<_>) = (String::from("auto"), A(&"this"));
|
||||
foo((a1, a2));
|
||||
}
|
||||
18
src/test/ui/issue-54943-2.rs
Normal file
18
src/test/ui/issue-54943-2.rs
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
#![feature(nll)]
|
||||
|
||||
// This test is a minimal version of an ICE in the dropck-eyepatch tests
|
||||
// found in the fix for #54943. In particular, this test is in unreachable
|
||||
// code as the initial fix for this ICE only worked if the code was reachable.
|
||||
|
||||
// compile-pass
|
||||
|
||||
fn foo<T>(_t: T) {
|
||||
}
|
||||
|
||||
fn main() {
|
||||
return;
|
||||
|
||||
struct A<'a, B: 'a>(&'a B);
|
||||
let (a1, a2): (String, A<_>) = (String::from("auto"), A(&"this"));
|
||||
foo((a1, a2));
|
||||
}
|
||||
|
|
@ -21,7 +21,7 @@ LL | fn call1<'a>(x: &'a usize) {
|
|||
LL | let z: &'a & usize = &(&y);
|
||||
| ----------- ^^^^ borrowed value does not live long enough
|
||||
| |
|
||||
| assignment requires that `y` is borrowed for `'a`
|
||||
| type annotation requires that `y` is borrowed for `'a`
|
||||
...
|
||||
LL | }
|
||||
| - `y` dropped here while still borrowed
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue