From: Rico Tzschichholz Date: Sun, 23 Jan 2022 17:46:48 +0000 (+0100) Subject: codegen: Access of inline allocated array is guaranteed to be non null X-Git-Tag: 0.52.11~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0c280b5a5f49778cdf91e5dc5b56aca36d1f1481;p=thirdparty%2Fvala.git codegen: Access of inline allocated array is guaranteed to be non null and improve null check for container in slice expression Found by -Werror=address with GCC 12 See https://gitlab.gnome.org/GNOME/vala/issues/1282 --- diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index 0a76c72cb..c7df733e3 100644 --- a/codegen/valaccodearraymodule.vala +++ b/codegen/valaccodearraymodule.vala @@ -210,6 +210,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { var splicelen = new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, cstop, cstart); set_cvalue (expr, cstartpointer); + ((GLibValue) expr.target_value).non_null = get_non_null (expr.container.target_value); // Make sure no previous length values are preserved set_array_length (expr, splicelen); } diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 77eff5877..3c76e5c10 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -4766,6 +4766,13 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { return store_temp_value (new GLibValue (type, ccall), node); } else { + CCodeExpression ccallarg; + if (node is SliceExpression) { + ccallarg = cexpr; + cexpr = get_cvalue (((SliceExpression) node).container); + } else { + ccallarg = cexpr; + } var cnotnull = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, cexpr, new CCodeConstant ("NULL")); if (type is GenericType) { // dup functions are optional for type parameters @@ -4775,9 +4782,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { if (type is GenericType) { // cast from gconstpointer to gpointer as GBoxedCopyFunc expects gpointer - ccall.add_argument (new CCodeCastExpression (cexpr, get_ccode_name (pointer_type))); + ccall.add_argument (new CCodeCastExpression (ccallarg, get_ccode_name (pointer_type))); } else { - ccall.add_argument (cexpr); + ccall.add_argument (ccallarg); } if (type is ArrayType) { diff --git a/vala/valamemberaccess.vala b/vala/valamemberaccess.vala index 5f90a8449..a56b7cf78 100644 --- a/vala/valamemberaccess.vala +++ b/vala/valamemberaccess.vala @@ -193,8 +193,11 @@ public class Vala.MemberAccess : Expression { public override bool is_non_null () { unowned Constant? c = symbol_reference as Constant; + unowned LocalVariable? l = symbol_reference as LocalVariable; if (c != null) { return (c is EnumValue || !c.type_reference.nullable); + } else if (l != null) { + return (l.variable_type is ArrayType && ((ArrayType) l.variable_type).inline_allocated); } else { return false; }