]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
generics-constraints: add test and improve error message
authorLorenz Wildberg <lorenz@wild-fisch.de>
Wed, 17 May 2023 19:27:56 +0000 (21:27 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 30 Jan 2024 14:19:43 +0000 (15:19 +0100)
tests/generics/multiple-classes-constraints.test [new file with mode: 0644]
vala/valagenericsymbol.vala
vala/valaobjecttypesymbol.vala
vala/valatypeparameter.vala

diff --git a/tests/generics/multiple-classes-constraints.test b/tests/generics/multiple-classes-constraints.test
new file mode 100644 (file)
index 0000000..4ca319f
--- /dev/null
@@ -0,0 +1,9 @@
+Invalid Code
+
+class Foo {}
+class Fuu {}
+
+class Bar<G> where G : Foo, Fuu {
+}
+
+void main () {}
\ No newline at end of file
index 54de021453e41275d0b249caa91b0e1c0d1d01ff..8037afaa553d773e7cf2592e3307def8da6c7b36 100644 (file)
@@ -53,4 +53,14 @@ public interface Vala.GenericSymbol : Symbol {
         * @return index of a type parameter, or -1
         */
        public abstract int get_type_parameter_index (string name);
+
+       public bool check_constraints () {
+               bool error = false;
+               foreach (var parameter in this.get_type_parameters ()) {
+                       if (!parameter.check_constraint ()) {
+                               error = true;
+                       }
+               }
+               return !error;
+       }
 }
index 794b81941ef0ba7ef2997213c5f09d11c5228435..62547ef3b8aa9f955b4d5e79fef0a022d864cdbc 100644 (file)
@@ -381,6 +381,10 @@ public abstract class Vala.ObjectTypeSymbol : TypeSymbol, GenericSymbol {
                        return !error;
                }
 
+               if (!this.check_constraints ()) {
+                       error = true;
+               }
+
                if (!external_package && has_attribute ("DBus") && !context.has_package ("gio-2.0")) {
                        error = true;
                        Report.error (source_reference, "gio-2.0 package required for DBus support");
index dd96dcd50b199ddea4617b9d3f3cac6d2c28fdd6..4314711b88bf9327c47bc968268aa2b992e6a586 100644 (file)
@@ -140,4 +140,18 @@ public class Vala.TypeParameter : TypeSymbol {
 
                return name == param2.name && parent_symbol == param2.parent_symbol;
        }
+
+       public bool check_constraint () {
+               bool class_constraint = false;
+               foreach (var type in get_type_constraints ()) {
+                       if (type.symbol is Class) {
+                               if (class_constraint) {
+                                       Report.error (source_reference, "a type parameter can only be constrained with one class type");
+                                       return false;
+                               }
+                               class_constraint = true;
+                       }
+               }
+               return true;
+       }
 }