From 42777f0125261bf0fe7934b3d053f6c21ba2cc46 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 23 Aug 2025 17:44:05 -0300 Subject: [PATCH] cgen, markused: fix veb alias type identification and generic CastExpr (fix #24895) (#25155) --- vlib/v/checker/checker.v | 4 +++- vlib/v/checker/fn.v | 2 +- vlib/v/markused/walker.v | 2 +- .../tests/generics/generic_alias_callback_test.v | 15 +++++++++++++++ 4 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 vlib/v/tests/generics/generic_alias_callback_test.v diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index b0b08fc09..fd9d854d4 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3388,7 +3388,9 @@ fn (mut c Checker) cast_expr(mut node ast.CastExpr) ast.Type { // node.expr_type: `Inside` // node.typ: `Outside` mut to_type := c.unwrap_generic(node.typ) - + if node.typ.has_flag(.generic) { + c.table.used_features.comptime_syms[to_type] = true + } old_inside_integer_literal_cast := c.inside_integer_literal_cast c.inside_integer_literal_cast = to_type.is_int() && node.expr is ast.IntegerLiteral node.expr_type = c.expr(mut node.expr) // type to be casted diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 73f27910a..69eff4fea 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -3936,7 +3936,7 @@ fn (mut c Checker) check_must_use_call_result(node &ast.CallExpr, f &ast.Fn, lab } fn (mut c Checker) has_veb_context(typ ast.Type) bool { - sym := c.table.sym(typ) + sym := c.table.final_sym(typ) if sym.name == 'veb.Context' { return true } else if sym.info is ast.Struct { diff --git a/vlib/v/markused/walker.v b/vlib/v/markused/walker.v index bdf66037e..a2156e7a4 100644 --- a/vlib/v/markused/walker.v +++ b/vlib/v/markused/walker.v @@ -1377,7 +1377,7 @@ fn (mut w Walker) mark_resource_dependencies() { if w.trace_enabled { ptypes := w.table.used_features.print_types.keys().map(w.table.type_to_str(it)) eprintln('>>>>>>>>>> PRINT TYPES ${ptypes}') - stypes := w.uses_str.keys().map(w.table.type_to_str(it)) + stypes := w.uses_str.keys().filter(it != 0).map(w.table.type_to_str(it)) eprintln('>>>>>>>>>> USES .str() CALLS ON TYPES ${stypes}') ftypes := w.uses_free.keys().map(w.table.type_to_str(it)) eprintln('>>>>>>>>>> USES .free() CALLS ON TYPES ${ftypes}') diff --git a/vlib/v/tests/generics/generic_alias_callback_test.v b/vlib/v/tests/generics/generic_alias_callback_test.v new file mode 100644 index 000000000..d69f1d0a3 --- /dev/null +++ b/vlib/v/tests/generics/generic_alias_callback_test.v @@ -0,0 +1,15 @@ +struct Foo[T] { + val T +} + +type Bar[T] = fn (T) bool + +fn t[T](val T) { + _ := Bar[T](fn [T](a T) bool { + return true + }) +} + +fn test_main() { + t[int](1) +} -- 2.39.5