summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2016-11-07 20:23:38 +0100
committerJürg Billeter <j@bitron.ch>2016-11-07 20:23:38 +0100
commitf4e0b1a7185b03668652b88b65a20d3dbe2a919a (patch)
tree29c35cb1449dcdbd44640c2e7bf8f83fb83615d5
parent368779f056b0e9e87b6e86ccb5e901415082686f (diff)
downloadvala-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.vala17
-rw-r--r--ccode/valaccodeparameter.vala2
-rw-r--r--codegen/valaccodemethodmodule.vala1
-rw-r--r--codegen/valagtypemodule.vala1
-rw-r--r--tests/Makefile.am1
-rw-r--r--tests/methods/bug774060.vala7
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);
+}