mirror of
https://github.com/vlang/v.git
synced 2025-09-13 09:25:45 -04:00
This commit is contained in:
parent
3c26bfff55
commit
89bd575ec0
@ -1691,6 +1691,9 @@ pub fn (mut t Table) resolve_generic_to_concrete(generic_type Type, generic_name
|
|||||||
t_generic_names, t_concrete_types)
|
t_generic_names, t_concrete_types)
|
||||||
{
|
{
|
||||||
gts := t.sym(ct)
|
gts := t.sym(ct)
|
||||||
|
if ct.is_ptr() {
|
||||||
|
nrt += '&'
|
||||||
|
}
|
||||||
nrt += gts.name
|
nrt += gts.name
|
||||||
rnrt += gts.name
|
rnrt += gts.name
|
||||||
if i != sym.info.generic_types.len - 1 {
|
if i != sym.info.generic_types.len - 1 {
|
||||||
@ -1867,6 +1870,9 @@ pub fn (mut t Table) unwrap_generic_type(typ Type, generic_names []string, concr
|
|||||||
t_concrete_types)
|
t_concrete_types)
|
||||||
{
|
{
|
||||||
gts := t.sym(ct)
|
gts := t.sym(ct)
|
||||||
|
if ct.is_ptr() {
|
||||||
|
nrt += '&'
|
||||||
|
}
|
||||||
nrt += gts.name
|
nrt += gts.name
|
||||||
c_nrt += gts.cname
|
c_nrt += gts.cname
|
||||||
if i != ts.info.generic_types.len - 1 {
|
if i != ts.info.generic_types.len - 1 {
|
||||||
|
@ -184,20 +184,22 @@ fn (mut g Gen) if_expr(node ast.IfExpr) {
|
|||||||
mut cur_line := ''
|
mut cur_line := ''
|
||||||
mut raw_state := false
|
mut raw_state := false
|
||||||
if needs_tmp_var {
|
if needs_tmp_var {
|
||||||
|
mut styp := g.typ(node.typ)
|
||||||
if node.typ.has_flag(.option) {
|
if node.typ.has_flag(.option) {
|
||||||
raw_state = g.inside_if_option
|
raw_state = g.inside_if_option
|
||||||
defer {
|
defer {
|
||||||
g.inside_if_option = raw_state
|
g.inside_if_option = raw_state
|
||||||
}
|
}
|
||||||
g.inside_if_option = true
|
g.inside_if_option = true
|
||||||
|
styp = styp.replace('*', '_ptr')
|
||||||
} else if node.typ.has_flag(.result) {
|
} else if node.typ.has_flag(.result) {
|
||||||
raw_state = g.inside_if_result
|
raw_state = g.inside_if_result
|
||||||
defer {
|
defer {
|
||||||
g.inside_if_result = raw_state
|
g.inside_if_result = raw_state
|
||||||
}
|
}
|
||||||
g.inside_if_result = true
|
g.inside_if_result = true
|
||||||
|
styp = styp.replace('*', '_ptr')
|
||||||
}
|
}
|
||||||
styp := g.typ(node.typ)
|
|
||||||
cur_line = g.go_before_stmt(0)
|
cur_line = g.go_before_stmt(0)
|
||||||
g.empty_line = true
|
g.empty_line = true
|
||||||
g.writeln('${styp} ${tmp}; /* if prepend */')
|
g.writeln('${styp} ${tmp}; /* if prepend */')
|
||||||
|
@ -763,6 +763,9 @@ fn (mut p Parser) parse_generic_inst_type(name string) ast.Type {
|
|||||||
if gts.kind == .multi_return {
|
if gts.kind == .multi_return {
|
||||||
p.error_with_pos('cannot use multi return as generic concrete type', type_pos)
|
p.error_with_pos('cannot use multi return as generic concrete type', type_pos)
|
||||||
}
|
}
|
||||||
|
if gt.is_ptr() {
|
||||||
|
bs_name += '&'
|
||||||
|
}
|
||||||
bs_name += gts.name
|
bs_name += gts.name
|
||||||
bs_cname += gts.cname
|
bs_cname += gts.cname
|
||||||
concrete_types << gt
|
concrete_types << gt
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
import datatypes { Stack }
|
||||||
|
|
||||||
|
struct Person {
|
||||||
|
mut:
|
||||||
|
name string
|
||||||
|
age int
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_generic_struct_init_with_reference_struct_type() {
|
||||||
|
mut adam := &Person{'Adam', 21}
|
||||||
|
println(adam)
|
||||||
|
|
||||||
|
mut people := Stack[&Person]{}
|
||||||
|
people.push(adam)
|
||||||
|
assert people.len() == 1
|
||||||
|
|
||||||
|
mut top_person := people.pop()!
|
||||||
|
top_person.age++
|
||||||
|
println(adam)
|
||||||
|
|
||||||
|
assert people.len() == 0
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user