]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
valaparser: Allow casts of pointer expressions without enclosing parens f1ddd5a6d201ccb90563e4b46fe500b72841d6f1
authorRico Tzschichholz <ricotz@ubuntu.com>
Mon, 17 Oct 2016 11:59:48 +0000 (13:59 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 17 Oct 2016 11:59:48 +0000 (13:59 +0200)
Based on patch by Geert Jordaens <geert.jordaens@telenet.be>

https://bugzilla.gnome.org/show_bug.cgi?id=590641

tests/Makefile.am
tests/pointers/bug590641.vala [new file with mode: 0644]
vala/valaparser.vala

index 01ad63a2b6e6061c3f644a69b1b251c5864fa45a..a9f321cc4dc65b00455d25814e4284fc262dc6f8 100644 (file)
@@ -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 (file)
index 0000000..c0978e7
--- /dev/null
@@ -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");
+}
index 3cbc56178a1674b360e75ca5f8d9f2815a654eb0..fc0abd142a3364b30a1e35a88545018d2a6d4bc6 100644 (file)
@@ -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;
                                                }