Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature unsized-locals changed with latest nightly #104

Closed
huitseeker opened this issue Oct 30, 2020 · 0 comments · Fixed by #105
Closed

Feature unsized-locals changed with latest nightly #104

huitseeker opened this issue Oct 30, 2020 · 0 comments · Fixed by #105

Comments

@huitseeker
Copy link
Contributor

huitseeker commented Oct 30, 2020

Issue

The nightly feature required here:

kompact/core/src/utils.rs

Lines 608 to 669 in b3d31ba

// this variant requires #![feature(unsized_locals)]
#[cfg(nightly)]
mod iter_extras {
use crate::serialisation::{SerError, TryClone};
/// Additional iterator functions
pub trait IterExtras: Iterator {
/// Iterate over each item in the iterator and apply a function to it and a clone of the given value `t`
///
/// Behaves like `iterator.for_each(|item| f(item, t.clone()))`, except that it avoids cloning
/// in the case where the iterator contains a single item or for the last item in a larger iterator.
///
/// Use this when cloning `T` is relatively expensive compared to `f`.
fn for_each_with<T, F>(mut self, t: T, mut f: F)
where
T: Clone,
F: FnMut(Self::Item, T),
{
let mut current: Option<Self::Item> = self.next();
let mut next: Option<Self::Item> = self.next();
while next.is_some() {
let item = current.take().unwrap();
f(item, t.clone());
current = next;
next = self.next();
}
if let Some(item) = current.take() {
f(item, t)
}
}
/// Iterate over each item in the iterator and apply a function to it and a clone of the given value `t`
/// if such a clone can be created
///
/// Behaves like `iterator.for_each(|item| f(item, t.try_clone()))`, except that it avoids cloning
/// in the case where the iterator contains a single item or for the last item in a larger iterator.
/// It also shortcircuits on cloning errors.
///
/// Use this when trying to clone `T` is relatively expensive compared to `f`.
fn for_each_try_with<T, F>(mut self, t: T, mut f: F) -> Result<(), SerError>
where
T: TryClone,
F: FnMut(Self::Item, T),
{
let mut current: Option<Self::Item> = self.next();
let mut next: Option<Self::Item> = self.next();
while next.is_some() {
let item = current.take().unwrap();
let cloned = t.try_clone()?;
f(item, cloned);
current = next;
next = self.next();
}
if let Some(item) = current.take() {
f(item, t)
}
Ok(())
}
}
impl<T: ?Sized> IterExtras for T where T: Iterator {}
}

And turned on optionally there:

core/src/lib.rs
74:#![cfg_attr(nightly, feature(unsized_locals))]

breaks with nightly 2020-10-29 because of rust-lang/rust#78152

feature(unsized_locals) was split into two disjoint features:

  • the feature(unsized_locals) which is marked as incomplete
  • feature(unsized_fn_params) which isn't, and which is what Kompact is actually using here.

So post nightly 2020-10-29, Kompact is not activating the feature it actually needs.

Steps to reproduce

cargo +nightly-2020-10-29-x86_64-unknown-linux-gnu check

possibly preceded by a rustup install to install the nightly in question.
Witness the following output:

error[E0277]: the size for values of type `Self` cannot be known at compilation time
   --> /home/huitseeker/.cargo/git/checkouts/kompact-8e3803f644d2dc0c/b3d31ba/core/src/utils.rs:621:32
    |
621 |         fn for_each_with<T, F>(mut self, t: T, mut f: F)
    |                                ^^^^^^^^ doesn't have a size known at compile-time
    |
    = help: unsized fn params are gated as an unstable feature
help: consider further restricting `Self`
    |
624 |             F: FnMut(Self::Item, T), Self: Sized
    |                                    ^^^^^^^^^^^^^
help: function arguments must have a statically known size, borrowed types always have a known size
    |
621 |         fn for_each_with<T, F>(&mut self, t: T, mut f: F)
    |                                ^

error[E0277]: the size for values of type `Self` cannot be known at compilation time
   --> /home/huitseeker/.cargo/git/checkouts/kompact-8e3803f644d2dc0c/b3d31ba/core/src/utils.rs:647:36
    |
647 |         fn for_each_try_with<T, F>(mut self, t: T, mut f: F) -> Result<(), SerError>
    |                                    ^^^^^^^^ doesn't have a size known at compile-time
    |
    = help: unsized fn params are gated as an unstable feature
help: consider further restricting `Self`
    |
650 |             F: FnMut(Self::Item, T), Self: Sized
    |                                    ^^^^^^^^^^^^^
help: function arguments must have a statically known size, borrowed types always have a known size
    |
647 |         fn for_each_try_with<T, F>(&mut self, t: T, mut f: F) -> Result<(), SerError>
    |                                    ^

error: aborting due to 2 previous errors

Workaround

One simple way to upgrade is to update the activation of the unsized_locals feature to target unsized_fn_params. Except this is not backwards-compatible (feature gate errors are fatal and this triggers E0635) and will break every nightly below 2020-10-29.

That includes most nightlies in interactive (human-facing) use since rustfmt has not compiled on nightly since 2020-10-25 or so. It's advised not to merge until the "main" components are available in a post 10-29 nightly here :
https://rust-lang.github.io/rustup-components-history/

huitseeker added a commit to huitseeker/kompact that referenced this issue Oct 30, 2020
Fixes kompics#104

Should not be merged right away: this will require a nightly >= 2020-10-29 to compile.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant