diff --git a/zokrates_core/src/flatten/mod.rs b/zokrates_core/src/flatten/mod.rs index 8d2e821b..249ebe7c 100644 --- a/zokrates_core/src/flatten/mod.rs +++ b/zokrates_core/src/flatten/mod.rs @@ -439,29 +439,38 @@ impl<'ast, T: Field> Flattener<'ast, T> { ) -> FlatUExpression { let condition = self.flatten_boolean_expression(statements_flattened, condition); - let mut consequence_statements = vec![]; - - let consequence = consequence.flatten(self, &mut consequence_statements); - - let mut alternative_statements = vec![]; - - let alternative = alternative.flatten(self, &mut alternative_statements); - let condition_id = self.use_sym(); statements_flattened.push(FlatStatement::Definition(condition_id, condition)); - let consequence_statements = - self.make_conditional(consequence_statements, condition_id.into()); - let alternative_statements = self.make_conditional( - alternative_statements, - FlatExpression::Sub( - box FlatExpression::Number(T::one()), - box condition_id.into(), - ), - ); + let (consequence, alternative) = if self.config.isolate_branches { + let mut consequence_statements = vec![]; - statements_flattened.extend(consequence_statements); - statements_flattened.extend(alternative_statements); + let consequence = consequence.flatten(self, &mut consequence_statements); + + let mut alternative_statements = vec![]; + + let alternative = alternative.flatten(self, &mut alternative_statements); + + let consequence_statements = + self.make_conditional(consequence_statements, condition_id.into()); + let alternative_statements = self.make_conditional( + alternative_statements, + FlatExpression::Sub( + box FlatExpression::Number(T::one()), + box condition_id.into(), + ), + ); + + statements_flattened.extend(consequence_statements); + statements_flattened.extend(alternative_statements); + + (consequence, alternative) + } else { + ( + consequence.flatten(self, statements_flattened), + alternative.flatten(self, statements_flattened), + ) + }; let consequence = consequence.flat(); let alternative = alternative.flat(); diff --git a/zokrates_core_test/tests/tests/panics/internal_panic.json b/zokrates_core_test/tests/tests/panics/internal_panic.json new file mode 100644 index 00000000..644d6baa --- /dev/null +++ b/zokrates_core_test/tests/tests/panics/internal_panic.json @@ -0,0 +1,34 @@ +{ + "entry_point": "./tests/tests/panics/internal_panic.zok", + "curves": ["Bn128"], + "config": { + "allow_unconstrained_variables": false, + "isolate_branches": true + }, + "tests": [ + { + "input": { + "values": [ + "1" + ] + }, + "output": { + "Ok": { + "values": ["1"] + } + } + }, + { + "input": { + "values": [ + "0" + ] + }, + "output": { + "Ok": { + "values": ["0"] + } + } + } + ] +} diff --git a/zokrates_core_test/tests/tests/panics/internal_panic.zok b/zokrates_core_test/tests/tests/panics/internal_panic.zok new file mode 100644 index 00000000..de2f1913 --- /dev/null +++ b/zokrates_core_test/tests/tests/panics/internal_panic.zok @@ -0,0 +1,2 @@ +def main(field x) -> field: + return if x == 0 then 0 else 1/x fi \ No newline at end of file diff --git a/zokrates_core_test/tests/tests/panics/internal_panic_no_isolation.json b/zokrates_core_test/tests/tests/panics/internal_panic_no_isolation.json new file mode 100644 index 00000000..c42eee9c --- /dev/null +++ b/zokrates_core_test/tests/tests/panics/internal_panic_no_isolation.json @@ -0,0 +1,33 @@ +{ + "entry_point": "./tests/tests/panics/internal_panic.zok", + "curves": ["Bn128"], + "tests": [ + { + "input": { + "values": [ + "1" + ] + }, + "output": { + "Ok": { + "values": ["1"] + } + } + }, + { + "input": { + "values": [ + "0" + ] + }, + "output": { + "Err": { + "UnsatisfiedConstraint": { + "left": "0", + "right": "1" + } + } + } + } + ] +}