diff --git a/compiler/noirc_frontend/proptest-regressions/parser/parser/types.txt b/compiler/noirc_frontend/proptest-regressions/parser/parser/types.txt new file mode 100644 index 00000000000..1fe60c7bd7c --- /dev/null +++ b/compiler/noirc_frontend/proptest-regressions/parser/parser/types.txt @@ -0,0 +1,7 @@ +# Seeds for failure cases proptest has generated in the past. It is +# automatically read and these particular cases re-run before any +# novel cases are generated. +# +# It is recommended to check this file in to source control so that +# everyone who runs the test benefits from these saved cases. +cc 658af2bccf8d12d4c30396c9efbe63f8cb0992355943516aacdcd41221a399ed # shrinks to sign = 'i', width = 1 diff --git a/compiler/noirc_frontend/src/ast/mod.rs b/compiler/noirc_frontend/src/ast/mod.rs index 47b70ed654e..dd3a1e1464b 100644 --- a/compiler/noirc_frontend/src/ast/mod.rs +++ b/compiler/noirc_frontend/src/ast/mod.rs @@ -393,6 +393,8 @@ impl UnresolvedTypeData { Signed(num_bits) => { if num_bits == 128 { Err(InvalidIntegerBitSizeError(128)) + } else if num_bits == 1 { + Err(InvalidIntegerBitSizeError(1)) } else { Ok(Integer(Signedness::Signed, IntegerBitSize::try_from(num_bits)?)) } diff --git a/compiler/noirc_frontend/src/parser/parser/types.rs b/compiler/noirc_frontend/src/parser/parser/types.rs index d07294e2c9d..b399441ad03 100644 --- a/compiler/noirc_frontend/src/parser/parser/types.rs +++ b/compiler/noirc_frontend/src/parser/parser/types.rs @@ -470,6 +470,9 @@ impl Parser<'_> { #[cfg(test)] mod tests { + use std::collections::BTreeMap; + + use proptest::prelude::*; use strum::IntoEnumIterator; use crate::{ @@ -513,26 +516,41 @@ mod tests { )); } - #[test] - fn errors_on_invalid_bit_size() { - let src = "u31"; - let mut parser = Parser::for_str_with_dummy_file(src); - let typ = parser.parse_type_or_error(); - assert_eq!(typ.typ, UnresolvedTypeData::Error); - assert_eq!(parser.errors.len(), 1); - let error = &parser.errors[0]; - assert!(matches!(error.reason(), Some(ParserErrorReason::InvalidBitSize(..)))); - } - - #[test] - fn errors_on_i128() { - let src = "i128"; - let mut parser = Parser::for_str_with_dummy_file(src); - let typ = parser.parse_type_or_error(); - assert_eq!(typ.typ, UnresolvedTypeData::Error); - assert_eq!(parser.errors.len(), 1); - let error = &parser.errors[0]; - assert!(matches!(error.reason(), Some(ParserErrorReason::InvalidBitSize(..)))); + proptest! { + #[test] + fn parses_only_expected_types(sign in proptest::prop_oneof![Just('u'), Just('i')], width: u8) { + let accepted_types = BTreeMap::from([ + ("u1", UnresolvedTypeData::Integer(Signedness::Unsigned, IntegerBitSize::One)), + ("u8", UnresolvedTypeData::Integer(Signedness::Unsigned, IntegerBitSize::Eight)), + ("u16", UnresolvedTypeData::Integer(Signedness::Unsigned, IntegerBitSize::Sixteen)), + ("u32", UnresolvedTypeData::Integer(Signedness::Unsigned, IntegerBitSize::ThirtyTwo)), + ("u64", UnresolvedTypeData::Integer(Signedness::Unsigned, IntegerBitSize::SixtyFour)), + ( + "u128", + UnresolvedTypeData::Integer( + Signedness::Unsigned, + IntegerBitSize::HundredTwentyEight, + ), + ), + ("i8", UnresolvedTypeData::Integer(Signedness::Signed, IntegerBitSize::Eight)), + ("i16", UnresolvedTypeData::Integer(Signedness::Signed, IntegerBitSize::Sixteen)), + ("i32", UnresolvedTypeData::Integer(Signedness::Signed, IntegerBitSize::ThirtyTwo)), + ("i64", UnresolvedTypeData::Integer(Signedness::Signed, IntegerBitSize::SixtyFour)), + ]); + + let src = format!("{sign}{width}"); + let mut parser = Parser::for_str_with_dummy_file(&src); + let typ = parser.parse_type_or_error(); + + if let Some(expected_typ) = accepted_types.get(&src.as_str()) { + assert_eq!(&typ.typ, expected_typ); + } else { + assert_eq!(typ.typ, UnresolvedTypeData::Error); + assert_eq!(parser.errors.len(), 1); + let error = &parser.errors[0]; + assert!(matches!(error.reason(), Some(ParserErrorReason::InvalidBitSize(..)))); + } + } } #[test] diff --git a/test_programs/execution_success/array_oob_regression_7975/src/main.nr b/test_programs/execution_success/array_oob_regression_7975/src/main.nr index 81ef03579ee..49cdc5373c5 100644 --- a/test_programs/execution_success/array_oob_regression_7975/src/main.nr +++ b/test_programs/execution_success/array_oob_regression_7975/src/main.nr @@ -1,4 +1,4 @@ -fn main(b: [[i1; 1]; 1]) -> pub [[i1; 1]; 1] { +fn main(b: [[u1; 1]; 1]) -> pub [[u1; 1]; 1] { if (b[0][0] == b[0][0]) { b } else { diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index f0ae33c4946..99ebbcdb1c6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -17,7 +17,7 @@ expression: artifact "length": 1, "type": { "kind": "integer", - "sign": "signed", + "sign": "unsigned", "width": 1 } } @@ -34,7 +34,7 @@ expression: artifact "length": 1, "type": { "kind": "integer", - "sign": "signed", + "sign": "unsigned", "width": 1 } } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_false_inliner_0.snap index f0ae33c4946..99ebbcdb1c6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_false_inliner_0.snap @@ -17,7 +17,7 @@ expression: artifact "length": 1, "type": { "kind": "integer", - "sign": "signed", + "sign": "unsigned", "width": 1 } } @@ -34,7 +34,7 @@ expression: artifact "length": 1, "type": { "kind": "integer", - "sign": "signed", + "sign": "unsigned", "width": 1 } } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index f0ae33c4946..99ebbcdb1c6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -17,7 +17,7 @@ expression: artifact "length": 1, "type": { "kind": "integer", - "sign": "signed", + "sign": "unsigned", "width": 1 } } @@ -34,7 +34,7 @@ expression: artifact "length": 1, "type": { "kind": "integer", - "sign": "signed", + "sign": "unsigned", "width": 1 } } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 5f23465c8fa..fb92bca973b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -17,7 +17,7 @@ expression: artifact "length": 1, "type": { "kind": "integer", - "sign": "signed", + "sign": "unsigned", "width": 1 } } @@ -34,7 +34,7 @@ expression: artifact "length": 1, "type": { "kind": "integer", - "sign": "signed", + "sign": "unsigned", "width": 1 } } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_true_inliner_0.snap index 5f23465c8fa..fb92bca973b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_true_inliner_0.snap @@ -17,7 +17,7 @@ expression: artifact "length": 1, "type": { "kind": "integer", - "sign": "signed", + "sign": "unsigned", "width": 1 } } @@ -34,7 +34,7 @@ expression: artifact "length": 1, "type": { "kind": "integer", - "sign": "signed", + "sign": "unsigned", "width": 1 } } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 5f23465c8fa..fb92bca973b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_oob_regression_7975/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -17,7 +17,7 @@ expression: artifact "length": 1, "type": { "kind": "integer", - "sign": "signed", + "sign": "unsigned", "width": 1 } } @@ -34,7 +34,7 @@ expression: artifact "length": 1, "type": { "kind": "integer", - "sign": "signed", + "sign": "unsigned", "width": 1 } }