checker: add error for `fn f() Struct { return &Struct{} }` (#6019)
parent
81f8e910e6
commit
9c9533dad9
|
@ -30,5 +30,5 @@ pub fn do_work(){
|
|||
}
|
||||
|
||||
pub fn get_subscriber() eventbus.Subscriber {
|
||||
return eb.subscriber
|
||||
return *eb.subscriber
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@ module math
|
|||
// with the sign bit of f and the result in the same bit position.
|
||||
// f32_bits(f32_from_bits(x)) == x.
|
||||
pub fn f32_bits(f f32) u32 {
|
||||
p := &u32(&f)
|
||||
p := *(&u32(&f))
|
||||
return p
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,7 @@ pub fn f32_bits(f f32) u32 {
|
|||
// and the result in the same bit position.
|
||||
// f32_from_bits(f32_bits(x)) == x.
|
||||
pub fn f32_from_bits(b u32) f32 {
|
||||
p := &f32(&b)
|
||||
p := *(&f32(&b))
|
||||
return p
|
||||
}
|
||||
|
||||
|
@ -23,7 +23,7 @@ pub fn f32_from_bits(b u32) f32 {
|
|||
// with the sign bit of f and the result in the same bit position,
|
||||
// and f64_bits(f64_from_bits(x)) == x.
|
||||
pub fn f64_bits(f f64) u64 {
|
||||
p := &u64(&f)
|
||||
p := *(&u64(&f))
|
||||
return p
|
||||
}
|
||||
|
||||
|
@ -32,7 +32,7 @@ pub fn f64_bits(f f64) u64 {
|
|||
// and the result in the same bit position.
|
||||
// f64_from_bits(f64_bits(x)) == x.
|
||||
pub fn f64_from_bits(b u64) f64 {
|
||||
p := &f64(&b)
|
||||
p := *(&f64(&b))
|
||||
return p
|
||||
}
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ fn calculate_state(seed_data []u32, mut state []u64) []u64 {
|
|||
for j := 1; j < nn; j++ {
|
||||
state[j] = u64(6364136223846793005) * (state[j - 1] ^ (state[j - 1] >> 62)) + u64(j)
|
||||
}
|
||||
return state
|
||||
return *state
|
||||
}
|
||||
|
||||
// seed() - Set the seed, needs only two u32s in little endian format as [lower, higher]
|
||||
|
|
|
@ -165,7 +165,7 @@ pub mut:
|
|||
pub fn (mut desc C.sg_shader_stage_desc) set_image(index int, name string) C.sg_shader_stage_desc {
|
||||
desc.images[index].name = name.str
|
||||
desc.images[index].@type = ._2d
|
||||
return desc
|
||||
return *desc
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -164,7 +164,7 @@ fn process_in_thread(mut pool PoolProcessor, task_id int) {
|
|||
pub fn (pool &PoolProcessor) get_string_item(idx int) string {
|
||||
// return *(&string(pool.items[idx]))
|
||||
// TODO: the below is a hack, remove it when v2 casting works again
|
||||
return &string( pool.items[idx] )
|
||||
return *(&string( pool.items[idx] ))
|
||||
}
|
||||
|
||||
// get_int_item - called by the worker callback.
|
||||
|
|
|
@ -400,7 +400,7 @@ pub mut:
|
|||
pub fn (i &Ident) var_info() IdentVar {
|
||||
match i.info as info {
|
||||
IdentVar {
|
||||
return info
|
||||
return *info
|
||||
}
|
||||
else {
|
||||
// return IdentVar{}
|
||||
|
|
|
@ -1515,6 +1515,11 @@ pub fn (mut c Checker) return_stmt(mut return_stmt ast.Return) {
|
|||
c.error('cannot use `$got_typ_sym.name` as type `$exp_typ_sym.name` in return argument',
|
||||
pos)
|
||||
}
|
||||
if got_typ.is_ptr() && !exp_type.is_ptr() {
|
||||
pos := return_stmt.exprs[i].position()
|
||||
c.error('fn `$c.cur_fn.name` expects you to return a non reference type `${c.table.type_to_str(exp_type)}`, but you are returning `${c.table.type_to_str(got_typ)}` instead',
|
||||
pos)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1905,7 +1910,7 @@ fn const_int_value(cfield ast.ConstField) ?int {
|
|||
|
||||
fn is_const_integer(cfield ast.ConstField) ?ast.IntegerLiteral {
|
||||
match cfield.expr {
|
||||
ast.IntegerLiteral { return it }
|
||||
ast.IntegerLiteral { return *it }
|
||||
else {}
|
||||
}
|
||||
return none
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
vlib/v/checker/tests/return_ref_as_no_ref_bug.v:11:9: error: fn `return_not_reference` expects you to return a non reference type `BugStruct`, but you are returning `&BugStruct` instead
|
||||
9 |
|
||||
10 | fn return_not_reference() BugStruct{
|
||||
11 | return &BugStruct {
|
||||
| ^
|
||||
12 | id: 1
|
||||
13 | }
|
|
@ -0,0 +1,14 @@
|
|||
struct BugStruct {
|
||||
id int
|
||||
}
|
||||
|
||||
fn main() {
|
||||
x := return_not_reference()
|
||||
println(x.id)
|
||||
}
|
||||
|
||||
fn return_not_reference() BugStruct{
|
||||
return &BugStruct {
|
||||
id: 1
|
||||
}
|
||||
}
|
|
@ -431,7 +431,7 @@ fn (mut d Doc) generate() ?Doc {
|
|||
d.time_generated = time.now()
|
||||
d.contents.sort_by_name()
|
||||
d.contents.sort_by_category()
|
||||
return d
|
||||
return *d
|
||||
}
|
||||
|
||||
pub fn generate(input_path string, pub_only, with_comments bool) ?Doc {
|
||||
|
|
|
@ -362,7 +362,7 @@ pub fn (t &TypeSymbol) str() string {
|
|||
[inline]
|
||||
pub fn (t &TypeSymbol) enum_info() Enum {
|
||||
match t.info {
|
||||
Enum { return it }
|
||||
Enum { return *it }
|
||||
else { panic('TypeSymbol.enum_info(): no enum info for type: $t.name') }
|
||||
}
|
||||
}
|
||||
|
@ -370,7 +370,7 @@ pub fn (t &TypeSymbol) enum_info() Enum {
|
|||
[inline]
|
||||
pub fn (t &TypeSymbol) mr_info() MultiReturn {
|
||||
match t.info {
|
||||
MultiReturn { return it }
|
||||
MultiReturn { return *it }
|
||||
else { panic('TypeSymbol.mr_info(): no multi return info for type: $t.name') }
|
||||
}
|
||||
}
|
||||
|
@ -378,7 +378,7 @@ pub fn (t &TypeSymbol) mr_info() MultiReturn {
|
|||
[inline]
|
||||
pub fn (t &TypeSymbol) array_info() Array {
|
||||
match t.info {
|
||||
Array { return it }
|
||||
Array { return *it }
|
||||
else { panic('TypeSymbol.array_info(): no array info for type: $t.name') }
|
||||
}
|
||||
}
|
||||
|
@ -386,7 +386,7 @@ pub fn (t &TypeSymbol) array_info() Array {
|
|||
[inline]
|
||||
pub fn (t &TypeSymbol) array_fixed_info() ArrayFixed {
|
||||
match t.info {
|
||||
ArrayFixed { return it }
|
||||
ArrayFixed { return *it }
|
||||
else { panic('TypeSymbol.array_fixed(): no array fixed info for type: $t.name') }
|
||||
}
|
||||
}
|
||||
|
@ -394,7 +394,7 @@ pub fn (t &TypeSymbol) array_fixed_info() ArrayFixed {
|
|||
[inline]
|
||||
pub fn (t &TypeSymbol) map_info() Map {
|
||||
match t.info {
|
||||
Map { return it }
|
||||
Map { return *it }
|
||||
else { panic('TypeSymbol.map_info(): no map info for type: $t.name') }
|
||||
}
|
||||
}
|
||||
|
@ -402,7 +402,7 @@ pub fn (t &TypeSymbol) map_info() Map {
|
|||
[inline]
|
||||
pub fn (t &TypeSymbol) struct_info() Struct {
|
||||
match t.info {
|
||||
Struct { return it }
|
||||
Struct { return *it }
|
||||
else { panic('TypeSymbol.struct_info(): no struct info for type: $t.name') }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -70,7 +70,7 @@ fn mut_arg<T>(mut x T) {
|
|||
|
||||
fn mut_arg2<T>(mut x T) T {
|
||||
println(x.name) // = 'foo'
|
||||
return x
|
||||
return *x
|
||||
}
|
||||
|
||||
fn test_create() {
|
||||
|
|
Loading…
Reference in New Issue