[vala] valaparser: Allow casts of pointer expressions without enclosing parens



commit f1ddd5a6d201ccb90563e4b46fe500b72841d6f1
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Mon Oct 17 13:59:48 2016 +0200

    valaparser: Allow casts of pointer expressions without enclosing parens
    
    Based on patch by Geert Jordaens <geert jordaens telenet be>
    
    https://bugzilla.gnome.org/show_bug.cgi?id=590641

 tests/Makefile.am             |    1 +
 tests/pointers/bug590641.vala |   26 ++++++++++++++++++++++++++
 vala/valaparser.vala          |   10 ++++++++++
 3 files changed, 37 insertions(+), 0 deletions(-)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 01ad63a..a9f321c 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 0000000..c0978e7
--- /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 3cbc561..fc0abd1 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;
                                                }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]