Auto merge of #52620 - mikhail-m1:51351, r=nikomatsakis

fix simple case of issue #51351 and #52133

r? @nikomatsakis
This commit is contained in:
bors 2018-07-29 13:23:01 +00:00
commit 75af9df71b
19 changed files with 218 additions and 48 deletions

View file

@ -20,7 +20,7 @@ LL | | });
i16,
for<'r, 's, 't0, 't1, 't2, 't3> extern "rust-call" fn((&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) std::cell::Cell<&'_#1r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't0)) std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't1)) &'_#2r u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't2)) std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't3)) std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't1)) u32>))
]
= note: number of external vids: 3
= note: number of external vids: 5
= note: where '_#1r: '_#2r
error[E0623]: lifetime mismatch

View file

@ -20,7 +20,7 @@ LL | | });
i16,
for<'r, 's, 't0, 't1, 't2> extern "rust-call" fn((&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) std::cell::Cell<&'_#1r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't0)) std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't1)) std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't2)) u32>))
]
= note: number of external vids: 2
= note: number of external vids: 4
= note: where '_#1r: '_#0r
error: borrowed data escapes outside of function

View file

@ -20,7 +20,7 @@ LL | | });
i16,
for<'r, 's, 't0, 't1, 't2, 't3> extern "rust-call" fn((&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) std::cell::Cell<&'_#1r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't0)) std::cell::Cell<&'_#2r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't1)) u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't2)) std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't3)) std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 't1)) u32>))
]
= note: number of external vids: 3
= note: number of external vids: 5
= note: where '_#1r: '_#0r
error: borrowed data escapes outside of function

View file

@ -20,7 +20,7 @@ LL | | });
i16,
for<'r, 's> extern "rust-call" fn((std::cell::Cell<&'_#1r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) u32>, std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) &'_#2r u32>, std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) u32>, std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>))
]
= note: number of external vids: 3
= note: number of external vids: 5
= note: where '_#1r: '_#2r
error[E0623]: lifetime mismatch

View file

@ -18,7 +18,7 @@ LL | | },
i16,
for<'r, 's> extern "rust-call" fn((std::cell::Cell<&'_#1r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) u32>, std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) &'_#2r u32>, std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) u32>, std::cell::Cell<&ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) u32>))
]
= note: number of external vids: 3
= note: number of external vids: 4
= note: where '_#1r: '_#2r
note: No external requirements

View file

@ -23,7 +23,7 @@ LL | | });
i32,
extern "rust-call" fn((T,))
]
= note: number of external vids: 2
= note: number of external vids: 3
= note: where T: '_#1r
error[E0309]: the parameter type `T` may not live long enough

View file

@ -0,0 +1,32 @@
// 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.
//
// Regression test for #51351 and #52133: In the case of #51351,
// late-bound regions (like 'a) that were unused within the arguments of
// a function were overlooked and could case an ICE. In the case of #52133,
// LBR defined on the creator function needed to be added to the free regions
// of the closure, as they were not present in the closure's generic
// declarations otherwise.
//
// compile-pass
#![feature(nll)]
fn creash<'a>() {
let x: &'a () = &();
}
fn produce<'a>() {
move || {
let x: &'a () = &();
};
}
fn main() {}

View file

@ -0,0 +1,50 @@
// 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.
//
#![allow(warnings)]
#![feature(nll)]
trait Bazinga { }
impl<F> Bazinga for F { }
fn produce1<'a>(data: &'a u32) -> impl Bazinga + 'a {
let x = move || {
let _data: &'a u32 = data;
};
x
}
fn produce2<'a>(data: &'a mut Vec<&'a u32>, value: &'a u32) -> impl Bazinga + 'a {
let x = move || {
let value: &'a u32 = value;
data.push(value);
};
x
}
fn produce3<'a, 'b: 'a>(data: &'a mut Vec<&'a u32>, value: &'b u32) -> impl Bazinga + 'a {
let x = move || {
let value: &'a u32 = value;
data.push(value);
};
x
}
fn produce_err<'a, 'b: 'a>(data: &'b mut Vec<&'b u32>, value: &'a u32) -> impl Bazinga + 'b {
let x = move || { //~ ERROR lifetime mismatch
let value: &'a u32 = value;
data.push(value);
};
x
}
fn main() { }

View file

@ -0,0 +1,11 @@
error[E0623]: lifetime mismatch
--> $DIR/issue-52133.rs:43:9
|
LL | fn produce_err<'a, 'b: 'a>(data: &'b mut Vec<&'b u32>, value: &'a u32) -> impl Bazinga + 'b {
| -------------------- ------- these two types are declared with different lifetimes...
LL | let x = move || { //~ ERROR lifetime mismatch
| ^ ...but data from `value` flows into `data` here
error: aborting due to previous error
For more information about this error, try `rustc --explain E0623`.

View file

@ -22,7 +22,7 @@ LL | with_signature(x, |mut y| Box::new(y.next()))
i32,
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn Anything + '_#2r)>
]
= note: number of external vids: 3
= note: number of external vids: 4
= note: where <T as std::iter::Iterator>::Item: '_#2r
error[E0309]: the associated type `<T as std::iter::Iterator>::Item` may not live long enough
@ -62,7 +62,7 @@ LL | with_signature(x, |mut y| Box::new(y.next()))
i32,
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn Anything + '_#2r)>
]
= note: number of external vids: 3
= note: number of external vids: 4
= note: where <T as std::iter::Iterator>::Item: '_#2r
note: No external requirements
@ -94,7 +94,7 @@ LL | with_signature(x, |mut y| Box::new(y.next()))
i32,
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn Anything + '_#3r)>
]
= note: number of external vids: 4
= note: number of external vids: 5
= note: where <T as std::iter::Iterator>::Item: '_#3r
error[E0309]: the associated type `<T as std::iter::Iterator>::Item` may not live long enough
@ -136,7 +136,7 @@ LL | with_signature(x, |mut y| Box::new(y.next()))
i32,
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn Anything + '_#3r)>
]
= note: number of external vids: 4
= note: number of external vids: 5
= note: where <T as std::iter::Iterator>::Item: '_#3r
note: No external requirements

View file

@ -28,7 +28,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T))
]
= note: number of external vids: 3
= note: number of external vids: 5
= note: where T: '_#2r
= note: where '_#1r: '_#2r
@ -76,7 +76,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T))
]
= note: number of external vids: 4
= note: number of external vids: 5
= note: where T: '_#3r
= note: where '_#2r: '_#3r
@ -125,7 +125,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T))
]
= note: number of external vids: 4
= note: number of external vids: 5
= note: where T: '_#3r
= note: where '_#2r: '_#3r
@ -174,7 +174,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T))
]
= note: number of external vids: 4
= note: number of external vids: 5
= note: where T: '_#3r
= note: where '_#2r: '_#3r

View file

@ -28,7 +28,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T))
]
= note: number of external vids: 3
= note: number of external vids: 5
= note: where '_#1r: '_#2r
error: unsatisfied lifetime constraints
@ -67,7 +67,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T))
]
= note: number of external vids: 4
= note: number of external vids: 5
= note: where '_#2r: '_#3r
error: unsatisfied lifetime constraints
@ -107,7 +107,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T))
]
= note: number of external vids: 4
= note: number of external vids: 5
= note: where '_#2r: '_#3r
error: unsatisfied lifetime constraints
@ -147,7 +147,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T))
]
= note: number of external vids: 4
= note: number of external vids: 5
= note: where '_#2r: '_#3r
note: No external requirements
@ -180,7 +180,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T))
]
= note: number of external vids: 3
= note: number of external vids: 4
= note: where '_#1r: '_#2r
note: No external requirements

View file

@ -47,7 +47,7 @@ where
{
with_signature(cell, t, |cell, t| require(cell, t));
//~^ WARNING not reporting region error due to nll
//~| ERROR associated type `<T as Anything<'_#5r, '_#6r>>::AssocType` may not live long enough
//~| ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
}
#[rustc_regions]
@ -58,7 +58,7 @@ where
{
with_signature(cell, t, |cell, t| require(cell, t));
//~^ WARNING not reporting region error due to nll
//~| ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
//~| ERROR associated type `<T as Anything<'_#7r, '_#8r>>::AssocType` may not live long enough
}
#[rustc_regions]
@ -79,7 +79,7 @@ where
with_signature(cell, t, |cell, t| require(cell, t));
//~^ WARNING not reporting region error due to nll
//~| ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
//~| ERROR associated type `<T as Anything<'_#7r, '_#8r>>::AssocType` may not live long enough
}
#[rustc_regions]

View file

@ -35,16 +35,16 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T))
]
= note: number of external vids: 4
= note: number of external vids: 6
= note: where <T as Anything<ReClosureBound('_#1r), ReClosureBound('_#2r)>>::AssocType: '_#3r
error[E0309]: the associated type `<T as Anything<'_#5r, '_#6r>>::AssocType` may not live long enough
error[E0309]: the associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
--> $DIR/projection-two-region-trait-bound-closure.rs:48:29
|
LL | with_signature(cell, t, |cell, t| require(cell, t));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider adding an explicit lifetime bound `<T as Anything<'_#5r, '_#6r>>::AssocType: ReFree(DefId(0/0:8 ~ projection_two_region_trait_bound_closure[317d]::no_relationships_late[0]), BrNamed(crate0:DefIndex(1:18), 'a))`...
= help: consider adding an explicit lifetime bound `<T as Anything<'_#6r, '_#7r>>::AssocType: ReFree(DefId(0/0:8 ~ projection_two_region_trait_bound_closure[317d]::no_relationships_late[0]), BrNamed(crate0:DefIndex(1:18), 'a))`...
note: No external requirements
--> $DIR/projection-two-region-trait-bound-closure.rs:44:1
@ -54,7 +54,7 @@ LL | | where
LL | | T: Anything<'b, 'c>,
LL | | {
... |
LL | | //~| ERROR associated type `<T as Anything<'_#5r, '_#6r>>::AssocType` may not live long enough
LL | | //~| ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
LL | | }
| |_^
|
@ -78,16 +78,16 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#4r ()>, T))
]
= note: number of external vids: 5
= note: number of external vids: 6
= note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::AssocType: '_#4r
error[E0309]: the associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
error[E0309]: the associated type `<T as Anything<'_#7r, '_#8r>>::AssocType` may not live long enough
--> $DIR/projection-two-region-trait-bound-closure.rs:59:29
|
LL | with_signature(cell, t, |cell, t| require(cell, t));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider adding an explicit lifetime bound `<T as Anything<'_#6r, '_#7r>>::AssocType: ReEarlyBound(0, 'a)`...
= help: consider adding an explicit lifetime bound `<T as Anything<'_#7r, '_#8r>>::AssocType: ReEarlyBound(0, 'a)`...
note: No external requirements
--> $DIR/projection-two-region-trait-bound-closure.rs:54:1
@ -97,7 +97,7 @@ LL | | where
LL | | T: Anything<'b, 'c>,
LL | | 'a: 'a,
... |
LL | | //~| ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
LL | | //~| ERROR associated type `<T as Anything<'_#7r, '_#8r>>::AssocType` may not live long enough
LL | | }
| |_^
|
@ -122,16 +122,16 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#4r ()>, T))
]
= note: number of external vids: 5
= note: number of external vids: 6
= note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::AssocType: '_#4r
error[E0309]: the associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
error[E0309]: the associated type `<T as Anything<'_#7r, '_#8r>>::AssocType` may not live long enough
--> $DIR/projection-two-region-trait-bound-closure.rs:80:29
|
LL | with_signature(cell, t, |cell, t| require(cell, t));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: consider adding an explicit lifetime bound `<T as Anything<'_#6r, '_#7r>>::AssocType: ReEarlyBound(0, 'a)`...
= help: consider adding an explicit lifetime bound `<T as Anything<'_#7r, '_#8r>>::AssocType: ReEarlyBound(0, 'a)`...
note: No external requirements
--> $DIR/projection-two-region-trait-bound-closure.rs:65:1
@ -141,7 +141,7 @@ LL | | where
LL | | T: Anything<'b, 'c>,
LL | | T::AssocType: 'a,
... |
LL | | //~| ERROR associated type `<T as Anything<'_#6r, '_#7r>>::AssocType` may not live long enough
LL | | //~| ERROR associated type `<T as Anything<'_#7r, '_#8r>>::AssocType` may not live long enough
LL | | }
| |_^
|
@ -166,7 +166,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#4r ()>, T))
]
= note: number of external vids: 5
= note: number of external vids: 6
= note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::AssocType: '_#4r
note: No external requirements
@ -202,7 +202,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#4r ()>, T))
]
= note: number of external vids: 5
= note: number of external vids: 6
= note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#3r)>>::AssocType: '_#4r
note: No external requirements
@ -236,7 +236,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T))
]
= note: number of external vids: 3
= note: number of external vids: 5
= note: where <T as Anything<ReClosureBound('_#1r), ReClosureBound('_#1r)>>::AssocType: '_#2r
error: unsatisfied lifetime constraints
@ -275,7 +275,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T))
]
= note: number of external vids: 4
= note: number of external vids: 5
= note: where <T as Anything<ReClosureBound('_#2r), ReClosureBound('_#2r)>>::AssocType: '_#3r
note: No external requirements
@ -308,7 +308,7 @@ LL | with_signature(cell, t, |cell, t| require(cell, t));
i32,
extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T))
]
= note: number of external vids: 3
= note: number of external vids: 4
= note: where <T as Anything<ReClosureBound('_#1r), ReClosureBound('_#1r)>>::AssocType: '_#2r
note: No external requirements

View file

@ -27,7 +27,7 @@ LL | twice(cell, value, |a, b| invoke(a, b));
i16,
for<'r, 's> extern "rust-call" fn((std::option::Option<std::cell::Cell<&'_#1r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) ()>>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) T))
]
= note: number of external vids: 2
= note: number of external vids: 3
= note: where T: '_#1r
note: No external requirements
@ -57,7 +57,7 @@ LL | twice(cell, value, |a, b| invoke(a, b));
i16,
for<'r, 's> extern "rust-call" fn((std::option::Option<std::cell::Cell<&'_#1r &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 'r)) ()>>, &ReLateBound(DebruijnIndex(0), BrNamed(crate0:DefIndex(0:0), 's)) T))
]
= note: number of external vids: 2
= note: number of external vids: 4
= note: where T: '_#1r
error[E0309]: the parameter type `T` may not live long enough

View file

@ -22,7 +22,7 @@ LL | with_signature(x, |y| y)
i32,
extern "rust-call" fn((std::boxed::Box<T>,)) -> std::boxed::Box<(dyn std::fmt::Debug + '_#2r)>
]
= note: number of external vids: 3
= note: number of external vids: 4
= note: where T: '_#2r
error[E0309]: the parameter type `T` may not live long enough

View file

@ -28,7 +28,7 @@ LL | | })
i32,
extern "rust-call" fn((std::cell::Cell<&'_#1r ()>, T))
]
= note: number of external vids: 2
= note: number of external vids: 4
= note: where T: '_#1r
error[E0309]: the parameter type `T` may not live long enough
@ -81,7 +81,7 @@ LL | | })
i32,
extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T))
]
= note: number of external vids: 3
= note: number of external vids: 4
= note: where T: '_#2r
note: No external requirements
@ -119,7 +119,7 @@ LL | | })
i32,
extern "rust-call" fn((std::cell::Cell<&'_#2r ()>, T))
]
= note: number of external vids: 3
= note: number of external vids: 5
= note: where T: '_#2r
error[E0309]: the parameter type `T` may not live long enough
@ -170,7 +170,7 @@ LL | | })
i32,
extern "rust-call" fn((std::cell::Cell<&'_#3r ()>, T))
]
= note: number of external vids: 4
= note: number of external vids: 5
= note: where T: '_#3r
note: No external requirements