diff options
Diffstat (limited to 'src/test/ui/regions/region-object-lifetime-in-coercion.rs')
-rw-r--r-- | src/test/ui/regions/region-object-lifetime-in-coercion.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/test/ui/regions/region-object-lifetime-in-coercion.rs b/src/test/ui/regions/region-object-lifetime-in-coercion.rs new file mode 100644 index 000000000..95708de04 --- /dev/null +++ b/src/test/ui/regions/region-object-lifetime-in-coercion.rs @@ -0,0 +1,34 @@ +// Test that attempts to implicitly coerce a value into an +// object respect the lifetime bound on the object type. + +trait Foo {} +impl<'a> Foo for &'a [u8] {} + +fn a(v: &[u8]) -> Box<dyn Foo + 'static> { + let x: Box<dyn Foo + 'static> = Box::new(v); + //~^ ERROR lifetime may not live long enough + x +} + +fn b(v: &[u8]) -> Box<dyn Foo + 'static> { + Box::new(v) + //~^ ERROR lifetime may not live long enough +} + +fn c(v: &[u8]) -> Box<dyn Foo> { + // same as previous case due to RFC 599 + + Box::new(v) + //~^ ERROR lifetime may not live long enough +} + +fn d<'a,'b>(v: &'a [u8]) -> Box<dyn Foo+'b> { + Box::new(v) + //~^ ERROR lifetime may not live long enough +} + +fn e<'a:'b,'b>(v: &'a [u8]) -> Box<dyn Foo+'b> { + Box::new(v) // OK, thanks to 'a:'b +} + +fn main() { } |