mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
compiler: check if mutable receivers are modified
This commit is contained in:
parent
9c9e6290a6
commit
1397d532c6
@ -120,7 +120,7 @@ fn (g mut CGen) end_tmp() string {
|
|||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (g mut CGen) add_placeholder() int {
|
fn (g &CGen) add_placeholder() int {
|
||||||
if g.is_tmp {
|
if g.is_tmp {
|
||||||
return g.tmp_line.len
|
return g.tmp_line.len
|
||||||
}
|
}
|
||||||
@ -176,7 +176,7 @@ fn (g mut CGen) register_thread_fn(wrapper_name, wrapper_text, struct_text strin
|
|||||||
g.thread_args << wrapper_text
|
g.thread_args << wrapper_text
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (c mut V) prof_counters() string {
|
fn (v &V) prof_counters() string {
|
||||||
mut res := []string
|
mut res := []string
|
||||||
// Global fns
|
// Global fns
|
||||||
//for f in c.table.fns {
|
//for f in c.table.fns {
|
||||||
@ -196,7 +196,7 @@ fn (c mut V) prof_counters() string {
|
|||||||
return res.join(';\n')
|
return res.join(';\n')
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (p mut Parser) print_prof_counters() string {
|
fn (p &Parser) print_prof_counters() string {
|
||||||
mut res := []string
|
mut res := []string
|
||||||
// Global fns
|
// Global fns
|
||||||
//for f in p.table.fns {
|
//for f in p.table.fns {
|
||||||
@ -296,7 +296,7 @@ fn platform_postfix_to_ifdefguard(name string) string {
|
|||||||
// C struct definitions, ordered
|
// C struct definitions, ordered
|
||||||
// Sort the types, make sure types that are referenced by other types
|
// Sort the types, make sure types that are referenced by other types
|
||||||
// are added before them.
|
// are added before them.
|
||||||
fn (v mut V) type_definitions() string {
|
fn (v &V) type_definitions() string {
|
||||||
mut types := []Type // structs that need to be sorted
|
mut types := []Type // structs that need to be sorted
|
||||||
mut builtin_types := []Type // builtin types
|
mut builtin_types := []Type // builtin types
|
||||||
// builtin types need to be on top
|
// builtin types need to be on top
|
||||||
|
@ -263,9 +263,6 @@ return strings__Builder_str(sb);
|
|||||||
} '
|
} '
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (p mut Parser) parse_t() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -510,7 +510,8 @@ fn (p mut Parser) check_unused_variables() {
|
|||||||
p.scanner.line_nr = var.line_nr - 1
|
p.scanner.line_nr = var.line_nr - 1
|
||||||
p.error('`$var.name` declared and not used')
|
p.error('`$var.name` declared and not used')
|
||||||
}
|
}
|
||||||
if !var.is_changed && var.is_mut && !p.pref.is_repl && !var.is_arg && !p.pref.translated && var.name != '_' {
|
if !var.is_changed && var.is_mut && !p.pref.is_repl &&
|
||||||
|
!p.pref.translated && var.name != '_' {
|
||||||
p.scanner.line_nr = var.line_nr - 1
|
p.scanner.line_nr = var.line_nr - 1
|
||||||
p.error('`$var.name` is declared as mutable, but it was never changed')
|
p.error('`$var.name` is declared as mutable, but it was never changed')
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@ module main
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
fn (v mut V) generate_hotcode_reloading_compiler_flags() []string {
|
fn (v &V) generate_hotcode_reloading_compiler_flags() []string {
|
||||||
mut a := []string
|
mut a := []string
|
||||||
if v.pref.is_live || v.pref.is_so {
|
if v.pref.is_live || v.pref.is_so {
|
||||||
// See 'man dlopen', and test running a GUI program compiled with -live
|
// See 'man dlopen', and test running a GUI program compiled with -live
|
||||||
@ -16,7 +16,7 @@ fn (v mut V) generate_hotcode_reloading_compiler_flags() []string {
|
|||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (v mut V) generate_hotcode_reloading_declarations() {
|
fn (v &V) generate_hotcode_reloading_declarations() {
|
||||||
mut cgen := v.cgen
|
mut cgen := v.cgen
|
||||||
if v.os != .windows && v.os != .msvc {
|
if v.os != .windows && v.os != .msvc {
|
||||||
if v.pref.is_so {
|
if v.pref.is_so {
|
||||||
|
@ -770,7 +770,7 @@ if p.scanner.line_comment != '' {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (p mut Parser) warn(s string) {
|
fn (p &Parser) warn(s string) {
|
||||||
println('warning: $p.scanner.file_path:${p.scanner.line_nr+1}: $s')
|
println('warning: $p.scanner.file_path:${p.scanner.line_nr+1}: $s')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ fn (r mut Repl) checks(line string) bool {
|
|||||||
return r.in_func || (was_indent && r.indent <= 0) || r.indent > 0
|
return r.in_func || (was_indent && r.indent <= 0) || r.indent > 0
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (r mut Repl) function_call(line string) bool {
|
fn (r &Repl) function_call(line string) bool {
|
||||||
for function in r.functions_name {
|
for function in r.functions_name {
|
||||||
if line.starts_with(function) {
|
if line.starts_with(function) {
|
||||||
return true
|
return true
|
||||||
|
@ -752,6 +752,9 @@ fn (s mut Scanner) ident_char() string {
|
|||||||
s.error('invalid character literal (more than one character: $len)')
|
s.error('invalid character literal (more than one character: $len)')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if c == '\\`' {
|
||||||
|
return '`'
|
||||||
|
}
|
||||||
// Escapes a `'` character
|
// Escapes a `'` character
|
||||||
return if c == '\'' { '\\' + c } else { c }
|
return if c == '\'' { '\\' + c } else { c }
|
||||||
}
|
}
|
||||||
@ -776,7 +779,7 @@ fn (s mut Scanner) peek() Token {
|
|||||||
return tok
|
return tok
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (s mut Scanner) expect(want string, start_pos int) bool {
|
fn (s &Scanner) expect(want string, start_pos int) bool {
|
||||||
end_pos := start_pos + want.len
|
end_pos := start_pos + want.len
|
||||||
if start_pos < 0 || start_pos >= s.text.len {
|
if start_pos < 0 || start_pos >= s.text.len {
|
||||||
return false
|
return false
|
||||||
@ -825,7 +828,7 @@ fn is_nl(c byte) bool {
|
|||||||
return c == `\r` || c == `\n`
|
return c == `\r` || c == `\n`
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (s mut Scanner) get_opening_bracket() int {
|
fn (s &Scanner) get_opening_bracket() int {
|
||||||
mut pos := s.pos
|
mut pos := s.pos
|
||||||
mut parentheses := 0
|
mut parentheses := 0
|
||||||
mut inside_string := false
|
mut inside_string := false
|
||||||
|
@ -236,7 +236,7 @@ fn new_table(obfuscate bool) &Table {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If `name` is a reserved C keyword, returns `v_name` instead.
|
// If `name` is a reserved C keyword, returns `v_name` instead.
|
||||||
fn (t mut Table) var_cgen_name(name string) string {
|
fn (t &Table) var_cgen_name(name string) string {
|
||||||
if name in CReserved {
|
if name in CReserved {
|
||||||
return 'v_$name'
|
return 'v_$name'
|
||||||
}
|
}
|
||||||
@ -707,7 +707,7 @@ fn (t mut Table) register_generic_fn(fn_name string) {
|
|||||||
t.generic_fns << GenTable{fn_name, []string}
|
t.generic_fns << GenTable{fn_name, []string}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (t mut Table) fn_gen_types(fn_name string) []string {
|
fn (t &Table) fn_gen_types(fn_name string) []string {
|
||||||
for _, f in t.generic_fns {
|
for _, f in t.generic_fns {
|
||||||
if f.fn_name == fn_name {
|
if f.fn_name == fn_name {
|
||||||
return f.types
|
return f.types
|
||||||
|
@ -166,7 +166,6 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
fn test_fixed() {
|
fn test_fixed() {
|
||||||
/*
|
|
||||||
mut nums := [4]int
|
mut nums := [4]int
|
||||||
assert nums[0] == 0
|
assert nums[0] == 0
|
||||||
assert nums[1] == 0
|
assert nums[1] == 0
|
||||||
@ -177,7 +176,6 @@ fn test_fixed() {
|
|||||||
///////
|
///////
|
||||||
nums2 := [N]int
|
nums2 := [N]int
|
||||||
assert nums2[N - 1] == 0
|
assert nums2[N - 1] == 0
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn modify (numbers mut []int) {
|
fn modify (numbers mut []int) {
|
||||||
|
Loading…
Reference in New Issue
Block a user