1
0
Fork 0
mirror of synced 2025-09-23 12:18:44 +00:00

fix incorrect propagation

This commit is contained in:
schaeff 2021-10-05 21:39:18 +03:00
parent f3f400a6bd
commit 69cb867a8e
3 changed files with 32 additions and 35 deletions

View file

@ -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"),

View file

@ -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())

View file

@ -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,