Warn about unreachable empty compound statements.
[cparser] / lexer.c
diff --git a/lexer.c b/lexer.c
index 16a3798..f1b00e3 100644 (file)
--- a/lexer.c
+++ b/lexer.c
@@ -56,6 +56,7 @@ static char        buf[1024 + MAX_PUTBACK];
 static const char *bufend;
 static const char *bufpos;
 static strset_t    stringset;
+bool               allow_dollar_in_symbol = true;
 
 /**
  * Prints a parse error message at the current token.
@@ -194,6 +195,7 @@ end_of_next_char:;
 }
 
 #define SYMBOL_CHARS  \
+       case '$': if (!allow_dollar_in_symbol) goto dollar_sign; \
        case 'a':         \
        case 'b':         \
        case 'c':         \
@@ -246,8 +248,7 @@ end_of_next_char:;
        case 'X':         \
        case 'Y':         \
        case 'Z':         \
-       case '_':         \
-       case '$': // TODO add option to deactivate $ in identifers
+       case '_':
 
 #define DIGITS        \
        case '0':         \
@@ -282,6 +283,7 @@ static void parse_symbol(void)
                        break;
 
                default:
+dollar_sign:
                        goto end_symbol;
                }
        }
@@ -750,7 +752,7 @@ static int parse_escape_sequence(void)
        int ec = c;
        next_char();
 
-       switch(ec) {
+       switch (ec) {
        case '"':  return '"';
        case '\'': return '\'';
        case '\\': return '\\';
@@ -776,6 +778,10 @@ static int parse_escape_sequence(void)
        case EOF:
                parse_error("reached end of file while parsing escape sequence");
                return EOF;
+       case 'e':
+               if (c_mode & _GNUC)
+                       return 27;   /* hopefully 27 is ALWAYS the code for ESACAPE */
+               /*fallthrough*/
        default:
                parse_error("unknown escape sequence");
                return EOF;
@@ -1565,6 +1571,7 @@ void lexer_next_preprocessing_token(void)
                        return;
 
                default:
+dollar_sign:
                        errorf(&lexer_token.source_position, "unknown character '%c' found", c);
                        next_char();
                        lexer_token.type = T_ERROR;