603a75c8ea
By RFC1214: Before calling a fn, we check that its argument and return types are WF. This check takes place after all higher-ranked lifetimes have been instantiated. Checking the argument types ensures that the implied bounds due to argument types are correct. Checking the return type ensures that the resulting type of the call is WF. The previous code only checked the trait-ref, which was not enough in several cases. As this is a soundness fix, it is a [breaking-change]. Fixes #28609
34 lines
1.1 KiB
Rust
34 lines
1.1 KiB
Rust
// 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.
|
|
|
|
// A method's receiver must be well-formed, even if it has late-bound regions.
|
|
// Because of this, a method's substs being well-formed does not imply that
|
|
// the method's implied bounds are met.
|
|
|
|
struct Foo<'b>(Option<&'b ()>);
|
|
|
|
trait Bar<'b> {
|
|
fn xmute<'a>(&'a self, u: &'b u32) -> &'a u32;
|
|
}
|
|
|
|
impl<'b> Bar<'b> for Foo<'b> {
|
|
fn xmute<'a>(&'a self, u: &'b u32) -> &'a u32 { u }
|
|
}
|
|
|
|
fn main() {
|
|
let f = Foo(None);
|
|
let f2 = f;
|
|
let dangling = {
|
|
let pointer = Box::new(42);
|
|
f2.xmute(&pointer) //~ ERROR `pointer` does not live long enough
|
|
};
|
|
println!("{}", dangling);
|
|
}
|