diff options
Diffstat (limited to 'src/test/ui/impl-header-lifetime-elision/trait-underscore.rs')
-rw-r--r-- | src/test/ui/impl-header-lifetime-elision/trait-underscore.rs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/test/ui/impl-header-lifetime-elision/trait-underscore.rs b/src/test/ui/impl-header-lifetime-elision/trait-underscore.rs new file mode 100644 index 000000000..3e13b0426 --- /dev/null +++ b/src/test/ui/impl-header-lifetime-elision/trait-underscore.rs @@ -0,0 +1,35 @@ +// Test that `impl MyTrait<'_> for &i32` is equivalent to `impl<'a, +// 'b> MyTrait<'a> for &'b i32`. +// +// run-pass + +#![allow(warnings)] + +trait MyTrait<'a> { } + +// This is equivalent to `MyTrait<'a> for &'b i32`, which is proven by +// the code below. +impl MyTrait<'_> for &i32 { +} + +// When called, T will be `&'x i32` for some `'x`, so since we can +// prove that `&'x i32: for<'a> MyTrait<'a>, then we know that the +// lifetime parameter above is disconnected. +fn impls_my_trait<T: for<'a> MyTrait<'a>>() { } + +fn impls_my_trait_val<T: for<'a> MyTrait<'a>>(_: T) { + impls_my_trait::<T>(); +} + +fn random_where_clause() +where for<'a, 'b> &'a i32: MyTrait<'b> { } + +fn main() { + let x = 22; + let f = &x; + impls_my_trait_val(f); + + impls_my_trait::<&'static i32>(); + + random_where_clause(); +} |