From: Rico Tzschichholz Date: Sun, 27 Aug 2017 07:11:48 +0000 (+0200) Subject: codegen: Adjust format-index for printf/scanf-methods which throw errors X-Git-Tag: 0.37.91~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c12ee63704bbb3a897df157f9413005e7dadb0e;p=thirdparty%2Fvala.git codegen: Adjust format-index for printf/scanf-methods which throw errors 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 --- diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala index 744bf7d6e..4efd04b72 100644 --- a/codegen/valaccodemethodmodule.vala +++ b/codegen/valaccodemethodmodule.vala @@ -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) { diff --git a/tests/Makefile.am b/tests/Makefile.am index 1b1e9e955..48c0cb0eb 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 000000000..0969935de --- /dev/null +++ b/tests/methods/bug781061.vala @@ -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) { + } +}