v2: move index expr type check
							parent
							
								
									2d5c70832c
								
							
						
					
					
						commit
						d918903252
					
				|  | @ -8,11 +8,11 @@ import ( | ||||||
| 	v.table | 	v.table | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| pub type Expr = InfixExpr | IfExpr | StringLiteral | IntegerLiteral | | pub type Expr = InfixExpr | IfExpr | StringLiteral | IntegerLiteral | 	 | ||||||
| FloatLiteral | Ident | CallExpr | BoolLiteral | StructInit | ArrayInit | SelectorExpr | PostfixExpr | | FloatLiteral | Ident | CallExpr | BoolLiteral | StructInit | ArrayInit | SelectorExpr | PostfixExpr | 	 | ||||||
| AssignExpr | PrefixExpr | MethodCallExpr | IndexExpr | RangeExpr | AssignExpr | PrefixExpr | MethodCallExpr | IndexExpr | RangeExpr | ||||||
| 
 | 
 | ||||||
| pub type Stmt = VarDecl | GlobalDecl | FnDecl | Return | Module | Import | ExprStmt | | pub type Stmt = VarDecl | GlobalDecl | FnDecl | Return | Module | Import | ExprStmt | 	 | ||||||
| ForStmt | StructDecl | ForCStmt | ForInStmt | CompIf | ConstDecl | Attr | ForStmt | StructDecl | ForCStmt | ForInStmt | CompIf | ConstDecl | Attr | ||||||
| // | IncDecStmt k
 | // | IncDecStmt k
 | ||||||
| // Stand-alone expression in a statement list.
 | // Stand-alone expression in a statement list.
 | ||||||
|  | @ -246,9 +246,10 @@ pub: | ||||||
| pub struct IndexExpr { | pub struct IndexExpr { | ||||||
| pub: | pub: | ||||||
| // op   token.Kind
 | // op   token.Kind
 | ||||||
|  | 	pos   token.Position | ||||||
| 	left  Expr | 	left  Expr | ||||||
| 	index Expr // [0], [start..end] etc
 | 	index Expr // [0], [start..end] etc
 | ||||||
| 	typ table.Type | 	typ   table.Type | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub struct IfExpr { | pub struct IfExpr { | ||||||
|  |  | ||||||
|  | @ -284,9 +284,22 @@ pub fn (c &Checker) expr(node ast.Expr) table.Type { | ||||||
| 			return c.selector_expr(it) | 			return c.selector_expr(it) | ||||||
| 		} | 		} | ||||||
| 		ast.IndexExpr { | 		ast.IndexExpr { | ||||||
| 			// c.expr(it.left)
 | 			mut typ := c.expr(it.left) | ||||||
|  | 			if typ.name.starts_with('array_') { | ||||||
|  | 				elm_typ := typ.name[6..] | ||||||
|  | 				// TODO `typ = ... or ...`
 | ||||||
|  | 				x := c.table.find_type(elm_typ) or { | ||||||
|  | 					c.error(elm_typ, it.pos) | ||||||
|  | 					exit(0) | ||||||
|  | 				} | ||||||
|  | 				typ = x | ||||||
|  | 			} | ||||||
|  | 			else { | ||||||
|  | 				typ = table.int_type | ||||||
|  | 			} | ||||||
|  | 			return typ | ||||||
| 			// c.expr(it.index)
 | 			// c.expr(it.index)
 | ||||||
| 			return it.typ | 			//return it.typ
 | ||||||
| 		} | 		} | ||||||
| 		ast.IfExpr { | 		ast.IfExpr { | ||||||
| 			typ := c.expr(it.cond) | 			typ := c.expr(it.cond) | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| void foo(int a); | void foo(int a); | ||||||
| int get_int(string a); | int get_int(string a); | ||||||
|  | bool get_bool(); | ||||||
| int get_int2(); | int get_int2(); | ||||||
| void myuser(); | void myuser(); | ||||||
| multi_return_int_string multi_return(); | multi_return_int_string multi_return(); | ||||||
|  | @ -51,12 +52,17 @@ i < 10; i++; | ||||||
| 	int n = get_int2(); | 	int n = get_int2(); | ||||||
| 	bool q = true || false; | 	bool q = true || false; | ||||||
| 	bool b2 = bools[0] || true; | 	bool b2 = bools[0] || true; | ||||||
|  | 	bool b3 = get_bool() || true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int get_int(string a) { | int get_int(string a) { | ||||||
| 	return 10; | 	return 10; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | bool get_bool() { | ||||||
|  | 	return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| int get_int2() { | int get_int2() { | ||||||
| 	string a = tos3("hello"); | 	string a = tos3("hello"); | ||||||
| 	return get_int(a); | 	return get_int(a); | ||||||
|  |  | ||||||
|  | @ -52,12 +52,17 @@ fn foo(a int) { | ||||||
| 	n := get_int2() | 	n := get_int2() | ||||||
| 	q := true || false | 	q := true || false | ||||||
| 	b2 := bools[0] || true | 	b2 := bools[0] || true | ||||||
|  | 	b3 := get_bool() || true | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn get_int(a string) int { | fn get_int(a string) int { | ||||||
| 	return 10 | 	return 10 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | fn get_bool() bool { | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  | 
 | ||||||
| fn get_int2() int { | fn get_int2() int { | ||||||
| 	a := 'hello' | 	a := 'hello' | ||||||
| 	//return get_int('sdf')
 | 	//return get_int('sdf')
 | ||||||
|  |  | ||||||
|  | @ -77,9 +77,15 @@ fn (p mut Parser) fn_decl(/*high bool*/) ast.FnDecl { | ||||||
| 	} | 	} | ||||||
| 	mut name := '' | 	mut name := '' | ||||||
| 	if p.tok.kind == .name { | 	if p.tok.kind == .name { | ||||||
| 		// TODO
 | 		// TODO high
 | ||||||
| 		name = p.check_name() | 		name = p.check_name() | ||||||
| 	} | 	} | ||||||
|  | 	// <T>
 | ||||||
|  | 	if p.tok.kind == .lt { | ||||||
|  | 		p.next() | ||||||
|  | 		p.next() | ||||||
|  | 		p.check(.gt) | ||||||
|  | 	} | ||||||
| 	// println('fn decl $name')
 | 	// println('fn decl $name')
 | ||||||
| 	p.check(.lpar) | 	p.check(.lpar) | ||||||
| 	// Args
 | 	// Args
 | ||||||
|  |  | ||||||
|  | @ -399,7 +399,7 @@ pub fn (p mut Parser) name_expr() (ast.Expr,table.Type) { | ||||||
| 				typ: typ | 				typ: typ | ||||||
| 				name: ident.name | 				name: ident.name | ||||||
| 				// expr: p.expr(0)// var.expr
 | 				// expr: p.expr(0)// var.expr
 | ||||||
| 
 | 				 | ||||||
| 			} | 			} | ||||||
| 			// ident.ti = ti
 | 			// ident.ti = ti
 | ||||||
| 			node = ident | 			node = ident | ||||||
|  | @ -738,7 +738,7 @@ fn (p mut Parser) if_expr() (ast.Expr,table.Type) { | ||||||
| 		ti: ti | 		ti: ti | ||||||
| 		pos: p.tok.position() | 		pos: p.tok.position() | ||||||
| 		// left: left
 | 		// left: left
 | ||||||
| 
 | 		 | ||||||
| 	} | 	} | ||||||
| 	return node,ti | 	return node,ti | ||||||
| } | } | ||||||
|  | @ -901,7 +901,7 @@ fn (p mut Parser) struct_decl() ast.StructDecl { | ||||||
| 		fields << table.Field{ | 		fields << table.Field{ | ||||||
| 			name: field_name | 			name: field_name | ||||||
| 			// type_idx: ti.idx
 | 			// type_idx: ti.idx
 | ||||||
| 
 | 			 | ||||||
| 			ti: ti | 			ti: ti | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -974,7 +974,7 @@ fn (p mut Parser) var_decl() ast.VarDecl { | ||||||
| 		name: name | 		name: name | ||||||
| 		is_mut: is_mut | 		is_mut: is_mut | ||||||
| 		// expr: expr
 | 		// expr: expr
 | ||||||
| 
 | 		 | ||||||
| 		typ: typ | 		typ: typ | ||||||
| 	}) | 	}) | ||||||
| 	p.warn('var decl name=$name typ=$typ.name') | 	p.warn('var decl name=$name typ=$typ.name') | ||||||
|  | @ -982,7 +982,7 @@ fn (p mut Parser) var_decl() ast.VarDecl { | ||||||
| 	node := ast.VarDecl{ | 	node := ast.VarDecl{ | ||||||
| 		name: name | 		name: name | ||||||
| 		expr: expr // p.expr(token.lowest_prec)
 | 		expr: expr // p.expr(token.lowest_prec)
 | ||||||
| 
 | 		 | ||||||
| 		is_mut: is_mut | 		is_mut: is_mut | ||||||
| 		typ: typ | 		typ: typ | ||||||
| 		pos: p.tok.position() | 		pos: p.tok.position() | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue