checker: check reference return to be really reference (#7739)
parent
a9ab79d301
commit
74ea5ac99f
|
@ -52,7 +52,7 @@ pub mut:
|
|||
// so that the user can set callbacks, read meta information, etc.
|
||||
pub fn info() &LiveReloadInfo {
|
||||
if C.g_live_info != 0 {
|
||||
return C.g_live_info
|
||||
return &LiveReloadInfo(C.g_live_info)
|
||||
}
|
||||
// When the current program is not compiled with -live, simply
|
||||
// return a new empty struct LiveReloadInfo in order to prevent
|
||||
|
|
|
@ -2047,6 +2047,12 @@ pub fn (mut c Checker) return_stmt(mut return_stmt ast.Return) {
|
|||
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)
|
||||
}
|
||||
if (exp_type.is_ptr() || exp_type.is_pointer()) &&
|
||||
(!got_typ.is_ptr() && !got_typ.is_pointer()) && got_typ != table.any_int_type {
|
||||
pos := return_stmt.exprs[i].position()
|
||||
c.error('fn `$c.cur_fn.name` expects you to return a reference type `${c.table.type_to_str(exp_type)}`, but you are returning `${c.table.type_to_str(got_typ)}` instead',
|
||||
pos)
|
||||
}
|
||||
}
|
||||
if exp_is_optional && return_stmt.exprs.len > 0 {
|
||||
expr0 := return_stmt.exprs[0]
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
vlib/v/checker/tests/reference_return.vv:6:9: error: fn `f` expects you to return a reference type `&Aa`, but you are returning `Aa` instead
|
||||
4 |
|
||||
5 | fn f() &Aa {
|
||||
6 | return Aa{
|
||||
| ~~~
|
||||
7 | a: 1
|
||||
8 | }
|
|
@ -0,0 +1,14 @@
|
|||
struct Aa {
|
||||
a int
|
||||
}
|
||||
|
||||
fn f() &Aa {
|
||||
return Aa{
|
||||
a: 1
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
x := f()
|
||||
println(x.a)
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
struct Aa {
|
||||
a int
|
||||
}
|
||||
|
||||
fn f() &Aa {
|
||||
return &Aa{
|
||||
a: 5
|
||||
}
|
||||
}
|
||||
|
||||
fn test_ref_return() {
|
||||
x := f()
|
||||
assert x.a == 5
|
||||
}
|
Loading…
Reference in New Issue