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



commit ddc69ba4c6741de277e52a4d6d3bb9d356adfda5
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 f97991e90..29e45d862 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -639,6 +639,7 @@ TESTS = \
        parser/function-syntax-error.test \
        parser/inner-array-size.test \
        parser/invalid-brace.test \
+       parser/invalid-statement-delimiter.test \
        parser/lock-statement.vala \
        parser/main-block.vala \
        parser/member-access-pointer.vala \
@@ -774,6 +775,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 43cebbe62..73160b0cc 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;
                }
 
                return !error;
diff --git a/vala/valaparser.vala b/vala/valaparser.vala
index 9a033ab05..c98430df6 100644
--- a/vala/valaparser.vala
+++ b/vala/valaparser.vala
@@ -1651,6 +1651,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]