From: Rico Tzschichholz Date: Sun, 24 Feb 2019 20:44:48 +0000 (+0100) Subject: codegen: Respect array_length_cname attribute for global fields X-Git-Tag: 0.43.92~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=088c20b742552fadff92d51ccc7224da75bbeb51;p=thirdparty%2Fvala.git codegen: Respect array_length_cname attribute for global fields --- 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); +}