From: Rico Tzschichholz Date: Mon, 17 Oct 2016 11:59:48 +0000 (+0200) Subject: valaparser: Allow casts of pointer expressions without enclosing parens X-Git-Tag: 0.35.1~85 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f1ddd5a6d201ccb90563e4b46fe500b72841d6f1;p=thirdparty%2Fvala.git valaparser: Allow casts of pointer expressions without enclosing parens Based on patch by Geert Jordaens https://bugzilla.gnome.org/show_bug.cgi?id=590641 --- diff --git a/tests/Makefile.am b/tests/Makefile.am index 01ad63a2b..a9f321cc4 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -43,6 +43,7 @@ TESTS = \ basic-types/bug756376.vala \ basic-types/bug761307.vala \ basic-types/bug771626.test \ + pointers/bug590641.vala \ namespaces.vala \ methods/lambda.vala \ methods/closures.vala \ diff --git a/tests/pointers/bug590641.vala b/tests/pointers/bug590641.vala new file mode 100644 index 000000000..c0978e740 --- /dev/null +++ b/tests/pointers/bug590641.vala @@ -0,0 +1,26 @@ +const string[] FOO = { "foo", "bar" }; + +void foo (char** s) { + assert (((string[]) s)[0] == "foo"); +} + +void main () { + uint i = 42; + + int *p0 = (int*) &i; + uint u0 = (uint) *p0; + assert (u0 == i); + + int *p1 = (int*) (&i); + uint u1 = (uint) (*p1); + assert (u1 == i); + + char **p2 = (char**) FOO; + foo ((char**) FOO); + foo (p2); + + string s0 = (string) p2[0]; + assert (s0 == "foo"); + string s1 = (string) *(p2 + 1); + assert (s1 == "bar"); +} diff --git a/vala/valaparser.vala b/vala/valaparser.vala index 3cbc56178..fc0abd142 100644 --- a/vala/valaparser.vala +++ b/vala/valaparser.vala @@ -1103,6 +1103,16 @@ public class Vala.Parser : CodeVisitor { case TokenType.PARAMS: var inner = parse_unary_expression (); return new CastExpression (inner, type, get_src (begin), false); + case TokenType.STAR: + next (); + var op = parse_unary_expression (); + var inner = new PointerIndirection (op, get_src (begin)); + return new CastExpression (inner, type, get_src (begin), false); + case TokenType.BITWISE_AND: + next (); + var op = parse_unary_expression (); + var inner = new AddressofExpression (op, get_src (begin)); + return new CastExpression (inner, type, get_src (begin), false); default: break; }