parent
ea3c0166c0
commit
34dd4f34ab
|
@ -106,7 +106,7 @@ pub fn (mut b Builder) go_back(n int) {
|
||||||
// cut_last cuts the last `n` bytes from the buffer and returns them
|
// cut_last cuts the last `n` bytes from the buffer and returns them
|
||||||
pub fn (mut b Builder) cut_last(n int) string {
|
pub fn (mut b Builder) cut_last(n int) string {
|
||||||
cut_pos := b.len - n
|
cut_pos := b.len - n
|
||||||
x := unsafe { (&[]byte(b))[cut_pos..] }
|
x := unsafe { (*&[]byte(b))[cut_pos..] }
|
||||||
res := x.bytestr()
|
res := x.bytestr()
|
||||||
b.trim(cut_pos)
|
b.trim(cut_pos)
|
||||||
return res
|
return res
|
||||||
|
@ -147,7 +147,7 @@ pub fn (b &Builder) last_n(n int) string {
|
||||||
if n > b.len {
|
if n > b.len {
|
||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
x := unsafe { (&[]byte(b))[b.len - n..] }
|
x := unsafe { (*&[]byte(b))[b.len - n..] }
|
||||||
return x.bytestr()
|
return x.bytestr()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,7 +157,7 @@ pub fn (b &Builder) after(n int) string {
|
||||||
if n >= b.len {
|
if n >= b.len {
|
||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
x := unsafe { (&[]byte(b))[n..] }
|
x := unsafe { (*&[]byte(b))[n..] }
|
||||||
return x.bytestr()
|
return x.bytestr()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3770,8 +3770,8 @@ pub fn (mut c Checker) index_expr(mut node ast.IndexExpr) ast.Type {
|
||||||
'(note, that variables may be mutable but string values are always immutable, like in Go and Java)',
|
'(note, that variables may be mutable but string values are always immutable, like in Go and Java)',
|
||||||
node.pos)
|
node.pos)
|
||||||
}
|
}
|
||||||
if !c.inside_unsafe && ((typ.is_ptr() && !typ.has_flag(.shared_f)
|
if (typ.is_ptr() && !typ.has_flag(.shared_f) && !node.left.is_auto_deref_var())
|
||||||
&& !node.left.is_auto_deref_var()) || typ.is_pointer()) {
|
|| typ.is_pointer() {
|
||||||
mut is_ok := false
|
mut is_ok := false
|
||||||
if mut node.left is ast.Ident {
|
if mut node.left is ast.Ident {
|
||||||
if mut node.left.obj is ast.Var {
|
if mut node.left.obj is ast.Var {
|
||||||
|
@ -3779,7 +3779,10 @@ pub fn (mut c Checker) index_expr(mut node ast.IndexExpr) ast.Type {
|
||||||
is_ok = node.left.obj.is_mut && node.left.obj.is_arg && !typ.deref().is_ptr()
|
is_ok = node.left.obj.is_mut && node.left.obj.is_arg && !typ.deref().is_ptr()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !is_ok && !c.pref.translated && !c.file.is_translated {
|
if !is_ok && node.index is ast.RangeExpr {
|
||||||
|
s := c.table.type_to_str(typ)
|
||||||
|
c.error('type `$s` does not support slicing', node.pos)
|
||||||
|
} else if !c.inside_unsafe && !is_ok && !c.pref.translated && !c.file.is_translated {
|
||||||
c.warn('pointer indexing is only allowed in `unsafe` blocks', node.pos)
|
c.warn('pointer indexing is only allowed in `unsafe` blocks', node.pos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
vlib/v/checker/tests/ptr_slice.vv:9:17: error: type `&Foo` does not support slicing
|
||||||
|
7 |
|
||||||
|
8 | fn main() {
|
||||||
|
9 | fs := jeje()[1..]
|
||||||
|
| ~~~~~
|
||||||
|
10 | println(fs)
|
||||||
|
11 | vs := byteptr(0)[..3]
|
||||||
|
vlib/v/checker/tests/ptr_slice.vv:11:21: error: type `byteptr` does not support slicing
|
||||||
|
9 | fs := jeje()[1..]
|
||||||
|
10 | println(fs)
|
||||||
|
11 | vs := byteptr(0)[..3]
|
||||||
|
| ~~~~~
|
||||||
|
12 | println(vs)
|
||||||
|
13 | }
|
|
@ -0,0 +1,13 @@
|
||||||
|
struct Foo {
|
||||||
|
}
|
||||||
|
|
||||||
|
fn jeje() &Foo {
|
||||||
|
return &Foo{}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
fs := jeje()[1..]
|
||||||
|
println(fs)
|
||||||
|
vs := byteptr(0)[..3]
|
||||||
|
println(vs)
|
||||||
|
}
|
Loading…
Reference in New Issue