From eb63cda0a9cfc4be015f7fbefd7bc76ecebdd98a Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Wed, 24 Jul 2024 12:56:49 -0300 Subject: [PATCH] cgen: fix generic option/result reference return (#21922) --- vlib/v/gen/c/cgen.v | 4 +-- vlib/v/tests/option_ret_ptr_generic_test.v | 30 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 vlib/v/tests/option_ret_ptr_generic_test.v diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 6f0aef9b35..d63c5c7718 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -1161,7 +1161,7 @@ fn (mut g Gen) option_type_name(t ast.Type) (string, string) { } else { styp = '${c.option_name}_${base}' } - if t.is_ptr() { + if t.is_ptr() || t.has_flag(.generic) { styp = styp.replace('*', '_ptr') } return styp, base @@ -1183,7 +1183,7 @@ fn (mut g Gen) result_type_name(t ast.Type) (string, string) { } else { styp = '${c.result_name}_${base}' } - if t.is_ptr() { + if t.is_ptr() || t.has_flag(.generic) { styp = styp.replace('*', '_ptr') } return styp, base diff --git a/vlib/v/tests/option_ret_ptr_generic_test.v b/vlib/v/tests/option_ret_ptr_generic_test.v new file mode 100644 index 0000000000..54fbafedbc --- /dev/null +++ b/vlib/v/tests/option_ret_ptr_generic_test.v @@ -0,0 +1,30 @@ +struct Stack[T] { +mut: + elements []T +} + +pub fn (stack Stack[T]) is_empty() bool { + return stack.elements.len == 0 +} + +pub fn (stack Stack[T]) peek() ?T { + return if !stack.is_empty() { stack.elements.last() } else { none } +} + +pub fn (stack Stack[T]) peek2() !T { + return if !stack.is_empty() { stack.elements.last() } else { error('Stack is empty') } +} + +@[heap] +struct Element { +mut: + name string + value string +} + +fn test_main() { + mut parent := &Element{ + name: 'parent element' + } + mut stack := Stack[&Element]{} +}