[vala/wip/juergbi: 2/2] codegen: Add G_GNUC_FORMAT attribute for FormatArg functions



commit f4e0b1a7185b03668652b88b65a20d3dbe2a919a
Author: Jürg Billeter <j bitron ch>
Date:   Mon Nov 7 20:23:38 2016 +0100

    codegen: Add G_GNUC_FORMAT attribute for FormatArg functions
    
    https://bugzilla.gnome.org/show_bug.cgi?id=774060

 ccode/valaccodefunction.vala       |   17 ++++++++++++-----
 ccode/valaccodeparameter.vala      |    2 ++
 codegen/valaccodemethodmodule.vala |    1 +
 codegen/valagtypemodule.vala       |    1 +
 tests/Makefile.am                  |    1 +
 tests/methods/bug774060.vala       |    7 +++++++
 6 files changed, 24 insertions(+), 5 deletions(-)
---
diff --git a/ccode/valaccodefunction.vala b/ccode/valaccodefunction.vala
index 7f3b3bb..44dd5b9 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 9f1c2e1..9404f47 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 19f507b..b50380a 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 2407446..692a9bd 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 363dc29..cfda178 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 0000000..84ab9c6
--- /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);
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]