summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2021-06-23 10:56:01 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2021-07-22 10:57:33 +0200
commit97c5da3d941211d69b3bfad9100cb6b64f7bef2b (patch)
tree529cbe4187a68cdf776ac84c3d0e67fb1831f56f
parent90f6ea4860a8084c139d10bbf4a14f40313fb24c (diff)
downloadvala-97c5da3d941211d69b3bfad9100cb6b64f7bef2b.tar.gz
codegen: Fix variadic constructors for compact classes and structs
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1195
-rw-r--r--codegen/valaccodebasemodule.vala3
-rw-r--r--codegen/valaccodemethodmodule.vala19
-rw-r--r--tests/Makefile.am4
-rw-r--r--tests/objects/constructor-variadic-invalid.test (renamed from tests/objects/constructor-variadic.test)0
-rw-r--r--tests/objects/constructor-variadic.vala35
-rw-r--r--tests/structs/constructor-variadic.vala18
6 files changed, 70 insertions, 9 deletions
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 8bfb867f6..eea30654c 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -4896,7 +4896,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
} else if (st != null && get_ccode_name (st) == "va_list") {
creation_call.add_argument (instance);
if (get_ccode_name (m) == "va_start") {
- if (in_creation_method) {
+ unowned Class? parent = current_method.parent_symbol as Class;
+ if (in_creation_method && parent != null && !parent.is_compact) {
creation_call = new CCodeFunctionCall (new CCodeIdentifier ("va_copy"));
creation_call.add_argument (instance);
creation_call.add_argument (new CCodeIdentifier ("_vala_va_list"));
diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala
index 1a197e11a..459097e90 100644
--- a/codegen/valaccodemethodmodule.vala
+++ b/codegen/valaccodemethodmodule.vala
@@ -317,11 +317,6 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
* with _new in visit_creation_method).
*/
public override void visit_method (Method m) {
- string real_name = get_ccode_real_name (m);
- if (m is CreationMethod && m.is_variadic ()) {
- real_name = get_ccode_constructv_name ((CreationMethod) m);
- }
-
push_context (new EmitContext (m));
push_line (m.source_reference);
@@ -330,8 +325,10 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
bool profile = m.get_attribute ("Profile") != null;
+ string real_name = get_ccode_real_name (m);
+
if (m is CreationMethod) {
- var cl = current_type_symbol as Class;
+ unowned Class? cl = m.parent_symbol as Class;
if (cl != null && !cl.is_compact) {
if (cl.base_class == null) {
in_fundamental_creation_method = true;
@@ -339,6 +336,9 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
in_gobject_creation_method = true;
}
}
+ if (cl != null && !cl.is_compact && m.is_variadic ()) {
+ real_name = get_ccode_constructv_name ((CreationMethod) m);
+ }
}
var creturn_type = get_callable_creturn_type (m);
@@ -1257,7 +1257,12 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
public override void visit_creation_method (CreationMethod m) {
push_line (m.source_reference);
- ellipses_to_valist = true;
+ unowned Class? cl = m.parent_symbol as Class;
+ if (cl != null && !cl.is_compact) {
+ ellipses_to_valist = true;
+ } else {
+ ellipses_to_valist = false;
+ }
visit_method (m);
ellipses_to_valist = false;
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 38b57c5fa..b1742fd48 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -340,6 +340,7 @@ TESTS = \
structs/struct-static-field-initializer.test \
structs/struct-static-property-initializer.test \
structs/structs.vala \
+ structs/constructor-variadic.vala \
structs/constructor-wrong-name.test \
structs/default-gtype.vala \
structs/gmutex.vala \
@@ -436,7 +437,8 @@ TESTS = \
objects/compact-class-custom-ref.vala \
objects/constructor-abstract-public.test \
objects/constructor-inner-error.vala \
- objects/constructor-variadic.test \
+ objects/constructor-variadic.vala \
+ objects/constructor-variadic-invalid.test \
objects/constructor-wrong-name.test \
objects/constructors.vala \
objects/destructors.vala \
diff --git a/tests/objects/constructor-variadic.test b/tests/objects/constructor-variadic-invalid.test
index ed9527d99..ed9527d99 100644
--- a/tests/objects/constructor-variadic.test
+++ b/tests/objects/constructor-variadic-invalid.test
diff --git a/tests/objects/constructor-variadic.vala b/tests/objects/constructor-variadic.vala
new file mode 100644
index 000000000..58a97fe1f
--- /dev/null
+++ b/tests/objects/constructor-variadic.vala
@@ -0,0 +1,35 @@
+class Foo {
+ public string s;
+
+ public Foo (string first_arg, ...) {
+ assert (first_arg == "foo");
+ va_list args = va_list ();
+ string second_arg = args.arg<string> ();
+ assert (second_arg == "bar");
+ s = first_arg + second_arg;
+ }
+}
+
+[Compact]
+class Bar {
+ public string s;
+
+ public Bar (string first_arg, ...) {
+ assert (first_arg == "bar");
+ va_list args = va_list ();
+ string second_arg = args.arg<string> ();
+ assert (second_arg == "foo");
+ s = first_arg + second_arg;
+ }
+}
+
+void main () {
+ {
+ var foo = new Foo ("foo", "bar");
+ assert (foo.s == "foobar");
+ }
+ {
+ var bar = new Bar ("bar", "foo");
+ assert (bar.s == "barfoo");
+ }
+}
diff --git a/tests/structs/constructor-variadic.vala b/tests/structs/constructor-variadic.vala
new file mode 100644
index 000000000..2602fe20b
--- /dev/null
+++ b/tests/structs/constructor-variadic.vala
@@ -0,0 +1,18 @@
+struct Foo {
+ public string s;
+
+ public Foo (string first_arg, ...) {
+ assert (first_arg == "foo");
+ va_list args = va_list ();
+ string second_arg = args.arg<string> ();
+ assert (second_arg == "bar");
+ s = first_arg + second_arg;
+ }
+}
+
+void main () {
+ {
+ var foo = Foo ("foo", "bar");
+ assert (foo.s == "foobar");
+ }
+}