mirror of
https://github.com/vlang/v.git
synced 2025-09-13 22:42:26 +03:00
This commit is contained in:
parent
9d7fe51b6e
commit
2a6c1d9074
18 changed files with 91 additions and 58 deletions
|
@ -99,7 +99,7 @@ fn new_dense_array(key_bytes int, value_bytes int) DenseArray {
|
||||||
cap: cap
|
cap: cap
|
||||||
len: 0
|
len: 0
|
||||||
deletes: 0
|
deletes: 0
|
||||||
all_deleted: 0
|
all_deleted: unsafe { nil }
|
||||||
keys: unsafe { malloc(__at_least_one(u64(cap) * u64(key_bytes))) }
|
keys: unsafe { malloc(__at_least_one(u64(cap) * u64(key_bytes))) }
|
||||||
values: unsafe { malloc(__at_least_one(u64(cap) * u64(value_bytes))) }
|
values: unsafe { malloc(__at_least_one(u64(cap) * u64(value_bytes))) }
|
||||||
}
|
}
|
||||||
|
@ -679,9 +679,9 @@ fn (d &DenseArray) clone() DenseArray {
|
||||||
cap: d.cap
|
cap: d.cap
|
||||||
len: d.len
|
len: d.len
|
||||||
deletes: d.deletes
|
deletes: d.deletes
|
||||||
all_deleted: 0
|
all_deleted: unsafe { nil }
|
||||||
values: 0
|
values: unsafe { nil }
|
||||||
keys: 0
|
keys: unsafe { nil }
|
||||||
}
|
}
|
||||||
unsafe {
|
unsafe {
|
||||||
if d.deletes != 0 {
|
if d.deletes != 0 {
|
||||||
|
|
|
@ -23,7 +23,7 @@ fn new_dense_array_noscan(key_bytes int, key_noscan bool, value_bytes int, value
|
||||||
cap: cap
|
cap: cap
|
||||||
len: 0
|
len: 0
|
||||||
deletes: 0
|
deletes: 0
|
||||||
all_deleted: 0
|
all_deleted: unsafe { nil }
|
||||||
keys: __malloc_at_least_one(u64(cap) * u64(key_bytes), key_noscan)
|
keys: __malloc_at_least_one(u64(cap) * u64(key_bytes), key_noscan)
|
||||||
values: __malloc_at_least_one(u64(cap) * u64(value_bytes), value_noscan)
|
values: __malloc_at_least_one(u64(cap) * u64(value_bytes), value_noscan)
|
||||||
}
|
}
|
||||||
|
|
|
@ -445,7 +445,7 @@ pub fn new_context(cfg Config) &Context {
|
||||||
width: cfg.width
|
width: cfg.width
|
||||||
height: cfg.height
|
height: cfg.height
|
||||||
config: cfg
|
config: cfg
|
||||||
ft: 0
|
ft: unsafe { nil }
|
||||||
ui_mode: cfg.ui_mode
|
ui_mode: cfg.ui_mode
|
||||||
native_rendering: cfg.native_rendering
|
native_rendering: cfg.native_rendering
|
||||||
window: sapp.Desc{
|
window: sapp.Desc{
|
||||||
|
|
|
@ -470,7 +470,7 @@ fn parse_url(rawurl string, via_request bool) !URL {
|
||||||
return error(error_msg('parse_url: empty URL', rawurl))
|
return error(error_msg('parse_url: empty URL', rawurl))
|
||||||
}
|
}
|
||||||
mut url := URL{
|
mut url := URL{
|
||||||
user: 0
|
user: unsafe { nil }
|
||||||
}
|
}
|
||||||
if rawurl == '*' {
|
if rawurl == '*' {
|
||||||
url.path = '*'
|
url.path = '*'
|
||||||
|
|
|
@ -328,10 +328,10 @@ pub fn raw_execute(cmd string) Result {
|
||||||
}
|
}
|
||||||
proc_info := ProcessInformation{}
|
proc_info := ProcessInformation{}
|
||||||
start_info := StartupInfo{
|
start_info := StartupInfo{
|
||||||
lp_reserved2: 0
|
lp_reserved2: unsafe { nil }
|
||||||
lp_reserved: 0
|
lp_reserved: unsafe { nil }
|
||||||
lp_desktop: 0
|
lp_desktop: unsafe { nil }
|
||||||
lp_title: 0
|
lp_title: unsafe { nil }
|
||||||
cb: sizeof(C.PROCESS_INFORMATION)
|
cb: sizeof(C.PROCESS_INFORMATION)
|
||||||
h_std_input: child_stdin
|
h_std_input: child_stdin
|
||||||
h_std_output: child_stdout_write
|
h_std_output: child_stdout_write
|
||||||
|
|
|
@ -68,18 +68,18 @@ fn (mut p Process) win_spawn_process() int {
|
||||||
}
|
}
|
||||||
p.filename = abs_path(p.filename) // expand the path to an absolute one, in case we later change the working folder
|
p.filename = abs_path(p.filename) // expand the path to an absolute one, in case we later change the working folder
|
||||||
mut wdata := &WProcess{
|
mut wdata := &WProcess{
|
||||||
child_stdin: 0
|
child_stdin: unsafe { nil }
|
||||||
child_stdout_read: 0
|
child_stdout_read: unsafe { nil }
|
||||||
child_stdout_write: 0
|
child_stdout_write: unsafe { nil }
|
||||||
child_stderr_read: 0
|
child_stderr_read: unsafe { nil }
|
||||||
child_stderr_write: 0
|
child_stderr_write: unsafe { nil }
|
||||||
}
|
}
|
||||||
p.wdata = voidptr(wdata)
|
p.wdata = voidptr(wdata)
|
||||||
mut start_info := StartupInfo{
|
mut start_info := StartupInfo{
|
||||||
lp_reserved2: 0
|
lp_reserved2: unsafe { nil }
|
||||||
lp_reserved: 0
|
lp_reserved: unsafe { nil }
|
||||||
lp_desktop: 0
|
lp_desktop: unsafe { nil }
|
||||||
lp_title: 0
|
lp_title: unsafe { nil }
|
||||||
cb: sizeof(C.PROCESS_INFORMATION)
|
cb: sizeof(C.PROCESS_INFORMATION)
|
||||||
}
|
}
|
||||||
if p.use_stdio_ctl {
|
if p.use_stdio_ctl {
|
||||||
|
|
|
@ -82,8 +82,8 @@ fn new_channel_st(n u32, st u32) &Channel {
|
||||||
read_avail: 0
|
read_avail: 0
|
||||||
ringbuf: rbuf
|
ringbuf: rbuf
|
||||||
statusbuf: sbuf
|
statusbuf: sbuf
|
||||||
write_subscriber: 0
|
write_subscriber: unsafe { nil }
|
||||||
read_subscriber: 0
|
read_subscriber: unsafe { nil }
|
||||||
}
|
}
|
||||||
ch.writesem.init(wsem)
|
ch.writesem.init(wsem)
|
||||||
ch.readsem.init(rsem)
|
ch.readsem.init(rsem)
|
||||||
|
@ -105,8 +105,8 @@ fn new_channel_st_noscan(n u32, st u32) &Channel {
|
||||||
read_avail: 0
|
read_avail: 0
|
||||||
ringbuf: rbuf
|
ringbuf: rbuf
|
||||||
statusbuf: sbuf
|
statusbuf: sbuf
|
||||||
write_subscriber: 0
|
write_subscriber: unsafe { nil }
|
||||||
read_subscriber: 0
|
read_subscriber: unsafe { nil }
|
||||||
}
|
}
|
||||||
ch.writesem.init(wsem)
|
ch.writesem.init(wsem)
|
||||||
ch.readsem.init(rsem)
|
ch.readsem.init(rsem)
|
||||||
|
|
|
@ -96,9 +96,9 @@ pub fn (t &Table) panic(message string) {
|
||||||
pub fn new_table() &Table {
|
pub fn new_table() &Table {
|
||||||
mut t := &Table{
|
mut t := &Table{
|
||||||
global_scope: &Scope{
|
global_scope: &Scope{
|
||||||
parent: 0
|
parent: unsafe { nil }
|
||||||
}
|
}
|
||||||
cur_fn: 0
|
cur_fn: unsafe { nil }
|
||||||
}
|
}
|
||||||
t.register_builtin_type_symbols()
|
t.register_builtin_type_symbols()
|
||||||
t.is_fmt = true
|
t.is_fmt = true
|
||||||
|
|
|
@ -335,7 +335,7 @@ pub fn (mut c Checker) check_files(ast_files []&ast.File) {
|
||||||
file: the_main_file.path
|
file: the_main_file.path
|
||||||
return_type: ast.void_type
|
return_type: ast.void_type
|
||||||
scope: &ast.Scope{
|
scope: &ast.Scope{
|
||||||
parent: 0
|
parent: nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
has_main_fn = true
|
has_main_fn = true
|
||||||
|
@ -2021,7 +2021,7 @@ fn (mut c Checker) stmt(mut node ast.Stmt) {
|
||||||
if mut id.info is ast.IdentVar {
|
if mut id.info is ast.IdentVar {
|
||||||
if id.comptime && id.name in ast.valid_comptime_not_user_defined {
|
if id.comptime && id.name in ast.valid_comptime_not_user_defined {
|
||||||
node.defer_vars[i] = ast.Ident{
|
node.defer_vars[i] = ast.Ident{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
name: ''
|
name: ''
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -691,10 +691,19 @@ or use an explicit `unsafe{ a[..] }`, if you do not want a copy of the slice.',
|
||||||
init_field.pos)
|
init_field.pos)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if exp_type.is_ptr() && !got_type.is_any_kind_of_pointer()
|
is_unsafe_0 := init_field.expr is ast.UnsafeExpr
|
||||||
&& init_field.expr.str() != '0' && !exp_type.has_flag(.option) {
|
&& (init_field.expr as ast.UnsafeExpr).expr.str() == '0'
|
||||||
c.error('reference field must be initialized with reference',
|
if exp_type.is_ptr() && !is_unsafe_0 && !got_type.is_any_kind_of_pointer()
|
||||||
init_field.pos)
|
&& !exp_type.has_flag(.option) {
|
||||||
|
if init_field.expr.str() == '0' {
|
||||||
|
if !c.inside_unsafe && type_sym.language == .v {
|
||||||
|
c.note('assigning `0` to a reference field is only allowed in `unsafe` blocks',
|
||||||
|
init_field.pos)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
c.error('reference field must be initialized with reference',
|
||||||
|
init_field.pos)
|
||||||
|
}
|
||||||
} else if exp_type.is_pointer() && !got_type.is_any_kind_of_pointer()
|
} else if exp_type.is_pointer() && !got_type.is_any_kind_of_pointer()
|
||||||
&& !got_type.is_int() {
|
&& !got_type.is_int() {
|
||||||
got_typ_str := c.table.type_to_str(got_type)
|
got_typ_str := c.table.type_to_str(got_type)
|
||||||
|
|
14
vlib/v/checker/tests/struct_ref_fields_init_0_err.out
Normal file
14
vlib/v/checker/tests/struct_ref_fields_init_0_err.out
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
vlib/v/checker/tests/struct_ref_fields_init_0_err.vv:6:10: notice: assigning `0` to a reference field is only allowed in `unsafe` blocks
|
||||||
|
4 |
|
||||||
|
5 | fn main() {
|
||||||
|
6 | _ = Foo{0}
|
||||||
|
| ^
|
||||||
|
7 | _ = Foo{
|
||||||
|
8 | foo: 0
|
||||||
|
vlib/v/checker/tests/struct_ref_fields_init_0_err.vv:8:3: notice: assigning `0` to a reference field is only allowed in `unsafe` blocks
|
||||||
|
6 | _ = Foo{0}
|
||||||
|
7 | _ = Foo{
|
||||||
|
8 | foo: 0
|
||||||
|
| ~~~~~~
|
||||||
|
9 | }
|
||||||
|
10 | }
|
10
vlib/v/checker/tests/struct_ref_fields_init_0_err.vv
Normal file
10
vlib/v/checker/tests/struct_ref_fields_init_0_err.vv
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
struct Foo {
|
||||||
|
foo &u8
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
_ = Foo{0}
|
||||||
|
_ = Foo{
|
||||||
|
foo: 0
|
||||||
|
}
|
||||||
|
}
|
|
@ -215,7 +215,7 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) {
|
||||||
mut gen_or := false
|
mut gen_or := false
|
||||||
mut blank_assign := false
|
mut blank_assign := false
|
||||||
mut ident := ast.Ident{
|
mut ident := ast.Ident{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
}
|
}
|
||||||
left_sym := g.table.sym(g.unwrap_generic(var_type))
|
left_sym := g.table.sym(g.unwrap_generic(var_type))
|
||||||
if mut left is ast.Ident {
|
if mut left is ast.Ident {
|
||||||
|
@ -781,7 +781,7 @@ fn (mut g Gen) gen_multi_return_assign(node &ast.AssignStmt, return_type ast.Typ
|
||||||
for i, lx in node.left {
|
for i, lx in node.left {
|
||||||
mut is_auto_heap := false
|
mut is_auto_heap := false
|
||||||
mut ident := ast.Ident{
|
mut ident := ast.Ident{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
}
|
}
|
||||||
if lx is ast.Ident {
|
if lx is ast.Ident {
|
||||||
ident = lx
|
ident = lx
|
||||||
|
|
|
@ -279,7 +279,7 @@ pub fn gen(files []&ast.File, table &ast.Table, pref_ &pref.Preferences) (string
|
||||||
}
|
}
|
||||||
mut reflection_strings := map[string]int{}
|
mut reflection_strings := map[string]int{}
|
||||||
mut global_g := Gen{
|
mut global_g := Gen{
|
||||||
file: 0
|
file: unsafe { nil }
|
||||||
out: strings.new_builder(512000)
|
out: strings.new_builder(512000)
|
||||||
cheaders: strings.new_builder(15000)
|
cheaders: strings.new_builder(15000)
|
||||||
includes: strings.new_builder(100)
|
includes: strings.new_builder(100)
|
||||||
|
@ -308,7 +308,7 @@ pub fn gen(files []&ast.File, table &ast.Table, pref_ &pref.Preferences) (string
|
||||||
sql_buf: strings.new_builder(100)
|
sql_buf: strings.new_builder(100)
|
||||||
table: table
|
table: table
|
||||||
pref: pref_
|
pref: pref_
|
||||||
fn_decl: 0
|
fn_decl: unsafe { nil }
|
||||||
is_autofree: pref_.autofree
|
is_autofree: pref_.autofree
|
||||||
indent: -1
|
indent: -1
|
||||||
module_built: module_built
|
module_built: module_built
|
||||||
|
@ -662,7 +662,7 @@ fn cgen_process_one_file_cb(mut p pool.PoolProcessor, idx int, wid int) &Gen {
|
||||||
cleanup: strings.new_builder(100)
|
cleanup: strings.new_builder(100)
|
||||||
table: global_g.table
|
table: global_g.table
|
||||||
pref: global_g.pref
|
pref: global_g.pref
|
||||||
fn_decl: 0
|
fn_decl: unsafe { nil }
|
||||||
indent: -1
|
indent: -1
|
||||||
module_built: global_g.module_built
|
module_built: global_g.module_built
|
||||||
timers: util.new_timers(
|
timers: util.new_timers(
|
||||||
|
@ -3994,7 +3994,7 @@ fn (mut g Gen) lock_expr(node ast.LockExpr) {
|
||||||
g.cur_lock = unsafe { node } // is ok because it is discarded at end of fn
|
g.cur_lock = unsafe { node } // is ok because it is discarded at end of fn
|
||||||
defer {
|
defer {
|
||||||
g.cur_lock = ast.LockExpr{
|
g.cur_lock = ast.LockExpr{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tmp_result := if node.is_expr { g.new_tmp_var() } else { '' }
|
tmp_result := if node.is_expr { g.new_tmp_var() } else { '' }
|
||||||
|
|
|
@ -1025,7 +1025,7 @@ fn (mut g Gen) write_orm_select(node ast.SqlExpr, connection_var_name string, re
|
||||||
expr: right_where_expr
|
expr: right_where_expr
|
||||||
expr_type: (right_where_expr.info as ast.IdentVar).typ
|
expr_type: (right_where_expr.info as ast.IdentVar).typ
|
||||||
typ: (right_where_expr.info as ast.IdentVar).typ
|
typ: (right_where_expr.info as ast.IdentVar).typ
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
}
|
}
|
||||||
mut sql_expr_select_array := ast.SqlExpr{
|
mut sql_expr_select_array := ast.SqlExpr{
|
||||||
typ: field.typ.set_flag(.result)
|
typ: field.typ.set_flag(.result)
|
||||||
|
|
|
@ -102,7 +102,7 @@ fn (mut p Parser) hash() ast.HashStmt {
|
||||||
|
|
||||||
fn (mut p Parser) comptime_call() ast.ComptimeCall {
|
fn (mut p Parser) comptime_call() ast.ComptimeCall {
|
||||||
err_node := ast.ComptimeCall{
|
err_node := ast.ComptimeCall{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
}
|
}
|
||||||
start_pos := p.tok.pos()
|
start_pos := p.tok.pos()
|
||||||
p.check(.dollar)
|
p.check(.dollar)
|
||||||
|
@ -130,7 +130,7 @@ fn (mut p Parser) comptime_call() ast.ComptimeCall {
|
||||||
p.check(.string)
|
p.check(.string)
|
||||||
p.check(.rpar)
|
p.check(.rpar)
|
||||||
return ast.ComptimeCall{
|
return ast.ComptimeCall{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
method_name: method_name
|
method_name: method_name
|
||||||
args_var: s
|
args_var: s
|
||||||
is_env: method_name == 'env'
|
is_env: method_name == 'env'
|
||||||
|
@ -149,14 +149,14 @@ fn (mut p Parser) comptime_call() ast.ComptimeCall {
|
||||||
p.check(.rpar)
|
p.check(.rpar)
|
||||||
if has_args {
|
if has_args {
|
||||||
return ast.ComptimeCall{
|
return ast.ComptimeCall{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
method_name: method_name
|
method_name: method_name
|
||||||
args_var: type_index
|
args_var: type_index
|
||||||
pos: start_pos.extend(p.prev_tok.pos())
|
pos: start_pos.extend(p.prev_tok.pos())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ast.ComptimeCall{
|
return ast.ComptimeCall{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
method_name: method_name
|
method_name: method_name
|
||||||
pos: start_pos.extend(p.prev_tok.pos())
|
pos: start_pos.extend(p.prev_tok.pos())
|
||||||
}
|
}
|
||||||
|
@ -197,7 +197,7 @@ fn (mut p Parser) comptime_call() ast.ComptimeCall {
|
||||||
p.register_auto_import('v.preludes.embed_file.zlib')
|
p.register_auto_import('v.preludes.embed_file.zlib')
|
||||||
}
|
}
|
||||||
return ast.ComptimeCall{
|
return ast.ComptimeCall{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
is_embed: true
|
is_embed: true
|
||||||
embed_file: ast.EmbeddedFile{
|
embed_file: ast.EmbeddedFile{
|
||||||
compression_type: embed_compression_type
|
compression_type: embed_compression_type
|
||||||
|
@ -233,7 +233,7 @@ fn (mut p Parser) comptime_call() ast.ComptimeCall {
|
||||||
if !os.exists(path) {
|
if !os.exists(path) {
|
||||||
if p.pref.is_fmt {
|
if p.pref.is_fmt {
|
||||||
return ast.ComptimeCall{
|
return ast.ComptimeCall{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
is_vweb: true
|
is_vweb: true
|
||||||
method_name: method_name
|
method_name: method_name
|
||||||
args_var: literal_string_param
|
args_var: literal_string_param
|
||||||
|
@ -274,7 +274,7 @@ fn (mut p Parser) comptime_call() ast.ComptimeCall {
|
||||||
mut file := parse_comptime(tmpl_path, v_code, p.table, p.pref, p.scope)
|
mut file := parse_comptime(tmpl_path, v_code, p.table, p.pref, p.scope)
|
||||||
file.path = tmpl_path
|
file.path = tmpl_path
|
||||||
return ast.ComptimeCall{
|
return ast.ComptimeCall{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
is_vweb: true
|
is_vweb: true
|
||||||
vweb_tmpl: file
|
vweb_tmpl: file
|
||||||
method_name: method_name
|
method_name: method_name
|
||||||
|
|
|
@ -289,7 +289,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
||||||
if p.tok.kind == .lpar {
|
if p.tok.kind == .lpar {
|
||||||
is_method = true
|
is_method = true
|
||||||
p.fn_receiver(mut params, mut rec) or { return ast.FnDecl{
|
p.fn_receiver(mut params, mut rec) or { return ast.FnDecl{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
} }
|
} }
|
||||||
|
|
||||||
// rec.language was initialized with language variable.
|
// rec.language was initialized with language variable.
|
||||||
|
@ -321,7 +321,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
||||||
p.error_with_pos('function names cannot contain uppercase letters, use snake_case instead',
|
p.error_with_pos('function names cannot contain uppercase letters, use snake_case instead',
|
||||||
name_pos)
|
name_pos)
|
||||||
return ast.FnDecl{
|
return ast.FnDecl{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if is_method {
|
if is_method {
|
||||||
|
@ -336,7 +336,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
||||||
if is_duplicate {
|
if is_duplicate {
|
||||||
p.error_with_pos('duplicate method `${name}`', name_pos)
|
p.error_with_pos('duplicate method `${name}`', name_pos)
|
||||||
return ast.FnDecl{
|
return ast.FnDecl{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -344,7 +344,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
||||||
if name in p.imported_symbols {
|
if name in p.imported_symbols {
|
||||||
p.error_with_pos('cannot redefine imported function `${name}`', name_pos)
|
p.error_with_pos('cannot redefine imported function `${name}`', name_pos)
|
||||||
return ast.FnDecl{
|
return ast.FnDecl{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -374,7 +374,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
||||||
} else {
|
} else {
|
||||||
p.error_with_pos('expecting method name', p.tok.pos())
|
p.error_with_pos('expecting method name', p.tok.pos())
|
||||||
return ast.FnDecl{
|
return ast.FnDecl{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// [T]
|
// [T]
|
||||||
|
@ -386,7 +386,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
||||||
fn_generic_names := generic_names.clone()
|
fn_generic_names := generic_names.clone()
|
||||||
generic_names = p.types_to_names(sym.info.generic_types, p.tok.pos(), 'sym.info.generic_types') or {
|
generic_names = p.types_to_names(sym.info.generic_types, p.tok.pos(), 'sym.info.generic_types') or {
|
||||||
return ast.FnDecl{
|
return ast.FnDecl{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for gname in fn_generic_names {
|
for gname in fn_generic_names {
|
||||||
|
@ -407,7 +407,7 @@ fn (mut p Parser) fn_decl() ast.FnDecl {
|
||||||
if p.scope.known_var(param.name) {
|
if p.scope.known_var(param.name) {
|
||||||
p.error_with_pos('redefinition of parameter `${param.name}`', param.pos)
|
p.error_with_pos('redefinition of parameter `${param.name}`', param.pos)
|
||||||
return ast.FnDecl{
|
return ast.FnDecl{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is_stack_obj := !param.typ.has_flag(.shared_f) && (param.is_mut || param.typ.is_ptr())
|
is_stack_obj := !param.typ.has_flag(.shared_f) && (param.is_mut || param.typ.is_ptr())
|
||||||
|
@ -483,7 +483,7 @@ run them via `v file.v` instead',
|
||||||
p.error_with_pos('cannot define new methods on non-local type ${type_sym.name}',
|
p.error_with_pos('cannot define new methods on non-local type ${type_sym.name}',
|
||||||
rec.type_pos)
|
rec.type_pos)
|
||||||
return ast.FnDecl{
|
return ast.FnDecl{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
type_sym_method_idx = type_sym.register_method(ast.Fn{
|
type_sym_method_idx = type_sym.register_method(ast.Fn{
|
||||||
|
@ -585,7 +585,7 @@ run them via `v file.v` instead',
|
||||||
if !no_body && are_params_type_only {
|
if !no_body && are_params_type_only {
|
||||||
p.error_with_pos('functions with type only params can not have bodies', body_start_pos)
|
p.error_with_pos('functions with type only params can not have bodies', body_start_pos)
|
||||||
return ast.FnDecl{
|
return ast.FnDecl{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if no_body && !name.starts_with('C.') {
|
// if no_body && !name.starts_with('C.') {
|
||||||
|
|
|
@ -262,7 +262,7 @@ pub fn parse_vet_file(path string, table_ &ast.Table, pref_ &pref.Preferences) (
|
||||||
eprintln('> ${@MOD}.${@FN} path: ${path}')
|
eprintln('> ${@MOD}.${@FN} path: ${path}')
|
||||||
}
|
}
|
||||||
global_scope := &ast.Scope{
|
global_scope := &ast.Scope{
|
||||||
parent: 0
|
parent: unsafe { nil }
|
||||||
}
|
}
|
||||||
mut p := Parser{
|
mut p := Parser{
|
||||||
scanner: scanner.new_scanner_file(path, .parse_comments, pref_) or { panic(err) }
|
scanner: scanner.new_scanner_file(path, .parse_comments, pref_) or { panic(err) }
|
||||||
|
@ -1194,7 +1194,7 @@ fn (mut p Parser) asm_stmt(is_top_level bool) ast.AsmStmt {
|
||||||
|
|
||||||
p.check(.lcbr)
|
p.check(.lcbr)
|
||||||
p.scope = &ast.Scope{
|
p.scope = &ast.Scope{
|
||||||
parent: 0 // you shouldn't be able to reference other variables in assembly blocks
|
parent: unsafe { nil } // you shouldn't be able to reference other variables in assembly blocks
|
||||||
detached_from_parent: true
|
detached_from_parent: true
|
||||||
start_pos: p.tok.pos
|
start_pos: p.tok.pos
|
||||||
objects: ast.all_registers(mut p.table, arch) //
|
objects: ast.all_registers(mut p.table, arch) //
|
||||||
|
@ -4295,7 +4295,7 @@ fn (mut p Parser) assoc() ast.Assoc {
|
||||||
mut v := p.scope.find_var(var_name) or {
|
mut v := p.scope.find_var(var_name) or {
|
||||||
p.error('unknown variable `${var_name}`')
|
p.error('unknown variable `${var_name}`')
|
||||||
return ast.Assoc{
|
return ast.Assoc{
|
||||||
scope: 0
|
scope: unsafe { nil }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
v.is_used = true
|
v.is_used = true
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue