58 lines
1.4 KiB
Rust
58 lines
1.4 KiB
Rust
// Check that traits with various kinds of associated items cause
|
|
// dropck to inject extra region constraints.
|
|
|
|
#![allow(non_camel_case_types)]
|
|
|
|
trait HasSelfMethod { fn m1(&self) { } }
|
|
trait HasMethodWithSelfArg { fn m2(x: &Self) { } }
|
|
trait HasType { type Something; }
|
|
|
|
impl HasSelfMethod for i32 { }
|
|
impl HasMethodWithSelfArg for i32 { }
|
|
impl HasType for i32 { type Something = (); }
|
|
|
|
impl<'a,T> HasSelfMethod for &'a T { }
|
|
impl<'a,T> HasMethodWithSelfArg for &'a T { }
|
|
impl<'a,T> HasType for &'a T { type Something = (); }
|
|
|
|
// e.g., `impl_drop!(Send, D_Send)` expands to:
|
|
// ```rust
|
|
// struct D_Send<T:Send>(T);
|
|
// impl<T:Send> Drop for D_Send<T> { fn drop(&mut self) { } }
|
|
// ```
|
|
macro_rules! impl_drop {
|
|
($Bound:ident, $Id:ident) => {
|
|
struct $Id<T:$Bound>(T);
|
|
impl <T:$Bound> Drop for $Id<T> { fn drop(&mut self) { } }
|
|
}
|
|
}
|
|
|
|
impl_drop!{HasSelfMethod, D_HasSelfMethod}
|
|
impl_drop!{HasMethodWithSelfArg, D_HasMethodWithSelfArg}
|
|
impl_drop!{HasType, D_HasType}
|
|
|
|
fn f_sm() {
|
|
let (_d, d1);
|
|
d1 = D_HasSelfMethod(1);
|
|
_d = D_HasSelfMethod(&d1);
|
|
}
|
|
//~^^ ERROR `d1` does not live long enough
|
|
fn f_mwsa() {
|
|
let (_d, d1);
|
|
d1 = D_HasMethodWithSelfArg(1);
|
|
_d = D_HasMethodWithSelfArg(&d1);
|
|
}
|
|
//~^^ ERROR `d1` does not live long enough
|
|
fn f_t() {
|
|
let (_d, d1);
|
|
d1 = D_HasType(1);
|
|
_d = D_HasType(&d1);
|
|
}
|
|
//~^^ ERROR `d1` does not live long enough
|
|
|
|
fn main() {
|
|
f_sm();
|
|
f_mwsa();
|
|
f_t();
|
|
}
|