[vala/0.40] vala: Parse standalone integer/real literals as expression statement



commit b77365e5a5e01b51ce9c5822709571bccdafff7d
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Sat Apr 4 10:25:31 2020 +0200

    vala: Parse standalone integer/real literals as expression statement
    
    Issue an error in the semantic check to forbid such statements.
    
    Parsing such an errornous expression-statement failed since
    5464767cfa5a8dbbc5f46293693ca627b8fcc46d
    
    Fixes https://gitlab.gnome.org/GNOME/vala/issues/961

 tests/Makefile.am                             | 2 ++
 tests/parser/invalid-statement-delimiter.test | 7 +++++++
 tests/semantic/literal-expression.test        | 6 ++++++
 vala/valaexpressionstatement.vala             | 4 ++++
 vala/valaparser.vala                          | 3 +++
 5 files changed, 22 insertions(+)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 30777a735..5f99961d5 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -577,6 +577,7 @@ TESTS = \
        parser/function-syntax-error.test \
        parser/inner-array-size.test \
        parser/invalid-brace.test \
+       parser/invalid-statement-delimiter.test \
        parser/member-access-pointer.vala \
        parser/method-no-abstract-override.test \
        parser/method-no-abstract-virtual-override.test \
@@ -700,6 +701,7 @@ TESTS = \
        semantic/interface-prerequisite-invalid.test \
        semantic/interface-prerequisite-less-accessible.test \
        semantic/interface-prerequisite-multiple.test \
+       semantic/literal-expression.test \
        semantic/localvariable-owned-to-unowned.test \
        semantic/localvariable-var-static-access-instance-field.test \
        semantic/localvariable-var-static-access-instance-method.test \
diff --git a/tests/parser/invalid-statement-delimiter.test b/tests/parser/invalid-statement-delimiter.test
new file mode 100644
index 000000000..7dcde9ee5
--- /dev/null
+++ b/tests/parser/invalid-statement-delimiter.test
@@ -0,0 +1,7 @@
+Invalid Code
+
+void main () {
+       int foo[]23;
+       bar ()23;
+       {}23;
+}
diff --git a/tests/semantic/literal-expression.test b/tests/semantic/literal-expression.test
new file mode 100644
index 000000000..1edc600f1
--- /dev/null
+++ b/tests/semantic/literal-expression.test
@@ -0,0 +1,6 @@
+Invalid Code
+
+void main () {
+       23;
+       3.14;
+}
diff --git a/vala/valaexpressionstatement.vala b/vala/valaexpressionstatement.vala
index 912e5d91a..b776eb8e2 100644
--- a/vala/valaexpressionstatement.vala
+++ b/vala/valaexpressionstatement.vala
@@ -78,6 +78,10 @@ public class Vala.ExpressionStatement : CodeNode, Statement {
                        // ignore inner error
                        error = true;
                        return false;
+               } else if (expression is Literal) {
+                       Report.error (source_reference, "Literal expression not allowed as statement");
+                       error = true;
+                       return false;
                }
 
                add_error_types (expression.get_error_types ());
diff --git a/vala/valaparser.vala b/vala/valaparser.vala
index 34e45db81..74eb2e3fe 100644
--- a/vala/valaparser.vala
+++ b/vala/valaparser.vala
@@ -1664,6 +1664,9 @@ public class Vala.Parser : CodeVisitor {
                case TokenType.DOT:
                // pointer member access
                case TokenType.OP_PTR:
+               // literal expression
+               case TokenType.INTEGER_LITERAL:
+               case TokenType.REAL_LITERAL:
                        rollback (begin);
                        return true;
                default:


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