From: Rico Tzschichholz Date: Sun, 17 Oct 2021 07:15:58 +0000 (+0200) Subject: codegen: Move some errors to semantic analyzer pass X-Git-Tag: 0.55.1~133 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e71ae37140e2567074d5335229a1cdb80651acf0;p=thirdparty%2Fvala.git codegen: Move some errors to semantic analyzer pass --- diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala index 4f0b6a97e..4eaee459b 100644 --- a/codegen/valaccodememberaccessmodule.vala +++ b/codegen/valaccodememberaccessmodule.vala @@ -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); diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala index ef4bc22d2..a5432d614 100644 --- a/vala/valamemberaccess.vala +++ b/vala/valamemberaccess.vala @@ -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 ();