]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Parameter following ellipsis parameter is not allowed
authorwxx <769218589@qq.com>
Thu, 14 Oct 2021 09:48:00 +0000 (17:48 +0800)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 19 Oct 2021 07:46:56 +0000 (09:46 +0200)
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1237

tests/Makefile.am
tests/methods/ellipsis-preceding.test [new file with mode: 0644]
vala/valamethod.vala

index 541fb6554fb65d382d9d3460e2905b728b39e9e3..ae349562dc50b10bf5e60dbcddb6536364d4727a 100644 (file)
@@ -167,6 +167,7 @@ TESTS = \
        methods/lambda.vala \
        methods/closures.vala \
        methods/contains.vala \
+       methods/ellipsis-preceding.test \
        methods/extern.vala \
        methods/iterator.vala \
        methods/parameter-fixed-array-initializer.vala \
diff --git a/tests/methods/ellipsis-preceding.test b/tests/methods/ellipsis-preceding.test
new file mode 100644 (file)
index 0000000..b687a33
--- /dev/null
@@ -0,0 +1,7 @@
+Invalid Code
+
+void foo (int i, ..., int j) {
+}
+
+void main () {
+}
index 9c34c7ad04302193337b16c29c11cc222c278bef..eeb3f1e44304d90e3ddaabdc2a3078ee30a44fe9 100644 (file)
@@ -842,6 +842,7 @@ public class Vala.Method : Subroutine, Callable {
 
                var optional_param = false;
                var params_array_param = false;
+               var ellipsis_param = false;
                foreach (Parameter param in parameters) {
                        if (!param.check (context)) {
                                error = true;
@@ -866,11 +867,18 @@ public class Vala.Method : Subroutine, Callable {
                                optional_param = true;
                        }
 
+                       // Disallow parameter after params array or ellipsis
                        if (params_array_param) {
                                Report.error (param.source_reference, "parameter follows params-array parameter");
                        } else if (param.params_array) {
                                params_array_param = true;
                        }
+                       if (ellipsis_param) {
+                               Report.error (param.source_reference, "parameter follows ellipsis parameter");
+                       } else if (param.ellipsis) {
+                               ellipsis_param = true;
+                       }
+
                        // Add local variable to provide access to params arrays which will be constructed out of the given va-args
                        if (param.params_array && body != null) {
                                if (params_array_var != null) {