From: Aaron Andersen Date: Sat, 10 Dec 2011 18:58:18 +0000 (+0100) Subject: Support creation of arrays with nullable elements X-Git-Tag: 0.15.1~104 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bce3e8474a8238ff5a0bb697a0f94a54c2d959d3;p=thirdparty%2Fvala.git Support creation of arrays with nullable elements Partially fixes bug 571486. --- diff --git a/tests/basic-types/arrays.vala b/tests/basic-types/arrays.vala index 708f2469e..5d4d0c4f9 100644 --- a/tests/basic-types/arrays.vala +++ b/tests/basic-types/arrays.vala @@ -41,6 +41,13 @@ void test_integer_array () { // in expressions assert (23 in a); assert (!(-1 in a)); + + // nullable elements + int?[] d = new int?[2]; + d[0] = 10; + d[1] = null; + assert (d[0] == 10); + assert (d[1] == null); } void test_string_array () { diff --git a/vala/valaarraytype.vala b/vala/valaarraytype.vala index 040df21c2..d69a6238d 100644 --- a/vala/valaarraytype.vala +++ b/vala/valaarraytype.vala @@ -188,6 +188,10 @@ public class Vala.ArrayType : ReferenceType { return false; } + if (element_type.nullable != target_array_type.element_type.nullable) { + return false; + } + if (element_type.compatible (target_array_type.element_type) && target_array_type.element_type.compatible (element_type)) { return true; diff --git a/vala/valaparser.vala b/vala/valaparser.vala index 45db4043a..76ea0b92d 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -844,7 +844,12 @@ public class Vala.Parser : CodeVisitor { var expr = parse_object_creation_expression (begin, member); return expr; } else { + bool is_pointer_type = false; while (accept (TokenType.STAR)) { + is_pointer_type = true; + } + if (!is_pointer_type) { + accept (TokenType.INTERR); } if (accept (TokenType.OPEN_BRACKET)) { rollback (begin); @@ -898,8 +903,15 @@ public class Vala.Parser : CodeVisitor { expect (TokenType.NEW); var member = parse_member_name (); DataType element_type = UnresolvedType.new_from_expression (member); + bool is_pointer_type = false; while (accept (TokenType.STAR)) { element_type = new PointerType (element_type, get_src (begin)); + is_pointer_type = true; + } + if (!is_pointer_type) { + if (accept (TokenType.INTERR)) { + element_type.nullable = true; + } } expect (TokenType.OPEN_BRACKET);