diff --git a/source/md.c b/source/md.c index dac5c46..78a2d6e 100644 --- a/source/md.c +++ b/source/md.c @@ -3377,11 +3377,18 @@ MD_ExprBakeOperatorTableFromList(MD_Arena *arena, MD_ExprOprList *list) { error_str = MD_S8Fmt(arena, "Invalid operator kind."); } + else if(op_kind != MD_ExprOprKind_Postfix && + (MD_S8Match(op_s, MD_S8Lit("[]"), 0) || MD_S8Match(op_s, MD_S8Lit("()"), 0))){ + error_str = + MD_S8Fmt(arena, "Ignored operator \"%.*s\". \"%.*s\" is only allowed as unary postfix", + MD_S8VArg(op_s), MD_S8VArg(op_s)); + } + else if(MD_S8Match(op_s, MD_S8Lit("[)"), 0) || MD_S8Match(op_s, MD_S8Lit("(]"), 0) || + MD_S8Match(op_s, MD_S8Lit("{}"), 0)){ + error_str = MD_S8Fmt(arena, "Ignored forbidden operator \"%.*s\".", MD_S8VArg(op_s)); + } else { - // TODO(mal): Allow "[]" and "()" only as unary postfix - // TODO(mal): Disallow all other set types ("[)", "(]", "{}") from becoming operators - for(MD_ExprOpr *op2 = list->first; op2 != op; op2 = op2->next) diff --git a/tests/expression_tests.c b/tests/expression_tests.c index e7cdc3b..976942c 100644 --- a/tests/expression_tests.c +++ b/tests/expression_tests.c @@ -239,7 +239,7 @@ operator_array[Op_##name].op = (MD_ExprOpr){ .op_id = Op_##name, .kind = MD_Expr #undef X arena = MD_ArenaAlloc(); - + /* NOTE: Operator table bake errors */ { MD_ExprOprList operator_list = {0}; @@ -247,7 +247,9 @@ operator_array[Op_##name].op = (MD_ExprOpr){ .op_id = Op_##name, .kind = MD_Expr MD_String8 plus = MD_S8Lit("+"); MD_String8 minus = MD_S8Lit("-"); + MD_String8 cast = MD_S8Lit("()"); MD_Node *plus_node = MD_MakeNode(arena, MD_NodeKind_Main, plus, plus, 0); + MD_Node *cast_node = MD_MakeNode(arena, MD_NodeKind_Main, cast, cast, 0); MD_Node *minus_node = MD_MakeNode(arena, MD_NodeKind_Main, minus, minus, 0); MD_Node *plus_node_bis = MD_MakeNode(arena, MD_NodeKind_Main, plus, plus, 0); @@ -259,6 +261,15 @@ operator_array[Op_##name].op = (MD_ExprOpr){ .op_id = Op_##name, .kind = MD_Expr MD_Assert(op_table.errors.max_message_kind == MD_MessageKind_Warning && op_table.errors.node_count == 1 && op_table.errors.first->user_ptr == plus_node); + + // NOTE: () not as unary postfix + operator_list = (MD_ExprOprList){0}; + MD_ExprOprPush(arena, &operator_list, MD_ExprOprKind_Prefix, 1, MD_S8Lit("()"), + 23 /* arbitrary MD_ExprOprKind */, cast_node); + op_table = MD_ExprBakeOperatorTableFromList(arena, &operator_list); + MD_Assert(op_table.errors.max_message_kind == MD_MessageKind_Warning && + op_table.errors.node_count == 1 && + op_table.errors.first->user_ptr == cast_node); // NOTE: Repeat operator operator_list = (MD_ExprOprList){0};