summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2021-03-21 10:46:16 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2021-03-21 10:46:16 +0100
commit101ac531c8894ada0be77a039452fdccdaed5d5d (patch)
treee3eabdd2b063dcccdfbd0c9658375ce12764e5a7
parent916cd995b2dbb66fe45c04e830891f2cfb1fd522 (diff)
downloadvala-101ac531c8894ada0be77a039452fdccdaed5d5d.tar.gz
parser: Stricter mode for chained member initializer with --keep-going
Regression of 86bc23f2d7295ae3b2f5f79449d2c5a4a7a93a58 Fixes https://gitlab.gnome.org/GNOME/vala/issues/1158
-rw-r--r--tests/Makefile.am2
-rw-r--r--tests/parser-keep-going/member-initializer.vala22
-rw-r--r--tests/parser-keep-going/tests-extra-environment.sh1
-rw-r--r--vala/valaparser.vala10
4 files changed, 30 insertions, 5 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index c3083a2f3..3454623d2 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -884,6 +884,7 @@ TESTS = \
parser/yield-return.vala \
parser/bug728574.vala \
parser/bug749576.vala \
+ parser-keep-going/member-initializer.vala \
resolver/class-base-cycle.test \
resolver/interface-prerequisite-cycle.test \
resolver/peek-inner-types-ambiguous.test \
@@ -1244,6 +1245,7 @@ endif
EXTRA_DIST = \
glib/tests-extra-environment.sh \
gtktemplate/tests-extra-environment.sh \
+ parser-keep-going/tests-extra-environment.sh \
linux/tests-extra-environment.sh \
nullability/tests-extra-environment.sh \
posix/tests-extra-environment.sh \
diff --git a/tests/parser-keep-going/member-initializer.vala b/tests/parser-keep-going/member-initializer.vala
new file mode 100644
index 000000000..4ab47a26d
--- /dev/null
+++ b/tests/parser-keep-going/member-initializer.vala
@@ -0,0 +1,22 @@
+struct Foo {
+ uint x;
+ int y;
+}
+
+class Bar {
+ public string s;
+}
+
+void main() {
+ var foo = Foo () {
+ x = (uint) 23,
+ y = 42
+ };
+ assert (foo.x == 23U);
+ assert (foo.y == 42);
+
+ var bar = new Bar () {
+ s = "bar"
+ };
+ assert (bar.s == "bar");
+}
diff --git a/tests/parser-keep-going/tests-extra-environment.sh b/tests/parser-keep-going/tests-extra-environment.sh
new file mode 100644
index 000000000..2c64eea67
--- /dev/null
+++ b/tests/parser-keep-going/tests-extra-environment.sh
@@ -0,0 +1 @@
+VALAFLAGS="--keep-going"
diff --git a/vala/valaparser.vala b/vala/valaparser.vala
index 7236d5c7b..4cbe72358 100644
--- a/vala/valaparser.vala
+++ b/vala/valaparser.vala
@@ -302,11 +302,11 @@ public class Vala.Parser : CodeVisitor {
}
}
- string parse_identifier () throws ParseError {
+ string parse_identifier (bool required = false) throws ParseError {
try {
skip_identifier ();
} catch (ParseError e) {
- if (context.keep_going) {
+ if (!required && context.keep_going) {
report_parse_error (e);
prev ();
return get_location_string ();
@@ -1060,16 +1060,16 @@ public class Vala.Parser : CodeVisitor {
return list;
}
- MemberInitializer parse_member_initializer () throws ParseError {
+ MemberInitializer parse_member_initializer (bool chained = false) throws ParseError {
var begin = get_location ();
- string id = parse_identifier ();
+ string id = parse_identifier (chained);
expect (TokenType.ASSIGN);
var inner = get_location ();
Expression expr;
try {
// chained member initializer
- expr = parse_member_initializer ();
+ expr = parse_member_initializer (true);
} catch {
rollback (inner);
expr = parse_expression ();