fn initialize<F>(vars: &mut Vars, mut f: F)
where
  F: FnMut(&Name) -> bool,
{
  for (name, data) in vars.iter_mut() {
    if !data.init && f(name) {
      data.init = true;
    }
  }
}
/// it used to be we would assert that if `data.init`, then `f(name)`. this was
/// a check to make sure a var doesn't go from initialized to uninitialized
/// which cannot happen in valid code.
///
/// however, we want to allow invalid code, like:
/// ```c
/// void foo() {
///   int x = 1;
///   {
///     int x;
///   }
/// }
/// ```
it used to be we would assert that if `data.init`, then `f(name)`. this was
a check to make sure a var doesn't go from initialized to uninitialized
which cannot happen in valid code.


it used to be we would assert that if ` data . init ` then ` f ( name ) ` . this was a check to make sure a var doesn ' t go from initialized to uninitialized which cannot happen in valid code .
fn initialize<F>(vars: &mut Vars, mut f: F)
where
  F: FnMut(&Name) -> bool,
{
  for (name, data) in vars.iter_mut() {
    if !data.init && f(name) {
      data.init = true;
    }
  }
}
fn initialize < F > ( vars : & mut Vars , mut f : F ) where F : FnMut ( & Name ) -> bool , { for ( name , data ) in vars . iter_mut ( ) { if ! data . init && f ( name ) { data . init = true ; } } }
it used to be we would assert that if `data.init`, then `f(name)`.
it used to be we would assert that if ` data . init ` then ` f ( name ) ` .
vars
&mut Vars
f
F
vars
&mut Vars
f
F