mirror of
https://github.com/AleoHQ/leo.git
synced 2024-09-21 12:07:56 +03:00
Merge pull request #1656 from AleoHQ/remove/unsized-array
Remove/unsized array
This commit is contained in:
commit
5e2ba78750
@ -20,45 +20,12 @@ use serde::{ser::SerializeSeq, Deserialize, Serialize, Serializer};
|
|||||||
use smallvec::{smallvec, SmallVec};
|
use smallvec::{smallvec, SmallVec};
|
||||||
use std::{fmt, ops::Deref};
|
use std::{fmt, ops::Deref};
|
||||||
|
|
||||||
/// A single array dimension.
|
|
||||||
#[derive(Clone, Deserialize, Debug, PartialEq, Eq, Hash)]
|
|
||||||
pub enum Dimension {
|
|
||||||
/// The dimension is `_`, that is unspecified and syntactically unknown.
|
|
||||||
Unspecified,
|
|
||||||
/// The dimension was specified, e.g., `5` elements.
|
|
||||||
Number(PositiveNumber),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Display for Dimension {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
match self {
|
|
||||||
Self::Unspecified => write!(f, "_"),
|
|
||||||
Self::Number(num) => write!(f, "{}", num),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Dimension {
|
|
||||||
/// } Returns `Some(n)` unless the dimension is [`Unspecified`].
|
|
||||||
pub fn as_specified(&self) -> Option<&PositiveNumber> {
|
|
||||||
match self {
|
|
||||||
Self::Unspecified => None,
|
|
||||||
Self::Number(n) => Some(n),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns true if the dimension is known to be zero.
|
|
||||||
fn is_zero(&self) -> bool {
|
|
||||||
self.as_specified().filter(|n| n.is_zero()).is_some()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Specifies array dimensions for array [`Type`]s or in array initializer [`Expression`]s.
|
/// Specifies array dimensions for array [`Type`]s or in array initializer [`Expression`]s.
|
||||||
#[derive(Clone, Deserialize, Debug, PartialEq, Eq, Hash)]
|
#[derive(Clone, Deserialize, Debug, PartialEq, Eq, Hash)]
|
||||||
pub struct ArrayDimensions(pub SmallVec<[Dimension; 1]>);
|
pub struct ArrayDimensions(pub SmallVec<[PositiveNumber; 1]>);
|
||||||
|
|
||||||
impl Deref for ArrayDimensions {
|
impl Deref for ArrayDimensions {
|
||||||
type Target = [Dimension];
|
type Target = [PositiveNumber];
|
||||||
|
|
||||||
fn deref(&self) -> &Self::Target {
|
fn deref(&self) -> &Self::Target {
|
||||||
&*self.0
|
&*self.0
|
||||||
@ -67,22 +34,17 @@ impl Deref for ArrayDimensions {
|
|||||||
|
|
||||||
impl ArrayDimensions {
|
impl ArrayDimensions {
|
||||||
/// Returns a single-dimensional array dimension.
|
/// Returns a single-dimensional array dimension.
|
||||||
pub fn single(dim: Dimension) -> Self {
|
pub fn single(dim: PositiveNumber) -> Self {
|
||||||
Self(smallvec![dim])
|
Self(smallvec![dim])
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns true if the dimensions are not [`Unspecified`].
|
|
||||||
pub fn is_specified(&self) -> bool {
|
|
||||||
!self.contains(&Dimension::Unspecified)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns `true` if there is an array dimension equal to zero.
|
/// Returns `true` if there is an array dimension equal to zero.
|
||||||
pub fn is_zero(&self) -> bool {
|
pub fn is_zero(&self) -> bool {
|
||||||
self.iter().any(|d| d.is_zero())
|
self.iter().any(|d| d.is_zero())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Attempts to remove the first dimension from the array, or returns `None` if it doesn't.
|
/// Attempts to remove the first dimension from the array, or returns `None` if it doesn't.
|
||||||
pub fn remove_first(&mut self) -> Option<Dimension> {
|
pub fn remove_first(&mut self) -> Option<PositiveNumber> {
|
||||||
if self.is_empty() {
|
if self.is_empty() {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
@ -91,12 +53,12 @@ impl ArrayDimensions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Attempts to remove the last dimension from the array, or returns `None` if it doesn't.
|
/// Attempts to remove the last dimension from the array, or returns `None` if it doesn't.
|
||||||
pub fn remove_last(&mut self) -> Option<Dimension> {
|
pub fn remove_last(&mut self) -> Option<PositiveNumber> {
|
||||||
self.0.pop()
|
self.0.pop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Custom Serializer for ArrayDimensios is required to ignore internal ArrayDimension nodes in the AST.
|
/// Custom Serializer for ArrayDimensions is required to ignore internal ArrayDimension nodes in the AST.
|
||||||
impl Serialize for ArrayDimensions {
|
impl Serialize for ArrayDimensions {
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
where
|
where
|
||||||
@ -104,10 +66,7 @@ impl Serialize for ArrayDimensions {
|
|||||||
{
|
{
|
||||||
let mut seq = serializer.serialize_seq(Some(self.0.len()))?;
|
let mut seq = serializer.serialize_seq(Some(self.0.len()))?;
|
||||||
for dim in self.0.iter() {
|
for dim in self.0.iter() {
|
||||||
match dim {
|
seq.serialize_element(&dim)?;
|
||||||
Dimension::Number(num) => seq.serialize_element(&num)?,
|
|
||||||
Dimension::Unspecified => seq.serialize_element(&PositiveNumber { value: "0".into() })?,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
seq.end()
|
seq.end()
|
||||||
}
|
}
|
||||||
|
@ -88,32 +88,28 @@ impl TryFrom<(Type, Expression)> for InputValue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(dimension) = array_init.dimensions.remove_first() {
|
if let Some(dimension) = array_init.dimensions.remove_first() {
|
||||||
if let Some(number) = dimension.as_specified() {
|
let size = dimension.value.parse::<usize>().unwrap();
|
||||||
let size = number.value.parse::<usize>().unwrap();
|
let mut values = Vec::with_capacity(size);
|
||||||
let mut values = Vec::with_capacity(size);
|
|
||||||
|
|
||||||
// For when Dimensions are specified in a canonical way: [[u8; 3], 2];
|
// For when Dimensions are specified in a canonical way: [[u8; 3], 2];
|
||||||
// Else treat as math notation: [u8; (2, 3)];
|
// Else treat as math notation: [u8; (2, 3)];
|
||||||
if array_init.dimensions.len() == 0 {
|
if array_init.dimensions.len() == 0 {
|
||||||
for _ in 0..size {
|
for _ in 0..size {
|
||||||
values.push(InputValue::try_from((*type_.clone(), *array_init.element.clone()))?);
|
values.push(InputValue::try_from((*type_.clone(), *array_init.element.clone()))?);
|
||||||
}
|
}
|
||||||
// Faking canonical array init is relatively easy: instead of using a straightforward
|
// Faking canonical array init is relatively easy: instead of using a straightforward
|
||||||
// recursion, with each iteration we manually modify ArrayInitExpression cutting off
|
// recursion, with each iteration we manually modify ArrayInitExpression cutting off
|
||||||
// dimension by dimension.
|
// dimension by dimension.
|
||||||
} else {
|
|
||||||
for _ in 0..size {
|
|
||||||
values.push(InputValue::try_from((
|
|
||||||
Type::Array(type_.clone(), array_init.dimensions.clone()),
|
|
||||||
Expression::ArrayInit(array_init.clone()),
|
|
||||||
))?);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Self::Array(values)
|
|
||||||
} else {
|
} else {
|
||||||
unreachable!("dimensions must be specified");
|
for _ in 0..size {
|
||||||
}
|
values.push(InputValue::try_from((
|
||||||
|
Type::Array(type_.clone(), array_init.dimensions.clone()),
|
||||||
|
Expression::ArrayInit(array_init.clone()),
|
||||||
|
))?);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Self::Array(values)
|
||||||
} else {
|
} else {
|
||||||
unreachable!("dimensions are checked for zero");
|
unreachable!("dimensions are checked for zero");
|
||||||
}
|
}
|
||||||
@ -132,14 +128,10 @@ impl TryFrom<(Type, Expression)> for InputValue {
|
|||||||
|
|
||||||
Self::Tuple(elements)
|
Self::Tuple(elements)
|
||||||
}
|
}
|
||||||
(Type::Array(element_type, dimensions), Expression::ArrayInline(array_inline)) => {
|
(Type::Array(element_type, _dimensions), Expression::ArrayInline(array_inline)) => {
|
||||||
let mut elements = Vec::with_capacity(array_inline.elements.len());
|
let mut elements = Vec::with_capacity(array_inline.elements.len());
|
||||||
let span = array_inline.span().clone();
|
let span = array_inline.span().clone();
|
||||||
|
|
||||||
if !dimensions.is_specified() {
|
|
||||||
return Err(InputError::array_dimensions_must_be_specified(&span).into());
|
|
||||||
}
|
|
||||||
|
|
||||||
for element in array_inline.elements.into_iter() {
|
for element in array_inline.elements.into_iter() {
|
||||||
if let SpreadOrExpression::Expression(value_expression) = element {
|
if let SpreadOrExpression::Expression(value_expression) = element {
|
||||||
elements.push(Self::try_from((*element_type.clone(), value_expression))?);
|
elements.push(Self::try_from((*element_type.clone(), value_expression))?);
|
||||||
|
@ -89,11 +89,6 @@ impl Type {
|
|||||||
let mut left_dims = left_dims.to_owned();
|
let mut left_dims = left_dims.to_owned();
|
||||||
let mut right_dims = right_dims.to_owned();
|
let mut right_dims = right_dims.to_owned();
|
||||||
|
|
||||||
// Unable to compare arrays with unspecified sizes.
|
|
||||||
if !left_dims.is_specified() || !right_dims.is_specified() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove the first element from both dimensions.
|
// Remove the first element from both dimensions.
|
||||||
let left_first = left_dims.remove_first();
|
let left_first = left_dims.remove_first();
|
||||||
let right_first = right_dims.remove_first();
|
let right_first = right_dims.remove_first();
|
||||||
|
@ -59,12 +59,12 @@ impl ParserContext<'_> {
|
|||||||
|
|
||||||
/// Returns an [`ArrayDimensions`] AST node if the next tokens represent dimensions for an array type.
|
/// Returns an [`ArrayDimensions`] AST node if the next tokens represent dimensions for an array type.
|
||||||
pub fn parse_array_dimensions(&mut self) -> Result<ArrayDimensions> {
|
pub fn parse_array_dimensions(&mut self) -> Result<ArrayDimensions> {
|
||||||
Ok(if let Some(dim) = self.parse_array_dimension() {
|
Ok(if let Some((dim, _)) = self.eat_int() {
|
||||||
ArrayDimensions(smallvec![dim])
|
ArrayDimensions(smallvec![dim])
|
||||||
} else {
|
} else {
|
||||||
let mut had_item_err = false;
|
let mut had_item_err = false;
|
||||||
let (dims, _, span) = self.parse_paren_comma_list(|p| {
|
let (dims, _, span) = self.parse_paren_comma_list(|p| {
|
||||||
Ok(if let Some(dim) = p.parse_array_dimension() {
|
Ok(if let Some((dim, _)) = p.eat_int() {
|
||||||
Some(dim)
|
Some(dim)
|
||||||
} else {
|
} else {
|
||||||
let token = p.expect_any()?;
|
let token = p.expect_any()?;
|
||||||
@ -80,17 +80,6 @@ impl ParserContext<'_> {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses a basic array dimension, i.e., an integer or `_`.
|
|
||||||
fn parse_array_dimension(&mut self) -> Option<Dimension> {
|
|
||||||
if let Some((int, _)) = self.eat_int() {
|
|
||||||
Some(Dimension::Number(int))
|
|
||||||
} else if self.eat(Token::Underscore).is_some() {
|
|
||||||
Some(Dimension::Unspecified)
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns a [`(Type, Span)`] tuple of AST nodes if the next token represents a type.
|
/// Returns a [`(Type, Span)`] tuple of AST nodes if the next token represents a type.
|
||||||
/// Also returns the span of the parsed token.
|
/// Also returns the span of the parsed token.
|
||||||
pub fn parse_type(&mut self) -> Result<(Type, Span)> {
|
pub fn parse_type(&mut self) -> Result<(Type, Span)> {
|
||||||
|
@ -1002,34 +1002,24 @@ An array type consists of an element type
|
|||||||
and an indication of dimensions.
|
and an indication of dimensions.
|
||||||
There is either a single dimension,
|
There is either a single dimension,
|
||||||
or a tuple of one or more dimensions.
|
or a tuple of one or more dimensions.
|
||||||
Each dimension is either a natural or is unspecified.
|
Each dimension is a natural.
|
||||||
|
|
||||||
<a name="array-type"></a>
|
<a name="array-type"></a>
|
||||||
```abnf
|
```abnf
|
||||||
array-type = "[" type ";" array-type-dimensions "]"
|
array-type = "[" type ";" array-dimensions "]"
|
||||||
```
|
```
|
||||||
|
|
||||||
Go to: _[array-type-dimensions](#user-content-array-type-dimensions), [type](#user-content-type)_;
|
Go to: _[array-dimensions](#user-content-array-dimensions), [type](#user-content-type)_;
|
||||||
|
|
||||||
|
|
||||||
<a name="array-type-dimension"></a>
|
<a name="array-dimensions"></a>
|
||||||
```abnf
|
```abnf
|
||||||
array-type-dimension = natural / "_"
|
array-dimensions = natural / "(" natural *( "," natural ) ")"
|
||||||
```
|
```
|
||||||
|
|
||||||
Go to: _[natural](#user-content-natural)_;
|
Go to: _[natural](#user-content-natural)_;
|
||||||
|
|
||||||
|
|
||||||
<a name="array-type-dimensions"></a>
|
|
||||||
```abnf
|
|
||||||
array-type-dimensions = array-type-dimension
|
|
||||||
/ "(" array-type-dimension
|
|
||||||
*( "," array-type-dimension ) [","] ")"
|
|
||||||
```
|
|
||||||
|
|
||||||
Go to: _[array-type-dimension](#user-content-array-type-dimension)_;
|
|
||||||
|
|
||||||
|
|
||||||
The keyword `Self` denotes the enclosing circuit type.
|
The keyword `Self` denotes the enclosing circuit type.
|
||||||
It is only allowed inside a circuit type declaration.
|
It is only allowed inside a circuit type declaration.
|
||||||
|
|
||||||
@ -1203,19 +1193,10 @@ Go to: _[expression](#user-content-expression)_;
|
|||||||
|
|
||||||
<a name="array-repeat-construction"></a>
|
<a name="array-repeat-construction"></a>
|
||||||
```abnf
|
```abnf
|
||||||
array-repeat-construction = "[" expression ";" array-expression-dimensions "]"
|
array-repeat-construction = "[" expression ";" array-dimensions "]"
|
||||||
```
|
```
|
||||||
|
|
||||||
Go to: _[array-expression-dimensions](#user-content-array-expression-dimensions), [expression](#user-content-expression)_;
|
Go to: _[array-dimensions](#user-content-array-dimensions), [expression](#user-content-expression)_;
|
||||||
|
|
||||||
|
|
||||||
<a name="array-expression-dimensions"></a>
|
|
||||||
```abnf
|
|
||||||
array-expression-dimensions = natural
|
|
||||||
/ "(" natural *( "," natural ) ")"
|
|
||||||
```
|
|
||||||
|
|
||||||
Go to: _[natural](#user-content-natural)_;
|
|
||||||
|
|
||||||
|
|
||||||
<a name="array-construction"></a>
|
<a name="array-construction"></a>
|
||||||
|
@ -645,15 +645,11 @@ tuple-type = "(" [ type 1*( "," type ) ] ")"
|
|||||||
; and an indication of dimensions.
|
; and an indication of dimensions.
|
||||||
; There is either a single dimension,
|
; There is either a single dimension,
|
||||||
; or a tuple of one or more dimensions.
|
; or a tuple of one or more dimensions.
|
||||||
; Each dimension is either a natural or is unspecified.
|
; Each dimension is a natural.
|
||||||
|
|
||||||
array-type = "[" type ";" array-type-dimensions "]"
|
array-type = "[" type ";" array-dimensions "]"
|
||||||
|
|
||||||
array-type-dimension = natural / "_"
|
array-dimensions = natural / "(" natural *( "," natural ) ")"
|
||||||
|
|
||||||
array-type-dimensions = array-type-dimension
|
|
||||||
/ "(" array-type-dimension
|
|
||||||
*( "," array-type-dimension ) [","] ")"
|
|
||||||
|
|
||||||
; The keyword `Self` denotes the enclosing circuit type.
|
; The keyword `Self` denotes the enclosing circuit type.
|
||||||
; It is only allowed inside a circuit type declaration.
|
; It is only allowed inside a circuit type declaration.
|
||||||
@ -751,10 +747,7 @@ array-inline-construction = "["
|
|||||||
|
|
||||||
array-inline-element = expression / "..." expression
|
array-inline-element = expression / "..." expression
|
||||||
|
|
||||||
array-repeat-construction = "[" expression ";" array-expression-dimensions "]"
|
array-repeat-construction = "[" expression ";" array-dimensions "]"
|
||||||
|
|
||||||
array-expression-dimensions = natural
|
|
||||||
/ "(" natural *( "," natural ) ")"
|
|
||||||
|
|
||||||
array-construction = array-inline-construction / array-repeat-construction
|
array-construction = array-inline-construction / array-repeat-construction
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
[main]
|
[main]
|
||||||
a: u32 = 1;
|
y: bool = true;
|
||||||
b: u32 = 2;
|
|
||||||
|
|
||||||
[registers]
|
[registers]
|
||||||
r0: u32 = 0;
|
r0: bool = false;
|
||||||
|
@ -1,5 +1,11 @@
|
|||||||
// The 'hello-world' main function.
|
// The 'hello-world' main function.
|
||||||
function main(a: u32, b: u32) -> u32 {
|
type str = [char; _];
|
||||||
let c: u32 = a + b;
|
|
||||||
return c;
|
function main(y: bool) -> bool {
|
||||||
|
let s = "abc";
|
||||||
|
return (first_el(s) == 'a') == y;
|
||||||
|
}
|
||||||
|
|
||||||
|
function first_el(s: str) -> char {
|
||||||
|
return s[0];
|
||||||
}
|
}
|
||||||
|
@ -312,12 +312,4 @@ create_errors!(
|
|||||||
msg: format!("Tried to assign to static member `{}`", member),
|
msg: format!("Tried to assign to static member `{}`", member),
|
||||||
help: None,
|
help: None,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// For when arrays with unspecified size are used in main.
|
|
||||||
@formatted
|
|
||||||
input_array_size_must_be_specified {
|
|
||||||
args: (),
|
|
||||||
msg: "arrays in main function input must have known size",
|
|
||||||
help: None,
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
|
@ -46,14 +46,6 @@ create_errors!(
|
|||||||
help: None,
|
help: None,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// For when [`ArrayDimensions`] are not specified.
|
|
||||||
@formatted
|
|
||||||
array_dimensions_must_be_specified {
|
|
||||||
args: (),
|
|
||||||
msg: "array dimensions must be specified",
|
|
||||||
help: None,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// For when array init is using spread.
|
/// For when array init is using spread.
|
||||||
@formatted
|
@formatted
|
||||||
array_spread_is_not_allowed {
|
array_spread_is_not_allowed {
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
/*
|
|
||||||
namespace: Compile
|
|
||||||
expectation: Fail
|
|
||||||
*/
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
let x: [u8; _] = [1u8,2];
|
|
||||||
let z: bool = x == [1u8,2,3]; // array size mismatch
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
/*
|
|
||||||
namespace: Compile
|
|
||||||
expectation: Pass
|
|
||||||
input_file: input/dummy.in
|
|
||||||
*/
|
|
||||||
|
|
||||||
function main(y: bool) -> bool {
|
|
||||||
let d: [u8; _] = [1,2,3,4];
|
|
||||||
return d == [1,2,3,4];
|
|
||||||
}
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
|||||||
/*
|
|
||||||
namespace: Compile
|
|
||||||
expectation: Pass
|
|
||||||
input_file: input/dummy.in
|
|
||||||
*/
|
|
||||||
|
|
||||||
function main(y: bool) -> bool {
|
|
||||||
return (first_el([1,2,3,4]) == 1) == y;
|
|
||||||
}
|
|
||||||
|
|
||||||
function first_el(arr: [u8; _]) -> u8 {
|
|
||||||
return arr[0];
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
[main]
|
|
||||||
y: bool = true;
|
|
||||||
n: bool = false;
|
|
||||||
a: [char; 11] = "hello world";
|
|
||||||
|
|
||||||
[registers]
|
|
||||||
r0: bool = false;
|
|
@ -1,9 +0,0 @@
|
|||||||
/*
|
|
||||||
namespace: Compile
|
|
||||||
expectation: Pass
|
|
||||||
input_file: input/dummy.in
|
|
||||||
*/
|
|
||||||
|
|
||||||
function main(a: [char; 11], y: bool) -> bool {
|
|
||||||
return y == (a.len() == 11);
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
/*
|
|
||||||
namespace: Compile
|
|
||||||
expectation: Pass
|
|
||||||
input_file: input/dummy.in
|
|
||||||
*/
|
|
||||||
|
|
||||||
function main(y: bool) -> bool {
|
|
||||||
let x = 0u8;
|
|
||||||
for i in 0..strlen("I swear to god I had something for this") {
|
|
||||||
x += 1;
|
|
||||||
}
|
|
||||||
return (x == 39) == y;
|
|
||||||
}
|
|
||||||
|
|
||||||
function strlen(str: [char; _]) -> u32 {
|
|
||||||
return str.len();
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
/*
|
|
||||||
namespace: Compile
|
|
||||||
expectation: Pass
|
|
||||||
input_file: input/dummy.in
|
|
||||||
*/
|
|
||||||
|
|
||||||
type str = [char; _];
|
|
||||||
|
|
||||||
function main(y: bool) -> bool {
|
|
||||||
let s = "abc";
|
|
||||||
return (first_el(s) == 'a') == y;
|
|
||||||
}
|
|
||||||
|
|
||||||
function first_el(s: str) -> char {
|
|
||||||
return s[0];
|
|
||||||
}
|
|
@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
namespace: Compile
|
|
||||||
expectation: Fail
|
|
||||||
outputs:
|
|
||||||
- "Error [ECMP0376093]: array sizes must match for comparison; left: 2, right: 3\n --> compiler-test:5:19\n |\n 5 | let z: bool = x == [1u8,2,3]; // array size mismatch\n | ^^^^^^^^^^^^^^"
|
|
@ -1,22 +0,0 @@
|
|||||||
---
|
|
||||||
namespace: Compile
|
|
||||||
expectation: Pass
|
|
||||||
outputs:
|
|
||||||
- circuit:
|
|
||||||
num_public_variables: 0
|
|
||||||
num_private_variables: 1
|
|
||||||
num_constraints: 1
|
|
||||||
at: 042610d0fd1fe6d6ac112138f8755752f44c7d2a00f1b5960574d6da5cda393f
|
|
||||||
bt: e97756698880ab7555a959a5fb5c6b4e15bd64612aa677adbfe2d0bd91f0a83c
|
|
||||||
ct: cf1cbb66a638b4860a516671fb74850e6ccf787fe6c4c8d29e9c04efe880bd05
|
|
||||||
output:
|
|
||||||
- input_file: input/dummy.in
|
|
||||||
output:
|
|
||||||
registers:
|
|
||||||
r0:
|
|
||||||
type: bool
|
|
||||||
value: "true"
|
|
||||||
initial_ast: 71e25416f4a31045a847f29df48d5e9cce19d0df31c479761f2387eca4bb759f
|
|
||||||
imports_resolved_ast: a408ca2965d8d63856b1f95385746d5be9825b646e7f97a5fd3203638681292c
|
|
||||||
canonicalized_ast: a408ca2965d8d63856b1f95385746d5be9825b646e7f97a5fd3203638681292c
|
|
||||||
type_inferenced_ast: 88e5b982b094f07cc0337812b4965b655c020bdebfa1ad7ac8fd2ddd3c730b8b
|
|
@ -1,22 +0,0 @@
|
|||||||
---
|
|
||||||
namespace: Compile
|
|
||||||
expectation: Pass
|
|
||||||
outputs:
|
|
||||||
- circuit:
|
|
||||||
num_public_variables: 0
|
|
||||||
num_private_variables: 1
|
|
||||||
num_constraints: 1
|
|
||||||
at: 042610d0fd1fe6d6ac112138f8755752f44c7d2a00f1b5960574d6da5cda393f
|
|
||||||
bt: e97756698880ab7555a959a5fb5c6b4e15bd64612aa677adbfe2d0bd91f0a83c
|
|
||||||
ct: cf1cbb66a638b4860a516671fb74850e6ccf787fe6c4c8d29e9c04efe880bd05
|
|
||||||
output:
|
|
||||||
- input_file: input/dummy.in
|
|
||||||
output:
|
|
||||||
registers:
|
|
||||||
r0:
|
|
||||||
type: bool
|
|
||||||
value: "true"
|
|
||||||
initial_ast: d6d3ebe6a0b7f19e51d245d715706122577777a8325459df7db2c08ee5f841bd
|
|
||||||
imports_resolved_ast: 675c0542777db276ce7a39decb9dc5aacfde6b00ebfeb3982c480ed531a79be5
|
|
||||||
canonicalized_ast: 675c0542777db276ce7a39decb9dc5aacfde6b00ebfeb3982c480ed531a79be5
|
|
||||||
type_inferenced_ast: ae8cbfc3938971fc0e42fa400b1277d288ea4b7d4d8149b452fce81ae4813315
|
|
@ -1,22 +0,0 @@
|
|||||||
---
|
|
||||||
namespace: Compile
|
|
||||||
expectation: Pass
|
|
||||||
outputs:
|
|
||||||
- circuit:
|
|
||||||
num_public_variables: 0
|
|
||||||
num_private_variables: 12
|
|
||||||
num_constraints: 1
|
|
||||||
at: 336f487fe39f24aef980deaaf7d6dddcc0dbfa8f121c3470b05546c1ac13f87e
|
|
||||||
bt: ae35381db5558456a49acb22132b4930efd53b90eb2668df06c5d9c1a6b0ab9f
|
|
||||||
ct: cf1cbb66a638b4860a516671fb74850e6ccf787fe6c4c8d29e9c04efe880bd05
|
|
||||||
output:
|
|
||||||
- input_file: input/dummy.in
|
|
||||||
output:
|
|
||||||
registers:
|
|
||||||
r0:
|
|
||||||
type: bool
|
|
||||||
value: "true"
|
|
||||||
initial_ast: be4b4279f79a35306e1edf5086275a2b216e9d46d66b9bb5fbf650062b7cd263
|
|
||||||
imports_resolved_ast: c4aae9410df8034a7744ec5f1998454bacde915ddaadfab42181528f1923f742
|
|
||||||
canonicalized_ast: c4aae9410df8034a7744ec5f1998454bacde915ddaadfab42181528f1923f742
|
|
||||||
type_inferenced_ast: 0f8434f9e0430dc238602c0479a928be87101566dc0e9ae60ab9f4f1339ef313
|
|
@ -1,22 +0,0 @@
|
|||||||
---
|
|
||||||
namespace: Compile
|
|
||||||
expectation: Pass
|
|
||||||
outputs:
|
|
||||||
- circuit:
|
|
||||||
num_public_variables: 0
|
|
||||||
num_private_variables: 1
|
|
||||||
num_constraints: 1
|
|
||||||
at: 042610d0fd1fe6d6ac112138f8755752f44c7d2a00f1b5960574d6da5cda393f
|
|
||||||
bt: e97756698880ab7555a959a5fb5c6b4e15bd64612aa677adbfe2d0bd91f0a83c
|
|
||||||
ct: cf1cbb66a638b4860a516671fb74850e6ccf787fe6c4c8d29e9c04efe880bd05
|
|
||||||
output:
|
|
||||||
- input_file: input/dummy.in
|
|
||||||
output:
|
|
||||||
registers:
|
|
||||||
r0:
|
|
||||||
type: bool
|
|
||||||
value: "true"
|
|
||||||
initial_ast: cb9419739db39f806ff96983f53aa085a96238833ed754293042724dd3b29704
|
|
||||||
imports_resolved_ast: 675a67a8dae0a33a273d74ec021df0e23c5ed7cb32faf8efd2d2f087979de039
|
|
||||||
canonicalized_ast: b75d02c7cadbcd2906ad0d7b6376bbdc32ff1f26348913e2b0a84ced7496a2f6
|
|
||||||
type_inferenced_ast: 87ee95068efb0a58e18f2e3b8668db8d2ad9826b21e8b8ce6bc26f60c9fe88ca
|
|
@ -1,22 +0,0 @@
|
|||||||
---
|
|
||||||
namespace: Compile
|
|
||||||
expectation: Pass
|
|
||||||
outputs:
|
|
||||||
- circuit:
|
|
||||||
num_public_variables: 0
|
|
||||||
num_private_variables: 4
|
|
||||||
num_constraints: 5
|
|
||||||
at: e2c343f33b3c986318d821645015951a2f3fb198915bbf602e2c3e58ebfb9c73
|
|
||||||
bt: 71744948a918814d3008831b4b73101a5cf7346e6ff62d98968eb8b3b91aa343
|
|
||||||
ct: 94757fb2316d68d18fd26e96a2992b03a8db8d49d802b34201dce6f12518676b
|
|
||||||
output:
|
|
||||||
- input_file: input/dummy.in
|
|
||||||
output:
|
|
||||||
registers:
|
|
||||||
r0:
|
|
||||||
type: bool
|
|
||||||
value: "true"
|
|
||||||
initial_ast: 712ed2b7c1ddf180a39cd1bf83c7a4ca3de909a14f87250ec445ba6ae6aa6597
|
|
||||||
imports_resolved_ast: 36d9e14cf42065047dc21a5c68f45d3264dc0d38eb53355d3f9fef7bd7d512b1
|
|
||||||
canonicalized_ast: f1edababa6847e2ca24a0786bc1a0b2e66f0d60f5b11c59a24c8b1503f893092
|
|
||||||
type_inferenced_ast: c979556f787eb3190b0c4cec3d5a6baabbf64d32f7e3281c784f83262da33205
|
|
@ -1,68 +0,0 @@
|
|||||||
---
|
|
||||||
namespace: Parse
|
|
||||||
expectation: Pass
|
|
||||||
outputs:
|
|
||||||
- name: ""
|
|
||||||
expected_input: []
|
|
||||||
import_statements: []
|
|
||||||
imports: {}
|
|
||||||
aliases: {}
|
|
||||||
circuits: {}
|
|
||||||
global_consts: {}
|
|
||||||
functions:
|
|
||||||
"{\"name\":\"x\",\"span\":\"{\\\"line_start\\\":3,\\\"line_stop\\\":3,\\\"col_start\\\":10,\\\"col_stop\\\":11,\\\"path\\\":\\\"\\\",\\\"content\\\":\\\"function x(x: [u8; _]) {\\\"}\"}":
|
|
||||||
annotations: {}
|
|
||||||
identifier: "{\"name\":\"x\",\"span\":\"{\\\"line_start\\\":3,\\\"line_stop\\\":3,\\\"col_start\\\":10,\\\"col_stop\\\":11,\\\"path\\\":\\\"\\\",\\\"content\\\":\\\"function x(x: [u8; _]) {\\\"}\"}"
|
|
||||||
input:
|
|
||||||
- Variable:
|
|
||||||
identifier: "{\"name\":\"x\",\"span\":\"{\\\"line_start\\\":3,\\\"line_stop\\\":3,\\\"col_start\\\":12,\\\"col_stop\\\":13,\\\"path\\\":\\\"\\\",\\\"content\\\":\\\"function x(x: [u8; _]) {\\\"}\"}"
|
|
||||||
const_: false
|
|
||||||
mutable: true
|
|
||||||
type_:
|
|
||||||
Array:
|
|
||||||
- IntegerType: U8
|
|
||||||
- - value: "0"
|
|
||||||
span:
|
|
||||||
line_start: 3
|
|
||||||
line_stop: 3
|
|
||||||
col_start: 12
|
|
||||||
col_stop: 13
|
|
||||||
path: ""
|
|
||||||
content: "function x(x: [u8; _]) {"
|
|
||||||
const_: false
|
|
||||||
output: ~
|
|
||||||
core_mapping: ~
|
|
||||||
block:
|
|
||||||
statements:
|
|
||||||
- Return:
|
|
||||||
expression:
|
|
||||||
TupleInit:
|
|
||||||
elements: []
|
|
||||||
span:
|
|
||||||
line_start: 4
|
|
||||||
line_stop: 4
|
|
||||||
col_start: 12
|
|
||||||
col_stop: 14
|
|
||||||
path: ""
|
|
||||||
content: " return ();"
|
|
||||||
span:
|
|
||||||
line_start: 4
|
|
||||||
line_stop: 4
|
|
||||||
col_start: 5
|
|
||||||
col_stop: 14
|
|
||||||
path: ""
|
|
||||||
content: " return ();"
|
|
||||||
span:
|
|
||||||
line_start: 3
|
|
||||||
line_stop: 5
|
|
||||||
col_start: 24
|
|
||||||
col_stop: 2
|
|
||||||
path: ""
|
|
||||||
content: "function x(x: [u8; _]) {\n ...\n}"
|
|
||||||
span:
|
|
||||||
line_start: 3
|
|
||||||
line_stop: 5
|
|
||||||
col_start: 1
|
|
||||||
col_stop: 2
|
|
||||||
path: ""
|
|
||||||
content: "function x(x: [u8; _]) {\n ...\n}"
|
|
@ -1513,53 +1513,6 @@ outputs:
|
|||||||
col_stop: 14
|
col_stop: 14
|
||||||
path: ""
|
path: ""
|
||||||
content: "let (x,) = ();"
|
content: "let (x,) = ();"
|
||||||
- Definition:
|
|
||||||
declaration_type: Let
|
|
||||||
variable_names:
|
|
||||||
- mutable: true
|
|
||||||
identifier: "{\"name\":\"x\",\"span\":\"{\\\"line_start\\\":1,\\\"line_stop\\\":1,\\\"col_start\\\":5,\\\"col_stop\\\":6,\\\"path\\\":\\\"\\\",\\\"content\\\":\\\"let x: [char; _] = \\\\\\\"Hello, World!\\\\\\\";\\\"}\"}"
|
|
||||||
span:
|
|
||||||
line_start: 1
|
|
||||||
line_stop: 1
|
|
||||||
col_start: 5
|
|
||||||
col_stop: 6
|
|
||||||
path: ""
|
|
||||||
content: "let x: [char; _] = \"Hello, World!\";"
|
|
||||||
parened: false
|
|
||||||
type_:
|
|
||||||
Array:
|
|
||||||
- Char
|
|
||||||
- - value: "0"
|
|
||||||
value:
|
|
||||||
Value:
|
|
||||||
String:
|
|
||||||
- - Scalar: 72
|
|
||||||
- Scalar: 101
|
|
||||||
- Scalar: 108
|
|
||||||
- Scalar: 108
|
|
||||||
- Scalar: 111
|
|
||||||
- Scalar: 44
|
|
||||||
- Scalar: 32
|
|
||||||
- Scalar: 87
|
|
||||||
- Scalar: 111
|
|
||||||
- Scalar: 114
|
|
||||||
- Scalar: 108
|
|
||||||
- Scalar: 100
|
|
||||||
- Scalar: 33
|
|
||||||
- span:
|
|
||||||
line_start: 1
|
|
||||||
line_stop: 1
|
|
||||||
col_start: 20
|
|
||||||
col_stop: 35
|
|
||||||
path: ""
|
|
||||||
content: "let x: [char; _] = \"Hello, World!\";"
|
|
||||||
span:
|
|
||||||
line_start: 1
|
|
||||||
line_stop: 1
|
|
||||||
col_start: 1
|
|
||||||
col_stop: 35
|
|
||||||
path: ""
|
|
||||||
content: "let x: [char; _] = \"Hello, World!\";"
|
|
||||||
- Definition:
|
- Definition:
|
||||||
declaration_type: Let
|
declaration_type: Let
|
||||||
variable_names:
|
variable_names:
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
/*
|
|
||||||
namespace: Parse
|
|
||||||
expectation: Pass
|
|
||||||
*/
|
|
||||||
|
|
||||||
function x(x: [u8; _]) {
|
|
||||||
return ();
|
|
||||||
}
|
|
@ -99,7 +99,4 @@ let (x,y,) = ();
|
|||||||
|
|
||||||
let (x,) = ();
|
let (x,) = ();
|
||||||
|
|
||||||
|
|
||||||
let x: [char; _] = "Hello, World!";
|
|
||||||
|
|
||||||
let x: [[u8; 2]; 2] = [[0,0], [0,0]];
|
let x: [[u8; 2]; 2] = [[0,0], [0,0]];
|
||||||
|
Loading…
Reference in New Issue
Block a user