From 088c20b742552fadff92d51ccc7224da75bbeb51 Mon Sep 17 00:00:00 2001 From: Rico Tzschichholz Date: Sun, 24 Feb 2019 21:44:48 +0100 Subject: [PATCH] codegen: Respect array_length_cname attribute for global fields --- codegen/valaccodebasemodule.vala | 4 ++-- tests/Makefile.am | 3 +++ tests/arrays/class-field-length-cname.vala | 13 +++++++++++++ tests/arrays/field-global-length-cname.vala | 10 ++++++++++ tests/arrays/struct-field-length-cname.vala | 12 ++++++++++++ 5 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 tests/arrays/class-field-length-cname.vala create mode 100644 tests/arrays/field-global-length-cname.vala create mode 100644 tests/arrays/struct-field-length-cname.vala diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 533d230fd..612ac7947 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -1099,7 +1099,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { for (int dim = 1; dim <= array_type.rank; dim++) { cdecl = new CCodeDeclaration (length_ctype); - cdecl.add_declarator (new CCodeVariableDeclarator (get_array_length_cname (get_ccode_name (f), dim))); + cdecl.add_declarator (new CCodeVariableDeclarator (get_variable_array_length_cname (f, dim))); if (f.is_private_symbol ()) { cdecl.modifiers = CCodeModifiers.STATIC; } else if (context.hide_internal && f.is_internal_symbol ()) { @@ -1306,7 +1306,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { for (int dim = 1; dim <= array_type.rank; dim++) { var len_def = new CCodeDeclaration (length_ctype); - len_def.add_declarator (new CCodeVariableDeclarator (get_array_length_cname (get_ccode_name (f), dim), new CCodeConstant ("0"))); + len_def.add_declarator (new CCodeVariableDeclarator (get_variable_array_length_cname (f, dim), new CCodeConstant ("0"))); if (!f.is_private_symbol ()) { len_def.modifiers = CCodeModifiers.EXTERN; } else { diff --git a/tests/Makefile.am b/tests/Makefile.am index b8288288e..62b56163c 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -67,6 +67,9 @@ TESTS = \ basic-types/bug777697.test \ basic-types/bug787152.vala \ basic-types/bug788775.vala \ + arrays/class-field-length-cname.vala \ + arrays/field-global-length-cname.vala \ + arrays/struct-field-length-cname.vala \ chainup/base-class-invalid.test \ chainup/base-enum-invalid.test \ chainup/base-invalid.test \ diff --git a/tests/arrays/class-field-length-cname.vala b/tests/arrays/class-field-length-cname.vala new file mode 100644 index 000000000..39f54f7e8 --- /dev/null +++ b/tests/arrays/class-field-length-cname.vala @@ -0,0 +1,13 @@ +class Bar { + [CCode (array_length_cname = "foo_len")] + public int[] foo; + + // would cause a symbol clash + public int foo_length1; +} + +void main () { + var bar = new Bar (); + bar.foo = { 23, 42 }; + assert (bar.foo.length == 2); +} diff --git a/tests/arrays/field-global-length-cname.vala b/tests/arrays/field-global-length-cname.vala new file mode 100644 index 000000000..2422befb2 --- /dev/null +++ b/tests/arrays/field-global-length-cname.vala @@ -0,0 +1,10 @@ +[CCode (array_length_cname = "foo_len")] +public int[] foo; + +// would cause a symbol clash +int foo_length1; + +void main () { + foo = { 23, 42 }; + assert (foo.length == 2); +} diff --git a/tests/arrays/struct-field-length-cname.vala b/tests/arrays/struct-field-length-cname.vala new file mode 100644 index 000000000..dc7320d0d --- /dev/null +++ b/tests/arrays/struct-field-length-cname.vala @@ -0,0 +1,12 @@ +struct Bar { + [CCode (array_length_cname = "foo_len")] + public int[] foo; + + // would cause a symbol clash + public int foo_length1; +} + +void main () { + Bar bar = {{ 23, 42 }, -1}; + assert (bar.foo.length == 2); +} -- 2.47.2