From a2081382832d9a81067d6510298edd2e23eb597c Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Tue, 31 Aug 2021 15:55:32 +0300 Subject: [PATCH] v.markused: support a const used as default value in struct init --- vlib/v/markused/walker.v | 6 +++++ ...d_in_struct_default_init_recursive.run.out | 12 +++++++++ ...default_init_recursive.skip_unused.run.out | 12 +++++++++ ...t_used_in_struct_default_init_recursive.vv | 27 +++++++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 vlib/v/tests/skip_unused/const_used_in_struct_default_init_recursive.run.out create mode 100644 vlib/v/tests/skip_unused/const_used_in_struct_default_init_recursive.skip_unused.run.out create mode 100644 vlib/v/tests/skip_unused/const_used_in_struct_default_init_recursive.vv diff --git a/vlib/v/markused/walker.v b/vlib/v/markused/walker.v index 3e7cde32f1..e835185fe5 100644 --- a/vlib/v/markused/walker.v +++ b/vlib/v/markused/walker.v @@ -33,6 +33,9 @@ pub fn (mut w Walker) mark_const_as_used(ckey string) { $if trace_skip_unused_marked ? { eprintln(' const > |$ckey|') } + if w.used_consts[ckey] { + return + } w.used_consts[ckey] = true cfield := w.all_consts[ckey] or { return } w.expr(cfield.expr) @@ -42,6 +45,9 @@ pub fn (mut w Walker) mark_global_as_used(ckey string) { $if trace_skip_unused_marked ? { eprintln(' global > |$ckey|') } + if w.used_globals[ckey] { + return + } w.used_globals[ckey] = true gfield := w.all_globals[ckey] or { return } w.expr(gfield.expr) diff --git a/vlib/v/tests/skip_unused/const_used_in_struct_default_init_recursive.run.out b/vlib/v/tests/skip_unused/const_used_in_struct_default_init_recursive.run.out new file mode 100644 index 0000000000..3dc3bf2ade --- /dev/null +++ b/vlib/v/tests/skip_unused/const_used_in_struct_default_init_recursive.run.out @@ -0,0 +1,12 @@ +&Symbol{ + name: 'void' + parent: &nil + return_type: &nil + is_top_level: true + generic_placeholder_len: 0 + sumtype_children_len: 0 + interface_children_len: 0 + children: [] + file_path: '' + file_version: 0 +} diff --git a/vlib/v/tests/skip_unused/const_used_in_struct_default_init_recursive.skip_unused.run.out b/vlib/v/tests/skip_unused/const_used_in_struct_default_init_recursive.skip_unused.run.out new file mode 100644 index 0000000000..3dc3bf2ade --- /dev/null +++ b/vlib/v/tests/skip_unused/const_used_in_struct_default_init_recursive.skip_unused.run.out @@ -0,0 +1,12 @@ +&Symbol{ + name: 'void' + parent: &nil + return_type: &nil + is_top_level: true + generic_placeholder_len: 0 + sumtype_children_len: 0 + interface_children_len: 0 + children: [] + file_path: '' + file_version: 0 +} diff --git a/vlib/v/tests/skip_unused/const_used_in_struct_default_init_recursive.vv b/vlib/v/tests/skip_unused/const_used_in_struct_default_init_recursive.vv new file mode 100644 index 0000000000..ea1653027e --- /dev/null +++ b/vlib/v/tests/skip_unused/const_used_in_struct_default_init_recursive.vv @@ -0,0 +1,27 @@ +module main + +pub const void_type = &Symbol{ + name: 'void' + file_path: '' + file_version: 0 + is_top_level: true +} + +[heap] +pub struct Symbol { +pub mut: + name string + parent &Symbol = void_type // parent is for typedefs, aliases + return_type &Symbol = void_type // return_type is for functions and variables + is_top_level bool [required] + generic_placeholder_len int + sumtype_children_len int + interface_children_len int + children []&Symbol // methods, sum types, map types, optionals, struct fields, etc. + file_path string [required] // required in order to register the symbol at its appropriate directory. + file_version int [required] // file version when the symbol was registered +} + +fn main() { + println(void_type) +}