From 5e31c04a01e5fa1d11c5a72b684263005451980a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 15 May 2021 19:13:34 +0100 Subject: [PATCH] Disallow duplicate unary operators for `+`, `-`, and `~` --- src/parser.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) 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);