diff --git a/src/parser.cpp b/src/parser.cpp index b24bb8aed..f11735af6 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2754,16 +2754,26 @@ Ast *parse_unary_expr(AstFile *f, bool lhs) { return ast_auto_cast(f, token, expr); } - case Token_Add: - case Token_Sub: - case Token_Not: - case Token_Xor: - case Token_And: { + case Token_And: + case Token_Not: { Token token = advance_token(f); Ast *expr = parse_unary_expr(f, lhs); return ast_unary_expr(f, token, expr); } + case Token_Add: + case Token_Sub: + case Token_Xor: { + Token token = advance_token(f); + Ast *expr = parse_unary_expr(f, lhs); + if (expr != nullptr && expr->kind == Ast_UnaryExpr) { + if (expr->UnaryExpr.op.kind == token.kind) { + syntax_error(expr, "Duplicate unary operator '%.*s' will produce a redundant no-op", LIT(token.string)); + } + } + return ast_unary_expr(f, token, expr); + } + case Token_Period: { Token token = expect_token(f, Token_Period); Ast *ident = parse_ident(f);