From fb338d2a53cd0b9384c3584e78b957af8e745a98 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 12 Oct 2025 15:56:51 -0300 Subject: [PATCH] markused: fix []T param as used (fix #25383) (#25454) --- vlib/v/markused/walker.v | 14 +++++++++++ vlib/v/tests/generic_calls/bug_test.v | 9 ++++++++ vlib/v/tests/generic_calls/country.v | 7 ++++++ vlib/v/tests/generic_calls/country_cases.v | 11 +++++++++ vlib/v/tests/generic_calls/currency.v | 7 ++++++ vlib/v/tests/generic_calls/currency_to_code.v | 9 ++++++++ vlib/v/tests/generic_calls/curreny_cases.v | 11 +++++++++ vlib/v/tests/generic_calls/faker.v | 23 +++++++++++++++++++ .../tests/generic_calls/faker_country_name.v | 5 ++++ .../tests/generic_calls/faker_currency_code.v | 5 ++++ vlib/v/tests/generic_calls/top_level_domain.v | 12 ++++++++++ .../generic_calls/top_level_domain_cases.v | 11 +++++++++ 12 files changed, 124 insertions(+) create mode 100644 vlib/v/tests/generic_calls/bug_test.v create mode 100644 vlib/v/tests/generic_calls/country.v create mode 100644 vlib/v/tests/generic_calls/country_cases.v create mode 100644 vlib/v/tests/generic_calls/currency.v create mode 100644 vlib/v/tests/generic_calls/currency_to_code.v create mode 100644 vlib/v/tests/generic_calls/curreny_cases.v create mode 100644 vlib/v/tests/generic_calls/faker.v create mode 100644 vlib/v/tests/generic_calls/faker_country_name.v create mode 100644 vlib/v/tests/generic_calls/faker_currency_code.v create mode 100644 vlib/v/tests/generic_calls/top_level_domain.v create mode 100644 vlib/v/tests/generic_calls/top_level_domain_cases.v diff --git a/vlib/v/markused/walker.v b/vlib/v/markused/walker.v index 7d280a5b0..e25a252ec 100644 --- a/vlib/v/markused/walker.v +++ b/vlib/v/markused/walker.v @@ -1100,6 +1100,20 @@ pub fn (mut w Walker) call_expr(mut node ast.CallExpr) { } else if node.return_type.has_flag(.result) { w.used_result++ } + if stmt.params.len > 1 && stmt.generic_names.len > 0 { + // mark concrete []T param as used + for concrete_type_list in w.table.fn_generic_types[node.fkey()] { + for k, concrete_type in concrete_type_list { + if k >= stmt.params.len - 1 { + break + } + param_typ := stmt.params[k + 1].typ + if param_typ.has_flag(.generic) && w.table.type_kind(param_typ) == .array { + w.mark_by_type(w.table.find_or_register_array(concrete_type)) + } + } + } + } } } diff --git a/vlib/v/tests/generic_calls/bug_test.v b/vlib/v/tests/generic_calls/bug_test.v new file mode 100644 index 000000000..4db532ff6 --- /dev/null +++ b/vlib/v/tests/generic_calls/bug_test.v @@ -0,0 +1,9 @@ +module main + +fn test_main() { + mut fake := Faker{} + + code := fake.currency_code() + codes := Currency.cases().map(it.to_code()) + assert codes.contains(code) +} diff --git a/vlib/v/tests/generic_calls/country.v b/vlib/v/tests/generic_calls/country.v new file mode 100644 index 000000000..23d975b06 --- /dev/null +++ b/vlib/v/tests/generic_calls/country.v @@ -0,0 +1,7 @@ +module main + +pub enum Country { + afghanistan + albania + algeria +} diff --git a/vlib/v/tests/generic_calls/country_cases.v b/vlib/v/tests/generic_calls/country_cases.v new file mode 100644 index 000000000..838c7b527 --- /dev/null +++ b/vlib/v/tests/generic_calls/country_cases.v @@ -0,0 +1,11 @@ +module main + +pub fn Country.cases() []Country { + mut cases := []Country{} + + $for country in Country.values { + case := Country.from(country.name) or { panic(err) } + cases << case + } + return cases +} diff --git a/vlib/v/tests/generic_calls/currency.v b/vlib/v/tests/generic_calls/currency.v new file mode 100644 index 000000000..cc77813d1 --- /dev/null +++ b/vlib/v/tests/generic_calls/currency.v @@ -0,0 +1,7 @@ +module main + +pub enum Currency { + afghani + argentina_peso + aruba_guilder +} diff --git a/vlib/v/tests/generic_calls/currency_to_code.v b/vlib/v/tests/generic_calls/currency_to_code.v new file mode 100644 index 000000000..4988dc942 --- /dev/null +++ b/vlib/v/tests/generic_calls/currency_to_code.v @@ -0,0 +1,9 @@ +module main + +pub fn (currency Currency) to_code() string { + return match currency { + .afghani { 'AFN' } + .argentina_peso { 'ARS' } + .aruba_guilder { 'AWG' } + } +} diff --git a/vlib/v/tests/generic_calls/curreny_cases.v b/vlib/v/tests/generic_calls/curreny_cases.v new file mode 100644 index 000000000..b4fb0aad0 --- /dev/null +++ b/vlib/v/tests/generic_calls/curreny_cases.v @@ -0,0 +1,11 @@ +module main + +pub fn Currency.cases() []Currency { + mut cases := []Currency{} + + $for currency in Currency.values { + case := Currency.from(currency.name) or { panic(err) } + cases << case + } + return cases +} diff --git a/vlib/v/tests/generic_calls/faker.v b/vlib/v/tests/generic_calls/faker.v new file mode 100644 index 000000000..8a8b4654d --- /dev/null +++ b/vlib/v/tests/generic_calls/faker.v @@ -0,0 +1,23 @@ +module main + +import rand.pcg32 { PCG32RNG } + +enum Lang { + en +} + +pub struct Faker { +pub mut: + lang Lang = .en + randomizer PCG32RNG + seeded bool +} + +pub fn (mut this Faker) random_element[T](elements []T) T { + number_of_elements := u64(elements.len) + random_index := this.randomizer.u64() % number_of_elements + + return elements[random_index] or { + panic('Failed to get random element at index ${random_index} with length ${number_of_elements}.') + } +} diff --git a/vlib/v/tests/generic_calls/faker_country_name.v b/vlib/v/tests/generic_calls/faker_country_name.v new file mode 100644 index 000000000..485958ca1 --- /dev/null +++ b/vlib/v/tests/generic_calls/faker_country_name.v @@ -0,0 +1,5 @@ +module main + +pub fn (mut this Faker) country_name() string { + return this.random_element(Country.cases()).str() +} diff --git a/vlib/v/tests/generic_calls/faker_currency_code.v b/vlib/v/tests/generic_calls/faker_currency_code.v new file mode 100644 index 000000000..cd540fab7 --- /dev/null +++ b/vlib/v/tests/generic_calls/faker_currency_code.v @@ -0,0 +1,5 @@ +module main + +pub fn (mut this Faker) currency_code() string { + return this.random_element(Currency.cases()).to_code() +} diff --git a/vlib/v/tests/generic_calls/top_level_domain.v b/vlib/v/tests/generic_calls/top_level_domain.v new file mode 100644 index 000000000..7160577e0 --- /dev/null +++ b/vlib/v/tests/generic_calls/top_level_domain.v @@ -0,0 +1,12 @@ +module main + +pub enum TopLevelDomain { + aaa + aarp + abb + abbott + abbvie + abc + able + abogado +} diff --git a/vlib/v/tests/generic_calls/top_level_domain_cases.v b/vlib/v/tests/generic_calls/top_level_domain_cases.v new file mode 100644 index 000000000..c745f48a2 --- /dev/null +++ b/vlib/v/tests/generic_calls/top_level_domain_cases.v @@ -0,0 +1,11 @@ +module main + +pub fn TopLevelDomain.cases() []TopLevelDomain { + mut cases := []TopLevelDomain{} + + $for top_level_domain in TopLevelDomain.values { + case := TopLevelDomain.from(top_level_domain.name) or { panic(err) } + cases << case + } + return cases +} -- 2.39.5