diff --git a/src/check_asm.cpp b/src/check_asm.cpp index 4bad35ba8..69912c339 100644 --- a/src/check_asm.cpp +++ b/src/check_asm.cpp @@ -1476,6 +1476,13 @@ gb_internal void check_asm_instruction_operand(AsmCtx *asm_ctx, CheckerContext * gb_unused(label_scope); switch (expr->kind) { + case_ast_node(ue, UnaryExpr, expr); + check_expr(ctx, operand, expr); + if (operand->mode != Addressing_Constant) { + error(expr, "Asm operands within unary operands (+ - ~) can only compile time constants"); + } + return; + case_end; case_ast_node(pe, ParenExpr, expr); check_expr(ctx, operand, expr); if (operand->mode != Addressing_Constant) { diff --git a/src/parser.cpp b/src/parser.cpp index 572c638a2..64f73e0ab 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -2484,6 +2484,16 @@ gb_internal Ast *parse_asm_operand(AstFile *f, bool allow_memory_operand) { case Token_Float: case Token_Rune: return ast_basic_lit(f, advance_token(f)); + + case Token_Add: + case Token_Sub: + case Token_Xor: + { + Token token = advance_token(f); + Ast *op = parse_asm_operand(f, false); + return ast_unary_expr(f, token, op); + } + case Token_OpenParen: return parse_expr(f, false); case Token_OpenBracket: