fix incorrect propagation
This commit is contained in:
parent
f3f400a6bd
commit
69cb867a8e
3 changed files with 32 additions and 35 deletions
|
@ -971,7 +971,10 @@ impl<'ast, 'a, T: Field> ResultFolder<'ast, T> for Propagator<'ast, 'a, T> {
|
|||
}
|
||||
|
||||
fn fold_select_expression<
|
||||
E: Expr<'ast, T> + Select<'ast, T> + From<TypedExpression<'ast, T>>,
|
||||
E: Expr<'ast, T>
|
||||
+ Select<'ast, T>
|
||||
+ From<TypedExpression<'ast, T>>
|
||||
+ Into<TypedExpression<'ast, T>>,
|
||||
>(
|
||||
&mut self,
|
||||
_: &E::Ty,
|
||||
|
@ -988,12 +991,7 @@ impl<'ast, 'a, T: Field> ResultFolder<'ast, T> for Propagator<'ast, 'a, T> {
|
|||
(ArrayExpressionInner::Value(v), UExpressionInner::Value(n)) => {
|
||||
if n < size {
|
||||
Ok(SelectOrExpression::Expression(
|
||||
E::from(
|
||||
v.expression_at::<StructExpression<'ast, T>>(n as usize)
|
||||
.unwrap()
|
||||
.clone(),
|
||||
)
|
||||
.into_inner(),
|
||||
v.expression_at::<E>(n as usize).unwrap().into_inner(),
|
||||
))
|
||||
} else {
|
||||
Err(Error::OutOfBounds(n, size))
|
||||
|
@ -1005,14 +1003,7 @@ impl<'ast, 'a, T: Field> ResultFolder<'ast, T> for Propagator<'ast, 'a, T> {
|
|||
TypedExpression::Array(a) => match a.as_inner() {
|
||||
ArrayExpressionInner::Value(v) => {
|
||||
Ok(SelectOrExpression::Expression(
|
||||
E::from(
|
||||
v.expression_at::<StructExpression<'ast, T>>(
|
||||
n as usize,
|
||||
)
|
||||
.unwrap()
|
||||
.clone(),
|
||||
)
|
||||
.into_inner(),
|
||||
v.expression_at::<E>(n as usize).unwrap().into_inner(),
|
||||
))
|
||||
}
|
||||
_ => unreachable!("should be an array value"),
|
||||
|
|
|
@ -1142,30 +1142,28 @@ impl<'ast, T> IntoIterator for ArrayValue<'ast, T> {
|
|||
}
|
||||
|
||||
impl<'ast, T: Clone + fmt::Debug> ArrayValue<'ast, T> {
|
||||
fn expression_at_aux<U: Select<'ast, T> + Into<TypedExpression<'ast, T>>>(
|
||||
fn expression_at_aux<
|
||||
U: Select<'ast, T> + Into<TypedExpression<'ast, T>> + From<TypedExpression<'ast, T>>,
|
||||
>(
|
||||
v: TypedExpressionOrSpread<'ast, T>,
|
||||
) -> Vec<Option<TypedExpression<'ast, T>>> {
|
||||
) -> Vec<Option<U>> {
|
||||
match v {
|
||||
TypedExpressionOrSpread::Expression(e) => vec![Some(e.clone())],
|
||||
TypedExpressionOrSpread::Expression(e) => vec![Some(e.clone().into())],
|
||||
TypedExpressionOrSpread::Spread(s) => match s.array.size().into_inner() {
|
||||
UExpressionInner::Value(size) => {
|
||||
let array_ty = s.array.ty().clone();
|
||||
|
||||
match s.array.into_inner() {
|
||||
ArrayExpressionInner::Value(v) => v
|
||||
.into_iter()
|
||||
.flat_map(Self::expression_at_aux::<U>)
|
||||
.collect(),
|
||||
ArrayExpressionInner::Value(v) => {
|
||||
v.into_iter().flat_map(Self::expression_at_aux).collect()
|
||||
}
|
||||
a => (0..size)
|
||||
.map(|i| {
|
||||
Some(
|
||||
U::select(
|
||||
a.clone()
|
||||
.annotate(*array_ty.ty.clone(), array_ty.size.clone()),
|
||||
i as u32,
|
||||
)
|
||||
.into(),
|
||||
)
|
||||
Some(U::select(
|
||||
a.clone()
|
||||
.annotate(*array_ty.ty.clone(), array_ty.size.clone()),
|
||||
i as u32,
|
||||
))
|
||||
})
|
||||
.collect(),
|
||||
}
|
||||
|
@ -1175,13 +1173,15 @@ impl<'ast, T: Clone + fmt::Debug> ArrayValue<'ast, T> {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn expression_at<U: Select<'ast, T> + Into<TypedExpression<'ast, T>>>(
|
||||
pub fn expression_at<
|
||||
U: Select<'ast, T> + Into<TypedExpression<'ast, T>> + From<TypedExpression<'ast, T>>,
|
||||
>(
|
||||
&self,
|
||||
index: usize,
|
||||
) -> Option<TypedExpression<'ast, T>> {
|
||||
) -> Option<U> {
|
||||
self.0
|
||||
.iter()
|
||||
.map(|v| dbg!(Self::expression_at_aux::<U>(v.clone())))
|
||||
.map(|v| Self::expression_at_aux(v.clone()))
|
||||
.flatten()
|
||||
.take_while(|e| e.is_some())
|
||||
.map(|e| e.unwrap())
|
||||
|
|
|
@ -212,7 +212,10 @@ pub trait ResultFolder<'ast, T: Field>: Sized {
|
|||
}
|
||||
|
||||
fn fold_select_expression<
|
||||
E: Expr<'ast, T> + Select<'ast, T> + From<TypedExpression<'ast, T>>,
|
||||
E: Expr<'ast, T>
|
||||
+ Select<'ast, T>
|
||||
+ From<TypedExpression<'ast, T>>
|
||||
+ Into<TypedExpression<'ast, T>>,
|
||||
>(
|
||||
&mut self,
|
||||
ty: &E::Ty,
|
||||
|
@ -724,7 +727,10 @@ pub fn fold_member_expression<
|
|||
pub fn fold_select_expression<
|
||||
'ast,
|
||||
T: Field,
|
||||
E: Expr<'ast, T> + Select<'ast, T> + From<TypedExpression<'ast, T>>,
|
||||
E: Expr<'ast, T>
|
||||
+ Select<'ast, T>
|
||||
+ From<TypedExpression<'ast, T>>
|
||||
+ Into<TypedExpression<'ast, T>>,
|
||||
F: ResultFolder<'ast, T>,
|
||||
>(
|
||||
f: &mut F,
|
||||
|
|
Loading…
Reference in a new issue