36 lines
712 B
Rust
36 lines
712 B
Rust
|
//@ check-pass
|
||
|
//@ known-bug: #40582
|
||
|
|
||
|
// Should fail. Should not be possible to implement `make_static`.
|
||
|
|
||
|
#![feature(specialization)]
|
||
|
#![allow(incomplete_features)]
|
||
|
|
||
|
trait FromRef<'a, T: ?Sized> {
|
||
|
fn from_ref(r: &'a T) -> Self;
|
||
|
}
|
||
|
|
||
|
impl<'a, T: ?Sized> FromRef<'a, T> for &'a T {
|
||
|
fn from_ref(r: &'a T) -> Self {
|
||
|
r
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl<'a, T: ?Sized, R> FromRef<'a, T> for R {
|
||
|
default fn from_ref(_: &'a T) -> Self {
|
||
|
unimplemented!()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
fn make_static<T: ?Sized>(data: &T) -> &'static T {
|
||
|
fn helper<T: ?Sized, R>(data: &T) -> R {
|
||
|
R::from_ref(data)
|
||
|
}
|
||
|
helper(data)
|
||
|
}
|
||
|
|
||
|
fn main() {
|
||
|
let s = "specialization".to_owned();
|
||
|
println!("{:?}", make_static(s.as_str()));
|
||
|
}
|