From 1384dd0bac5a93721e1ca11efed51fba4cb050ed Mon Sep 17 00:00:00 2001 From: Jeremy Philippe Date: Sat, 21 Dec 2019 20:55:53 +0100 Subject: [PATCH] genie: Fix parser's inner state when a struct is declared after a class If the struct is declared after a class and has a default creation method, the parser will raise a "missing return type in method ..." error. The cause of the bug is that the global 'class_name' variable is not updated when the parser encounters a struct, so the previous value is used, and if a class has been parsed before, this value will be the name of the class instead of the struct. --- tests/Makefile.am | 1 + tests/genie/struct-after-class.gs | 13 +++++++++++++ vala/valagenieparser.vala | 2 ++ 3 files changed, 16 insertions(+) create mode 100644 tests/genie/struct-after-class.gs diff --git a/tests/Makefile.am b/tests/Makefile.am index 8be08ce07..ebeeed0ef 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -924,6 +924,7 @@ GENIE_TESTS = \ genie/preparser-not.gs \ genie/preparser-or-expression.gs \ genie/struct.gs \ + genie/struct-after-class.gs \ $(NULL) check-TESTS: $(TESTS) $(NON_NULL_TESTS) diff --git a/tests/genie/struct-after-class.gs b/tests/genie/struct-after-class.gs new file mode 100644 index 000000000..353012bc3 --- /dev/null +++ b/tests/genie/struct-after-class.gs @@ -0,0 +1,13 @@ +init + var a = new TestClass() + var b = TestStruct() + assert( a.empty == b.empty ) + +class TestClass + empty:string = "" + +struct TestStruct + empty:string + + construct() + empty = "" diff --git a/vala/valagenieparser.vala b/vala/valagenieparser.vala index 668c40428..6e6e9cd5c 100644 --- a/vala/valagenieparser.vala +++ b/vala/valagenieparser.vala @@ -3290,6 +3290,8 @@ public class Vala.Genie.Parser : CodeVisitor { expect (TokenType.EOL); + class_name = st.name; + parse_declarations (st); Symbol result = st; -- 2.47.2