parser: perform constant folding before checking size of fixed array (#12126)
parent
093cab6f56
commit
3647fc6633
|
@ -3,6 +3,7 @@
|
||||||
// that can be found in the LICENSE file.
|
// that can be found in the LICENSE file.
|
||||||
module parser
|
module parser
|
||||||
|
|
||||||
|
import v.transformer
|
||||||
import v.ast
|
import v.ast
|
||||||
import v.util
|
import v.util
|
||||||
import v.token
|
import v.token
|
||||||
|
@ -26,7 +27,18 @@ pub fn (mut p Parser) parse_array_type() ast.Type {
|
||||||
if const_field.expr is ast.IntegerLiteral {
|
if const_field.expr is ast.IntegerLiteral {
|
||||||
fixed_size = const_field.expr.val.int()
|
fixed_size = const_field.expr.val.int()
|
||||||
} else {
|
} else {
|
||||||
show_non_const_error = true
|
if const_field.expr is ast.InfixExpr {
|
||||||
|
t := transformer.new_transformer(p.pref)
|
||||||
|
folded_expr := t.infix_expr(const_field.expr)
|
||||||
|
|
||||||
|
if folded_expr is ast.IntegerLiteral {
|
||||||
|
fixed_size = folded_expr.val.int()
|
||||||
|
} else {
|
||||||
|
show_non_const_error = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
show_non_const_error = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if p.pref.is_fmt {
|
if p.pref.is_fmt {
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
const (
|
||||||
|
c_a_s = 1
|
||||||
|
c_b_s = 1 + 1
|
||||||
|
c_c_s = c_b_s + 1 // this should be also fold by transformer since it's a constant
|
||||||
|
)
|
||||||
|
|
||||||
|
fn test_consant_array_size() {
|
||||||
|
mut a := [c_a_s]int{}
|
||||||
|
a = [1]!
|
||||||
|
mut b := [c_b_s]int{}
|
||||||
|
b = [1, 2]!
|
||||||
|
}
|
|
@ -26,7 +26,7 @@ pub fn (t Transformer) transform(ast_file &ast.File) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (t Transformer) stmt(mut node ast.Stmt) {
|
pub fn (t Transformer) stmt(mut node ast.Stmt) {
|
||||||
match mut node {
|
match mut node {
|
||||||
ast.EmptyStmt {}
|
ast.EmptyStmt {}
|
||||||
ast.NodeError {}
|
ast.NodeError {}
|
||||||
|
@ -88,14 +88,14 @@ fn (t Transformer) stmt(mut node ast.Stmt) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (t Transformer) expr(node ast.Expr) ast.Expr {
|
pub fn (t Transformer) expr(node ast.Expr) ast.Expr {
|
||||||
match node {
|
match node {
|
||||||
ast.InfixExpr { return t.infix_expr(node) }
|
ast.InfixExpr { return t.infix_expr(node) }
|
||||||
else { return node }
|
else { return node }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (t Transformer) infix_expr(original ast.InfixExpr) ast.Expr {
|
pub fn (t Transformer) infix_expr(original ast.InfixExpr) ast.Expr {
|
||||||
mut node := original
|
mut node := original
|
||||||
node.left = t.expr(node.left)
|
node.left = t.expr(node.left)
|
||||||
node.right = t.expr(node.right)
|
node.right = t.expr(node.right)
|
||||||
|
|
Loading…
Reference in New Issue