diff options
| author | Jack Palevich <jackpal@google.com> | 2009-07-15 18:23:22 -0700 |
|---|---|---|
| committer | Jack Palevich <jackpal@google.com> | 2009-07-15 18:23:22 -0700 |
| commit | d1f57e689b703faa46d26decb1758a6f0330e9ec (patch) | |
| tree | b0bbb3021a2a77ce7966439b903f9017902069c9 /libacc | |
| parent | 2aaf21f1beefeaa91de8f21a96223c739f48cf88 (diff) | |
| download | system_core-d1f57e689b703faa46d26decb1758a6f0330e9ec.tar.gz system_core-d1f57e689b703faa46d26decb1758a6f0330e9ec.tar.bz2 system_core-d1f57e689b703faa46d26decb1758a6f0330e9ec.zip | |
Improve error handling
Don't segfault if the right-hand operand of a binary operator is missing.
Don't segfault if a semicolon is missing at the end of a forward
declaration.
Diffstat (limited to 'libacc')
| -rw-r--r-- | libacc/acc.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/libacc/acc.cpp b/libacc/acc.cpp index a84bd910..c527a96f 100644 --- a/libacc/acc.cpp +++ b/libacc/acc.cpp @@ -3910,6 +3910,8 @@ class Compiler : public ErrorSink { next(); } else if (t == EOF ) { error("Unexpected EOF."); + } else if (t == ';') { + error("Unexpected ';'"); } else if (!checkSymbol(t)) { // Don't have to do anything special here, the error // message was printed by checkSymbol() above. @@ -4038,7 +4040,12 @@ class Compiler : public ErrorSink { } else { pGen->pushR0(); binaryOp(level); - + // Check for syntax error. + if (pGen->getR0Type() == NULL) { + // We failed to parse a right-hand argument. + // Push a dummy value so we don't fail + pGen->li(0, mkpInt); + } if ((level == 4) | (level == 5)) { pGen->gcmp(t, mkpInt); } else { @@ -4595,6 +4602,8 @@ class Compiler : public ErrorSink { // Function declaration if (accept(';')) { // forward declaration. + } else if (tok != '{') { + error("expected '{'"); } else { if (name) { /* patch forward references (XXX: does not work for function |
