]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Move some errors to semantic analyzer pass
authorRico Tzschichholz <ricotz@ubuntu.com>
Sun, 17 Oct 2021 07:15:58 +0000 (09:15 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sun, 17 Oct 2021 07:18:38 +0000 (09:18 +0200)
codegen/valaccodememberaccessmodule.vala
vala/valamemberaccess.vala

index 4f0b6a97ece619ae0db3234508531287b2f839cc..4eaee459bb08a23accf6f168346d905212f8aea4 100644 (file)
@@ -113,20 +113,11 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
                                set_delegate_target (expr, delegate_target);
                        }
                } else if (expr.symbol_reference is ArrayLengthField) {
-                       if (expr.value_type is ArrayType && !(expr.parent_node is ElementAccess)) {
-                               Report.error (expr.source_reference, "unsupported use of length field of multi-dimensional array");
-                       }
                        set_cvalue (expr, get_array_length_cexpression (expr.inner, 1));
                } else if (expr.symbol_reference is DelegateTargetField) {
-                       if (!((DelegateType) expr.inner.value_type).delegate_symbol.has_target) {
-                               Report.error (expr.source_reference, "unsupported use of target field of delegate without target");
-                       }
                        CCodeExpression delegate_target_destroy_notify;
                        set_cvalue (expr, get_delegate_target_cexpression (expr.inner, out delegate_target_destroy_notify));
                } else if (expr.symbol_reference is DelegateDestroyField) {
-                       if (!((DelegateType) expr.inner.value_type).delegate_symbol.has_target) {
-                               Report.error (expr.source_reference, "unsupported use of destroy field of delegate without target");
-                       }
                        CCodeExpression delegate_target_destroy_notify;
                        get_delegate_target_cexpression (expr.inner, out delegate_target_destroy_notify);
                        set_cvalue (expr, delegate_target_destroy_notify);
index ef4bc22d20a8d9f81d66e699980f3f2df17905ee..a5432d614e6ff1fd877cdcbd47c754dd2d55f91b 100644 (file)
@@ -1041,6 +1041,23 @@ public class Vala.MemberAccess : Expression {
                        value_type.check (context);
                }
 
+               if (symbol_reference is ArrayLengthField) {
+                       if (inner.value_type is ArrayType && ((ArrayType) inner.value_type).rank > 1 && !(parent_node is ElementAccess)) {
+                               Report.error (source_reference, "unsupported use of length field of multi-dimensional array");
+                               error = true;
+                       }
+               } else if (symbol_reference is DelegateTargetField) {
+                       if (!((DelegateType) inner.value_type).delegate_symbol.has_target) {
+                               Report.error (source_reference, "unsupported use of target field of delegate without target");
+                               error = true;
+                       }
+               } else if (symbol_reference is DelegateDestroyField) {
+                       if (!((DelegateType) inner.value_type).delegate_symbol.has_target) {
+                               Report.error (source_reference, "unsupported use of destroy field of delegate without target");
+                               error = true;
+                       }
+               }
+
                // Provide some extra information for the code generator
                if (!tainted_access) {
                        tainted_access = is_tainted ();