You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
core: Relax lifetime constraint on msgs in I2CTransfer::transfer()
This change enables users of `i2cdev` to create generic functions on `T:
I2CTransfer` that have output buffers constructed separately from the
`I2CMessage` array, like the following:
```rust
fn smbus_read_post_box<T>(i2c: &mut T, offset: u16, out: &mut [u8])
where for<'a> T: I2CTransfer<'a>,
{
let addr = offset.to_be_bytes();
let mut messages = [
T::Message::write(addr),
T::Message::read(out),
];
i2c.transfer(&mut messages).expect("uh oh");
}
```
Before this, `messages` would not satisfy the constraints of `.transfer()`,
because `messages` does not live as long as one of the output buffers `out`:
```
error[E0597]: `messages` does not live long enough
--> src/smbpbisensor.rs:69:19
|
63 | let mut messages = [
| ------------ binding `messages` declared here
...
69 | .transfer(&mut messages)
| ^^^^^^^^^^^^^ borrowed value does not live long enough
...
78 | }
| -
| |
| `messages` dropped here while still borrowed
| borrow might be used here, when `messages` is dropped and runs the destructor for type `[<T as I2CTransfer<'_>>::Message; 2]`
```
The error message is a little confusing, but basically `&'a mut [Self::Message]`
is forcing the array of `I2CMessage`s to match the lifetime of the buffers in
the messages, which is not strictly necessary: the array of messages can have a
different lifetime than the buffers. After this change, the above example
compiles successfully.
0 commit comments