From 70f466460f035d3d0421378cc5a2ee83c3161eef Mon Sep 17 00:00:00 2001 From: ChAoS_UnItY Date: Wed, 17 Aug 2022 14:11:58 +0800 Subject: [PATCH] cgen: fix struct field name generation in auto free (#15440) --- vlib/v/gen/c/auto_free_methods.v | 5 +++-- vlib/v/gen/c/testdata/struct_field_free.out | 6 ++++++ vlib/v/gen/c/testdata/struct_field_free.vv | 15 +++++++++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 vlib/v/gen/c/testdata/struct_field_free.out create mode 100644 vlib/v/gen/c/testdata/struct_field_free.vv diff --git a/vlib/v/gen/c/auto_free_methods.v b/vlib/v/gen/c/auto_free_methods.v index 695e230143..da54f7cb65 100644 --- a/vlib/v/gen/c/auto_free_methods.v +++ b/vlib/v/gen/c/auto_free_methods.v @@ -72,6 +72,7 @@ fn (mut g Gen) gen_free_for_struct(info ast.Struct, styp string, fn_name string) } fn_builder.writeln('void ${fn_name}($styp* it) {') for field in info.fields { + field_name := c_name(field.name) sym := g.table.sym(g.unwrap_generic(field.typ)) if sym.kind !in [.string, .array, .map, .struct_] { @@ -88,9 +89,9 @@ fn (mut g Gen) gen_free_for_struct(info ast.Struct, styp string, fn_name string) g.gen_free_method(field.typ) } if is_shared { - fn_builder.writeln('\t${field_styp_fn_name}(&(it->$field.name->val));') + fn_builder.writeln('\t${field_styp_fn_name}(&(it->$field_name->val));') } else { - fn_builder.writeln('\t${field_styp_fn_name}(&(it->$field.name));') + fn_builder.writeln('\t${field_styp_fn_name}(&(it->$field_name));') } } fn_builder.writeln('}') diff --git a/vlib/v/gen/c/testdata/struct_field_free.out b/vlib/v/gen/c/testdata/struct_field_free.out new file mode 100644 index 0000000000..89d159b2ea --- /dev/null +++ b/vlib/v/gen/c/testdata/struct_field_free.out @@ -0,0 +1,6 @@ +&Class{ + class: 'abc' + register: '123' + namespace: '456' + normal: 'xyz' +} diff --git a/vlib/v/gen/c/testdata/struct_field_free.vv b/vlib/v/gen/c/testdata/struct_field_free.vv new file mode 100644 index 0000000000..1c506004cd --- /dev/null +++ b/vlib/v/gen/c/testdata/struct_field_free.vv @@ -0,0 +1,15 @@ +// Test, that the autogenerated `free` method compiles, +// on a struct that has field names that are C/C++ keywords. + +struct Class { + class string + register string + namespace string + normal string +} + +fn main() { + class := &Class{'abc', '123', '456', 'xyz'} + println(class) + class.free() +}