]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
vala: Check accessibility of default arguments
authorSimon Werbeck <simon.werbeck@gmail.com>
Sat, 1 Oct 2016 22:20:59 +0000 (00:20 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Thu, 6 Oct 2016 12:53:40 +0000 (14:53 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=648030

20 files changed:
tests/Makefile.am
tests/methods/bug648030.test [new file with mode: 0644]
vala/valaaddressofexpression.vala
vala/valaarraycreationexpression.vala
vala/valaassignment.vala
vala/valabinaryexpression.vala
vala/valacastexpression.vala
vala/valaconditionalexpression.vala
vala/valaelementaccess.vala
vala/valaexpression.vala
vala/valainitializerlist.vala
vala/valamemberaccess.vala
vala/valamethodcall.vala
vala/valaobjectcreationexpression.vala
vala/valaparameter.vala
vala/valapointerindirection.vala
vala/valapostfixexpression.vala
vala/valareferencetransferexpression.vala
vala/valasliceexpression.vala
vala/valaunaryexpression.vala

index 8fcf079f3a5d9a1e27ed73845c3069d40f14d777..e10be4d5d43cb984c6c7861736ae81c092382e6a 100644 (file)
@@ -61,6 +61,7 @@ TESTS = \
        methods/bug642885.vala \
        methods/bug642899.vala \
        methods/bug646345.vala \
+       methods/bug648030.test \
        methods/bug648320.vala \
        methods/bug649562.vala \
        methods/bug652098.vala \
diff --git a/tests/methods/bug648030.test b/tests/methods/bug648030.test
new file mode 100644 (file)
index 0000000..e86e737
--- /dev/null
@@ -0,0 +1,10 @@
+Invalid Code
+
+const int FOO = 1;
+
+public void foo (int bar = FOO) {
+}
+
+void main () {
+       foo ();
+}
index 81123eec8b9c2e1ac4d2597af5dd9522c392b6c9..b5371745d2f100f7c8cb8e7ed3ea60c7e1b2e8e7 100644 (file)
@@ -72,6 +72,10 @@ public class Vala.AddressofExpression : Expression {
                return inner.is_pure ();
        }
 
+       public override bool is_accessible (Symbol sym) {
+               return inner.is_accessible (sym);
+       }
+
        public override bool check (CodeContext context) {
                if (checked) {
                        return !error;
index 58947842118a4a29b674ea6a28a8f1a8d104f3d3..a43315788a116b31a6bedf44010a8f62d12e28a0 100644 (file)
@@ -113,6 +113,20 @@ public class Vala.ArrayCreationExpression : Expression {
                return false;
        }
 
+       public override bool is_accessible (Symbol sym) {
+               foreach (Expression e in sizes) {
+                       if (!e.is_accessible (sym)) {
+                               return false;
+                       }
+               }
+
+               if (initializer_list != null) {
+                       return initializer_list.is_accessible (sym);
+               }
+
+               return true;
+       }
+
        public override void replace_expression (Expression old_node, Expression new_node) {
                for (int i = 0; i < sizes.size; i++) {
                        if (sizes[i] == old_node) {
index fc27acf6304d0ffd7c9e293c5de8f4f2aeb728a2..88e45ffda896b4ebcb8fb4f2b37cd95297b7c1f0 100644 (file)
@@ -97,6 +97,10 @@ public class Vala.Assignment : Expression {
                return false;
        }
 
+       public override bool is_accessible (Symbol sym) {
+               return left.is_accessible (sym) && right.is_accessible (sym);
+       }
+
        public override bool check (CodeContext context) {
                if (checked) {
                        return !error;
index e57ebb4d6632dbb50dee0cc60a035729f7e1de7e..b081090d0305a841f39e0ac6a078862eb9e4304c 100644 (file)
@@ -141,6 +141,10 @@ public class Vala.BinaryExpression : Expression {
                return left.is_non_null () && right.is_non_null ();
        }
 
+       public override bool is_accessible (Symbol sym) {
+               return left.is_accessible (sym) && right.is_accessible (sym);
+       }
+
        public override bool check (CodeContext context) {
                if (checked) {
                        return !error;
index 36edb73c2de2809b482afc1bf8dfc3d1d0a192a4..f9e3d3009b554b7207252dde3be1765c7836de44 100644 (file)
@@ -103,6 +103,10 @@ public class Vala.CastExpression : Expression {
                return inner.is_pure ();
        }
 
+       public override bool is_accessible (Symbol sym) {
+               return inner.is_accessible (sym);
+       }
+
        public override void replace_type (DataType old_type, DataType new_type) {
                if (type_reference == old_type) {
                        type_reference = new_type;
index 3ae003cd1662c6f1670035273215d61c00e8b26a..74cba969bcfe1aa97c178bd0a0a4713f7d9e8453 100644 (file)
@@ -100,6 +100,10 @@ public class Vala.ConditionalExpression : Expression {
                return condition.is_pure () && true_expression.is_pure () && false_expression.is_pure ();
        }
 
+       public override bool is_accessible (Symbol sym) {
+               return condition.is_accessible (sym) && true_expression.is_accessible (sym) && false_expression.is_accessible (sym);
+       }
+
        public override bool check (CodeContext context) {
                if (checked) {
                        return !error;
index b879ffc9f0469ebbbe147a250997fd86b1740ac3..4fb44b8c4628d4c43219385ec657581c287d4a49 100644 (file)
@@ -96,6 +96,16 @@ public class Vala.ElementAccess : Expression {
                return container.is_pure ();
        }
 
+       public override bool is_accessible (Symbol sym) {
+               foreach (Expression index in indices) {
+                       if (!index.is_accessible (sym)) {
+                               return false;
+                       }
+               }
+
+               return container.is_accessible (sym);
+       }
+
        public override bool check (CodeContext context) {
                if (checked) {
                        return !error;
index 620086e9806d220a32506065cf8402d0c5c2780c..5f7a02333935616f9f0d7a1f180c2bfce7525ed2 100644 (file)
@@ -78,6 +78,14 @@ public abstract class Vala.Expression : CodeNode {
                return false;
        }
 
+       /**
+        * Check whether symbol_references in this expression are at least
+        * as accessible as the specified symbol.
+        */
+       public virtual bool is_accessible (Symbol sym) {
+               return true;
+       }
+
        public Statement? parent_statement {
                get {
                        var expr = parent_node as Expression;
index 6955aad1e22dabb03bad33f62082d70dcdde16e2..c1f97ca3eb54456dee5707e3bca02c81ddac044f 100644 (file)
@@ -96,6 +96,16 @@ public class Vala.InitializerList : Expression {
                return true;
        }
 
+       public override bool is_accessible (Symbol sym) {
+               foreach (Expression initializer in initializers) {
+                       if (!initializer.is_accessible (sym)) {
+                               return false;
+                       }
+               }
+
+               return true;
+       }
+
        public override void replace_expression (Expression old_node, Expression new_node) {
                for (int i = 0; i < initializers.size; i++) {
                        if (initializers[i] == old_node) {
index 2bab0b0df98b7898b2f86749eabe424f2c55116b..6911bef65476f5b5c2e33933ecd0f98ed2919082 100644 (file)
@@ -156,6 +156,10 @@ public class Vala.MemberAccess : Expression {
                return (inner == null || inner.is_pure ()) && !(symbol_reference is Property);
        }
 
+       public override bool is_accessible (Symbol sym) {
+               return (inner == null || inner.is_accessible (sym)) && symbol_reference.is_accessible (sym);
+       }
+
        public override void replace_type (DataType old_type, DataType new_type) {
                for (int i = 0; i < type_argument_list.size; i++) {
                        if (type_argument_list[i] == old_type) {
index 23712a2230ce12f3846a2798aebb816837976096..3d5835c71923acfeba1e8f1ebf747aa5fe0baf75 100644 (file)
@@ -130,6 +130,16 @@ public class Vala.MethodCall : Expression {
                return false;
        }
 
+       public override bool is_accessible (Symbol sym) {
+               foreach (var arg in argument_list) {
+                       if (!arg.is_accessible (sym)) {
+                               return false;
+                       }
+               }
+
+               return call.is_accessible (sym);
+       }
+
        bool is_chainup () {
                if (!(call.symbol_reference is CreationMethod)) {
                        return false;
index 954f77c4cae55d73ab7e5c9b3a06869dbad9ebb2..8481f443e5edb48246c92db87c91d14a18d45422 100644 (file)
@@ -139,6 +139,26 @@ public class Vala.ObjectCreationExpression : Expression {
                return false;
        }
 
+       public override bool is_accessible (Symbol sym) {
+               if (member_name != null && !member_name.is_accessible (sym)) {
+                       return false;
+               }
+
+               foreach (var arg in argument_list) {
+                       if (!arg.is_accessible (sym)) {
+                               return false;
+                       }
+               }
+
+               foreach (var init in object_initializer) {
+                       if (!init.initializer.is_accessible (sym)) {
+                               return false;
+                       }
+               }
+
+               return true;
+       }
+
        public override void replace_type (DataType old_type, DataType new_type) {
                if (type_reference == old_type) {
                        type_reference = new_type;
index b55374c37d83cb3b57cf4e3e0015645c34cb44c8..67d172ebc43d5c4cbde0d4bca3b90c79a286b434 100644 (file)
@@ -174,6 +174,8 @@ public class Vala.Parameter : Variable {
                                Report.error (initializer.source_reference, "Cannot convert from `%s' to `%s'".printf (initializer.value_type.to_string (), variable_type.to_string ()));
                        } else if (direction == ParameterDirection.REF) {
                                Report.error (source_reference, "default value not allowed for ref parameter");
+                       } else if (!initializer.is_accessible (this)) {
+                               Report.error (initializer.source_reference, "default value is less accessible than method `%s'".printf (parent_symbol.get_full_name ()));
                        }
                }
 
index fffbf9358d6735e2a54465bd8593ba18175af7ec..ec8b6b4f77dfc2d5b224e2631cf35fa1d745d1d0 100644 (file)
@@ -69,6 +69,10 @@ public class Vala.PointerIndirection : Expression {
                return inner.is_pure ();
        }
 
+       public override bool is_accessible (Symbol sym) {
+               return inner.is_accessible (sym);
+       }
+
        public override bool check (CodeContext context) {
                if (checked) {
                        return !error;
index 2c829b468aadd54b4bb9e660d3f9794fd913d52c..05274c1e99d819135b5dd4ab2a3e2a288c3b662d 100644 (file)
@@ -72,6 +72,10 @@ public class Vala.PostfixExpression : Expression {
                return false;
        }
 
+       public override bool is_accessible (Symbol sym) {
+               return inner.is_accessible (sym);
+       }
+
        public override void get_defined_variables (Collection<Variable> collection) {
                inner.get_defined_variables (collection);
                var local = inner.symbol_reference as LocalVariable;
index 7ceba6d70e9087f1c46c42f3aef5e80fa40cfba7..ceb51a2a2cc2944237cf24f430a336729dde271a 100644 (file)
@@ -71,6 +71,10 @@ public class Vala.ReferenceTransferExpression : Expression {
                return false;
        }
 
+       public override bool is_accessible (Symbol sym) {
+               return inner.is_accessible (sym);
+       }
+
        public override bool check (CodeContext context) {
                if (checked) {
                        return !error;
index 5b1675be83a717839b2f0e5b287fad53bbba3305..6621b41d81f1a53433709c411a2846eddeea453d 100644 (file)
@@ -98,6 +98,10 @@ public class Vala.SliceExpression : Expression {
                return false;
        }
 
+       public override bool is_accessible (Symbol sym) {
+               return container.is_accessible (sym) && start.is_accessible (sym) && stop.is_accessible (sym);
+       }
+
        public override bool check (CodeContext context) {
                if (checked) {
                        return !error;
index ed308417f53e484566bf4c6a4e8c7253409a2663..dfc795cebedf90bd3f070bbb4e230b4ede699407 100644 (file)
@@ -120,6 +120,10 @@ public class Vala.UnaryExpression : Expression {
                return inner.is_pure ();
        }
 
+       public override bool is_accessible (Symbol sym) {
+               return inner.is_accessible (sym);
+       }
+
        bool is_numeric_type (DataType type) {
                if (!(type.data_type is Struct)) {
                        return false;