mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
checker: unsafe 0 for references (default value)
This commit is contained in:
parent
546f9a544f
commit
e76f74fd73
@ -9,13 +9,13 @@ mut:
|
|||||||
// Value of the node
|
// Value of the node
|
||||||
value T
|
value T
|
||||||
// The parent of the node
|
// The parent of the node
|
||||||
parent &BSTreeNode<T> = 0
|
parent &BSTreeNode<T> = unsafe { 0 }
|
||||||
// The left side with value less than the
|
// The left side with value less than the
|
||||||
// value of this node
|
// value of this node
|
||||||
left &BSTreeNode<T> = 0
|
left &BSTreeNode<T> = unsafe { 0 }
|
||||||
// The right side with value grater than the
|
// The right side with value grater than the
|
||||||
// value of thiss node
|
// value of thiss node
|
||||||
right &BSTreeNode<T> = 0
|
right &BSTreeNode<T> = unsafe { 0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create new root bst node
|
// Create new root bst node
|
||||||
@ -61,7 +61,7 @@ fn (mut node BSTreeNode<T>) bind(mut to_bind BSTreeNode<T>, left bool) {
|
|||||||
// Space complexity O(N)
|
// Space complexity O(N)
|
||||||
pub struct BSTree<T> {
|
pub struct BSTree<T> {
|
||||||
mut:
|
mut:
|
||||||
root &BSTreeNode<T> = 0
|
root &BSTreeNode<T> = unsafe { 0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
// insert give the possibility to insert an element in the BST.
|
// insert give the possibility to insert an element in the BST.
|
||||||
|
@ -3,18 +3,18 @@ module datatypes
|
|||||||
struct DoublyListNode<T> {
|
struct DoublyListNode<T> {
|
||||||
mut:
|
mut:
|
||||||
data T
|
data T
|
||||||
next &DoublyListNode<T> = 0
|
next &DoublyListNode<T> = unsafe { 0 }
|
||||||
prev &DoublyListNode<T> = 0
|
prev &DoublyListNode<T> = unsafe { 0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct DoublyLinkedList<T> {
|
pub struct DoublyLinkedList<T> {
|
||||||
mut:
|
mut:
|
||||||
head &DoublyListNode<T> = 0
|
head &DoublyListNode<T> = unsafe { 0 }
|
||||||
tail &DoublyListNode<T> = 0
|
tail &DoublyListNode<T> = unsafe { 0 }
|
||||||
// Internal iter pointer for allowing safe modification
|
// Internal iter pointer for allowing safe modification
|
||||||
// of the list while iterating. TODO: use an option
|
// of the list while iterating. TODO: use an option
|
||||||
// instead of a pointer to determine it is initialized.
|
// instead of a pointer to determine it is initialized.
|
||||||
iter &DoublyListIter<T> = 0
|
iter &DoublyListIter<T> = unsafe { 0 }
|
||||||
len int
|
len int
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,5 +280,5 @@ pub fn (mut list DoublyLinkedList<T>) next() ?T {
|
|||||||
|
|
||||||
struct DoublyListIter<T> {
|
struct DoublyListIter<T> {
|
||||||
mut:
|
mut:
|
||||||
node &DoublyListNode<T> = 0
|
node &DoublyListNode<T> = unsafe { 0 }
|
||||||
}
|
}
|
||||||
|
@ -3,12 +3,12 @@ module datatypes
|
|||||||
pub struct ListNode<T> {
|
pub struct ListNode<T> {
|
||||||
mut:
|
mut:
|
||||||
data T
|
data T
|
||||||
next &ListNode<T> = 0
|
next &ListNode<T> = unsafe { 0 }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct LinkedList<T> {
|
pub struct LinkedList<T> {
|
||||||
mut:
|
mut:
|
||||||
head &ListNode<T> = 0
|
head &ListNode<T> = unsafe { 0 }
|
||||||
len int
|
len int
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -549,7 +549,7 @@ pub mut:
|
|||||||
end_comments []Comment // comments *after* header declarations. E.g.: `fn C.C_func(x int) int // Comment`
|
end_comments []Comment // comments *after* header declarations. E.g.: `fn C.C_func(x int) int // Comment`
|
||||||
next_comments []Comment // comments that are one line after the decl; used for InterfaceDecl
|
next_comments []Comment // comments that are one line after the decl; used for InterfaceDecl
|
||||||
//
|
//
|
||||||
source_file &File = 0
|
source_file &File = unsafe { 0 }
|
||||||
scope &Scope
|
scope &Scope
|
||||||
label_names []string
|
label_names []string
|
||||||
pos token.Pos // function declaration position
|
pos token.Pos // function declaration position
|
||||||
|
@ -36,7 +36,7 @@ pub mut:
|
|||||||
panic_handler FnPanicHandler = default_table_panic_handler
|
panic_handler FnPanicHandler = default_table_panic_handler
|
||||||
panic_userdata voidptr = voidptr(0) // can be used to pass arbitrary data to panic_handler;
|
panic_userdata voidptr = voidptr(0) // can be used to pass arbitrary data to panic_handler;
|
||||||
panic_npanics int
|
panic_npanics int
|
||||||
cur_fn &FnDecl = 0 // previously stored in Checker.cur_fn and Gen.cur_fn
|
cur_fn &FnDecl = unsafe { 0 } // previously stored in Checker.cur_fn and Gen.cur_fn
|
||||||
cur_concrete_types []Type // current concrete types, e.g. <int, string>
|
cur_concrete_types []Type // current concrete types, e.g. <int, string>
|
||||||
gostmts int // how many `go` statements there were in the parsed files.
|
gostmts int // how many `go` statements there were in the parsed files.
|
||||||
// When table.gostmts > 0, __VTHREADS__ is defined, which can be checked with `$if threads {`
|
// When table.gostmts > 0, __VTHREADS__ is defined, which can be checked with `$if threads {`
|
||||||
|
@ -27,9 +27,9 @@ struct Mapper {
|
|||||||
mut:
|
mut:
|
||||||
pref &pref.Preferences
|
pref &pref.Preferences
|
||||||
table &ast.Table
|
table &ast.Table
|
||||||
file &ast.File = 0
|
file &ast.File = unsafe { 0 }
|
||||||
node &ast.Node = 0
|
node &ast.Node = unsafe { 0 }
|
||||||
fn_decl &ast.FnDecl = 0
|
fn_decl &ast.FnDecl = unsafe { 0 }
|
||||||
caller_name string
|
caller_name string
|
||||||
dot_caller_name string
|
dot_caller_name string
|
||||||
is_caller_used bool
|
is_caller_used bool
|
||||||
|
@ -57,7 +57,7 @@ pub struct Checker {
|
|||||||
pref &pref.Preferences // Preferences shared from V struct
|
pref &pref.Preferences // Preferences shared from V struct
|
||||||
pub mut:
|
pub mut:
|
||||||
table &ast.Table
|
table &ast.Table
|
||||||
file &ast.File = 0
|
file &ast.File = unsafe { 0 }
|
||||||
nr_errors int
|
nr_errors int
|
||||||
nr_warnings int
|
nr_warnings int
|
||||||
nr_notices int
|
nr_notices int
|
||||||
|
@ -101,6 +101,12 @@ pub fn (mut c Checker) struct_decl(mut node ast.StructDecl) {
|
|||||||
}
|
}
|
||||||
// Check for unnecessary inits like ` = 0` and ` = ''`
|
// Check for unnecessary inits like ` = 0` and ` = ''`
|
||||||
if field.typ.is_ptr() {
|
if field.typ.is_ptr() {
|
||||||
|
if field.default_expr is ast.IntegerLiteral {
|
||||||
|
if !c.inside_unsafe && !c.is_builtin_mod && field.default_expr.val == '0' {
|
||||||
|
c.warn('default value of `0` for references can only be used inside `unsafe`',
|
||||||
|
field.default_expr.pos)
|
||||||
|
}
|
||||||
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if field.default_expr is ast.IntegerLiteral {
|
if field.default_expr is ast.IntegerLiteral {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
vlib/v/checker/tests/field_can_not_be_from_the_same_type_as_containing_struct.vv:5:9: error: field `field` is part of `Bar`, they can not both have the same type
|
vlib/v/checker/tests/field_can_not_be_from_the_same_type_as_containing_struct.vv:5:9: error: field `field` is part of `Bar`, they can not both have the same type
|
||||||
3 | struct Bar {
|
3 | struct Bar {
|
||||||
4 | pfield &Foo = 0
|
4 | pfield &Foo = unsafe { 0 }
|
||||||
5 | field Foo = Bar{}
|
5 | field Foo = Bar{}
|
||||||
| ~~~
|
| ~~~
|
||||||
6 | }
|
6 | }
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
type Foo = Bar
|
type Foo = Bar
|
||||||
|
|
||||||
struct Bar {
|
struct Bar {
|
||||||
pfield &Foo = 0
|
pfield &Foo = unsafe { 0 }
|
||||||
field Foo = Bar{}
|
field Foo = Bar{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,7 +204,7 @@ mut:
|
|||||||
// main_fn_decl_node ast.FnDecl
|
// main_fn_decl_node ast.FnDecl
|
||||||
cur_mod ast.Module
|
cur_mod ast.Module
|
||||||
cur_concrete_types []ast.Type // do not use table.cur_concrete_types because table is global, so should not be accessed by different threads
|
cur_concrete_types []ast.Type // do not use table.cur_concrete_types because table is global, so should not be accessed by different threads
|
||||||
cur_fn &ast.FnDecl = 0 // same here
|
cur_fn &ast.FnDecl = unsafe { 0 } // same here
|
||||||
cur_lock ast.LockExpr
|
cur_lock ast.LockExpr
|
||||||
autofree_methods map[int]bool
|
autofree_methods map[int]bool
|
||||||
generated_free_methods map[int]bool
|
generated_free_methods map[int]bool
|
||||||
|
@ -8,7 +8,7 @@ pub struct Transformer {
|
|||||||
pref &pref.Preferences
|
pref &pref.Preferences
|
||||||
pub mut:
|
pub mut:
|
||||||
index &IndexState
|
index &IndexState
|
||||||
table &ast.Table = 0
|
table &ast.Table = unsafe { 0 }
|
||||||
mut:
|
mut:
|
||||||
is_assert bool
|
is_assert bool
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user