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