diff options
author | Jürg Billeter <j@bitron.ch> | 2016-11-07 20:23:38 +0100 |
---|---|---|
committer | Jürg Billeter <j@bitron.ch> | 2016-11-07 20:23:38 +0100 |
commit | f4e0b1a7185b03668652b88b65a20d3dbe2a919a (patch) | |
tree | 29c35cb1449dcdbd44640c2e7bf8f83fb83615d5 | |
parent | 368779f056b0e9e87b6e86ccb5e901415082686f (diff) | |
download | vala-wip/juergbi.tar.gz |
codegen: Add G_GNUC_FORMAT attribute for FormatArg functionswip/juergbi
https://bugzilla.gnome.org/show_bug.cgi?id=774060
-rw-r--r-- | ccode/valaccodefunction.vala | 17 | ||||
-rw-r--r-- | ccode/valaccodeparameter.vala | 2 | ||||
-rw-r--r-- | codegen/valaccodemethodmodule.vala | 1 | ||||
-rw-r--r-- | codegen/valagtypemodule.vala | 1 | ||||
-rw-r--r-- | tests/Makefile.am | 1 | ||||
-rw-r--r-- | tests/methods/bug774060.vala | 7 |
6 files changed, 24 insertions, 5 deletions
diff --git a/ccode/valaccodefunction.vala b/ccode/valaccodefunction.vala index 7f3b3bb12..44dd5b956 100644 --- a/ccode/valaccodefunction.vala +++ b/ccode/valaccodefunction.vala @@ -126,16 +126,19 @@ public class Vala.CCodeFunction : CCodeNode { writer.write_string (name); writer.write_string (" ("); - bool first = true; + int i = 0; + int format_arg_index = -1; foreach (CCodeParameter param in parameters) { - if (!first) { + if (i > 0) { writer.write_string (", "); - } else { - first = false; } param.write (writer); + if (param.format_arg) { + format_arg_index = i; + } + i++; } - if (first) { + if (i == 0) { writer.write_string ("void"); } @@ -146,6 +149,10 @@ public class Vala.CCodeFunction : CCodeNode { } if (is_declaration) { + if (format_arg_index >= 0) { + writer.write_string (" G_GNUC_FORMAT(%d)".printf (format_arg_index + 1)); + } + if (attributes != null) { writer.write_string (" "); writer.write_string (attributes); diff --git a/ccode/valaccodeparameter.vala b/ccode/valaccodeparameter.vala index 9f1c2e186..9404f470c 100644 --- a/ccode/valaccodeparameter.vala +++ b/ccode/valaccodeparameter.vala @@ -42,6 +42,8 @@ public class Vala.CCodeParameter : CCodeNode { */ public bool ellipsis { get; set; } + public bool format_arg { get; set; } + public CCodeParameter (string n, string type) { name = n; type_name = type; diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala index 19f507b60..b50380a9a 100644 --- a/codegen/valaccodemethodmodule.vala +++ b/codegen/valaccodemethodmodule.vala @@ -881,6 +881,7 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule { } cparam = new CCodeParameter (get_variable_cname (param.name), ctypename); + cparam.format_arg = param.format_arg; } else if (ellipses_to_valist) { cparam = new CCodeParameter ("_vala_va_list", "va_list"); } else { diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala index 2407446f7..692a9bd33 100644 --- a/codegen/valagtypemodule.vala +++ b/codegen/valagtypemodule.vala @@ -38,6 +38,7 @@ public class Vala.GTypeModule : GErrorModule { } var cparam = new CCodeParameter (get_variable_cname (param.name), ctypename); + cparam.format_arg = param.format_arg; cparam_map.set (get_param_pos (get_ccode_pos (param)), cparam); if (carg_map != null) { diff --git a/tests/Makefile.am b/tests/Makefile.am index 363dc29bf..cfda178d9 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -76,6 +76,7 @@ TESTS = \ methods/bug737222.vala \ methods/bug743877.vala \ methods/bug771964.vala \ + methods/bug774060.vala \ methods/generics.vala \ methods/printf-invalid.test \ methods/printf-constructor.vala \ diff --git a/tests/methods/bug774060.vala b/tests/methods/bug774060.vala new file mode 100644 index 000000000..84ab9c665 --- /dev/null +++ b/tests/methods/bug774060.vala @@ -0,0 +1,7 @@ +unowned string format_wrapper ([FormatArg] string format) { + return format; +} + +void main () { + print (format_wrapper ("%d"), 42); +} |