Print this page
new smatch

Split Close
Expand all
Collapse all
          --- old/usr/src/tools/smatch/src/expression.c
          +++ new/usr/src/tools/smatch/src/expression.c
↓ open down ↓ 54 lines elided ↑ open up ↑
  55   55          } while (nextop != 0 && nextop != op);
  56   56          va_end(args);
  57   57  
  58   58          return nextop != 0;
  59   59  }
  60   60  
  61   61  static struct token *comma_expression(struct token *, struct expression **);
  62   62  
  63   63  struct token *parens_expression(struct token *token, struct expression **expr, const char *where)
  64   64  {
       65 +        struct token *p;
       66 +
  65   67          token = expect(token, '(', where);
       68 +        p = token;
  66   69          if (match_op(token, '{')) {
  67   70                  struct expression *e = alloc_expression(token->pos, EXPR_STATEMENT);
  68   71                  struct statement *stmt = alloc_statement(token->pos, STMT_COMPOUND);
  69   72                  *expr = e;
  70   73                  e->statement = stmt;
  71   74                  start_symbol_scope(e->pos);
  72   75                  token = compound_statement(token->next, stmt);
  73   76                  end_symbol_scope();
  74   77                  token = expect(token, '}', "at end of statement expression");
  75   78          } else
  76   79                  token = parse_expression(token, expr);
       80 +
       81 +        if (token == p)
       82 +                sparse_error(token->pos, "an expression is expected before ')'");
  77   83          return expect(token, ')', where);
  78   84  }
  79   85  
  80   86  /*
  81   87   * Handle __func__, __FUNCTION__ and __PRETTY_FUNCTION__ token
  82   88   * conversion
  83   89   */
  84   90  static struct symbol *handle_func(struct token *token)
  85   91  {
  86   92          struct ident *ident = token->ident;
↓ open down ↓ 820 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX