]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Adjust format-index for printf/scanf-methods which throw errors
authorRico Tzschichholz <ricotz@ubuntu.com>
Sun, 27 Aug 2017 07:11:48 +0000 (09:11 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sun, 27 Aug 2017 07:11:48 +0000 (09:11 +0200)
If there is no explicit FormatArg annotation while this method throws an
error, it is required to mark the parameter located right before ellipsis
as format-arg to account for the parameter shifting caused by the inserted
GError parameter.

https://bugzilla.gnome.org/show_bug.cgi?id=781061

codegen/valaccodemethodmodule.vala
tests/Makefile.am
tests/methods/bug781061.vala [new file with mode: 0644]

index 744bf7d6e878900f93d32bcb22ccd9284d07bc9e..4efd04b7225e757e464b4b22fe1e1d30824dced9 100644 (file)
@@ -1008,6 +1008,9 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
                        }
                }
 
+               var needs_format_arg = m.get_format_arg_index () < 0 && (m.printf_format || m.scanf_format);
+
+               CCodeParameter? prev_cparam = null;
                foreach (Parameter param in m.get_parameters ()) {
                        if (param.direction != ParameterDirection.OUT) {
                                if ((direction & 1) == 0) {
@@ -1021,7 +1024,17 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
                                }
                        }
 
-                       generate_parameter (param, decl_space, cparam_map, carg_map);
+                       var cparam = generate_parameter (param, decl_space, cparam_map, carg_map);
+
+                       // if there is no explicit FormatArg annotation while this method throws an error
+                       // it is required to mark the parameter located right before ellipsis as format-arg
+                       // to account for the parameter shifting caused by the inserted GError parameter
+                       if (needs_format_arg) {
+                               if (prev_cparam != null && cparam.ellipsis) {
+                                       prev_cparam.modifiers |= CCodeModifiers.FORMAT_ARG;
+                               }
+                               prev_cparam = cparam;
+                       }
                }
 
                if ((direction & 2) != 0) {
index 1b1e9e955dbe166bf4dc0bef806e59a20e142c10..48c0cb0eb9546747e24ec4801f9a025adde1195e 100644 (file)
@@ -94,6 +94,7 @@ TESTS = \
        methods/bug771964.vala \
        methods/bug774060.vala \
        methods/bug775466.test \
+       methods/bug781061.vala \
        methods/generics.vala \
        methods/printf-invalid.test \
        methods/printf-constructor.vala \
diff --git a/tests/methods/bug781061.vala b/tests/methods/bug781061.vala
new file mode 100644 (file)
index 0000000..0969935
--- /dev/null
@@ -0,0 +1,30 @@
+errordomain FooError {
+       FAILED;
+}
+
+[PrintfFormat]
+void print_something_throws (bool ok, string format, ...) throws FooError {
+       var vargs = va_list ();
+       print_something_vargs_throws (ok, format, vargs);
+}
+
+[PrintfFormat]
+void print_something_vargs_throws (bool ok, string format, va_list vargs) throws FooError {
+}
+
+[ScanfFormat]
+void scan_something_throws (bool ok, string format, ...) throws FooError {
+}
+
+[ScanfFormat]
+void scan_something_vargs_throws (bool ok, string format, va_list vargs) throws FooError {
+}
+
+void main () {
+       try {
+               print_something_throws (true, "%s", "foo");
+               int i;
+               scan_something_throws (false, "%d", out i);
+       } catch (FooError e) {
+       }
+}