cgen: fix struct field init from shared struct field (#13343)
parent
c3573454d1
commit
c0c07db7cc
|
@ -2471,10 +2471,8 @@ fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type_raw ast.Type, expected_typ
|
||||||
}
|
}
|
||||||
// Generic dereferencing logic
|
// Generic dereferencing logic
|
||||||
neither_void := ast.voidptr_type !in [got_type, expected_type]
|
neither_void := ast.voidptr_type !in [got_type, expected_type]
|
||||||
to_shared := expected_type.has_flag(.shared_f) && !got_type_raw.has_flag(.shared_f)
|
if expected_type.has_flag(.shared_f) && !got_type_raw.has_flag(.shared_f)
|
||||||
&& !expected_type.has_flag(.optional)
|
&& !expected_type.has_flag(.optional) {
|
||||||
// from_shared := got_type_raw.has_flag(.shared_f) && !expected_type.has_flag(.shared_f)
|
|
||||||
if to_shared {
|
|
||||||
shared_styp := exp_styp[0..exp_styp.len - 1] // `shared` implies ptr, so eat one `*`
|
shared_styp := exp_styp[0..exp_styp.len - 1] // `shared` implies ptr, so eat one `*`
|
||||||
if got_type_raw.is_ptr() {
|
if got_type_raw.is_ptr() {
|
||||||
g.error('cannot convert reference to `shared`', expr.pos())
|
g.error('cannot convert reference to `shared`', expr.pos())
|
||||||
|
@ -2492,6 +2490,13 @@ fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type_raw ast.Type, expected_typ
|
||||||
g.is_shared = old_is_shared
|
g.is_shared = old_is_shared
|
||||||
g.writeln('}, sizeof($shared_styp))')
|
g.writeln('}, sizeof($shared_styp))')
|
||||||
return
|
return
|
||||||
|
} else if got_type_raw.has_flag(.shared_f) && !expected_type.has_flag(.shared_f) {
|
||||||
|
if expected_type.is_ptr() {
|
||||||
|
g.write('&')
|
||||||
|
}
|
||||||
|
g.expr(expr)
|
||||||
|
g.write('->val')
|
||||||
|
return
|
||||||
}
|
}
|
||||||
if got_is_ptr && !expected_is_ptr && neither_void && exp_sym.kind != .placeholder
|
if got_is_ptr && !expected_is_ptr && neither_void && exp_sym.kind != .placeholder
|
||||||
&& expr !is ast.InfixExpr {
|
&& expr !is ast.InfixExpr {
|
||||||
|
@ -6315,10 +6320,6 @@ fn (mut g Gen) size_of(node ast.SizeOf) {
|
||||||
g.write('sizeof(${util.no_dots(styp)})')
|
g.write('sizeof(${util.no_dots(styp)})')
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (g &Gen) is_importing_os() bool {
|
|
||||||
return 'os' in g.table.imports
|
|
||||||
}
|
|
||||||
|
|
||||||
fn (mut g Gen) go_expr(node ast.GoExpr) {
|
fn (mut g Gen) go_expr(node ast.GoExpr) {
|
||||||
line := g.go_before_stmt(0)
|
line := g.go_before_stmt(0)
|
||||||
mut handle := ''
|
mut handle := ''
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
struct AA {
|
||||||
|
b shared BB
|
||||||
|
}
|
||||||
|
|
||||||
|
struct BB {
|
||||||
|
a &int
|
||||||
|
}
|
||||||
|
|
||||||
|
struct CC {
|
||||||
|
a BB
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_struct_shared_field_init() {
|
||||||
|
a := 3
|
||||||
|
table := &AA{
|
||||||
|
b: BB{&a}
|
||||||
|
}
|
||||||
|
c := CC{
|
||||||
|
a: table.b
|
||||||
|
}
|
||||||
|
assert *c.a.a == 3
|
||||||
|
}
|
Loading…
Reference in New Issue