]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - parser.c
Fixing main.c shadows
[xonotic/gmqcc.git] / parser.c
index 5adc09345d73db9967df77994e03ae8fd93f4008..dec6a77a412348b0d84b5a35725ea657ff453987 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -423,13 +423,13 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
         return false;
     }
 
-    if (sy->ops[vec_size(sy->ops)-1].paren) {
+    if (vec_last(sy->ops).paren) {
         parseerror(parser, "unmatched parenthesis");
         return false;
     }
 
-    op = &operators[sy->ops[vec_size(sy->ops)-1].etype - 1];
-    ctx = sy->ops[vec_size(sy->ops)-1].ctx;
+    op = &operators[vec_last(sy->ops).etype - 1];
+    ctx = vec_last(sy->ops).ctx;
 
     DEBUGSHUNTDO(con_out("apply %s\n", op->op));
 
@@ -768,6 +768,12 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
             break;
 
         case opid2('?',':'):
+            if (exprs[1]->expression.vtype != exprs[2]->expression.vtype) {
+                ast_type_to_string(exprs[1], ty1, sizeof(ty1));
+                ast_type_to_string(exprs[2], ty2, sizeof(ty2));
+                parseerror(parser, "iperands of ternary expression must have the same type, got %s and %s", ty1, ty2);
+                return false;
+            }
             if (CanConstFold1(exprs[0]))
                 out = (ConstF(0) ? exprs[1] : exprs[2]);
             else
@@ -1278,7 +1284,7 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma
             }
 
             /* a colon without a pervious question mark cannot be a ternary */
-            if (op->id == opid2(':','?')) {
+            if (!ternaries && op->id == opid2(':','?')) {
                 parser->tok = ':';
                 break;
             }
@@ -3915,6 +3921,10 @@ bool parser_finish(const char *output)
                 ir_builder_delete(ir);
                 return false;
             }
+        }
+        if (opts_dump)
+            ir_builder_dump(ir, con_out);
+        for (i = 0; i < vec_size(parser->functions); ++i) {
             if (!ir_function_finalize(parser->functions[i]->ir_func)) {
                 con_out("failed to finalize function %s\n", parser->functions[i]->name);
                 ir_builder_delete(ir);
@@ -3923,7 +3933,7 @@ bool parser_finish(const char *output)
         }
 
         if (retval) {
-            if (opts_dump)
+            if (opts_dumpfin)
                 ir_builder_dump(ir, con_out);
 
             generate_checksum(parser);