[vala] valaparser: Allow casts of pointer expressions without enclosing parens
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] valaparser: Allow casts of pointer expressions without enclosing parens
- Date: Mon, 17 Oct 2016 20:11:07 +0000 (UTC)
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]