]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - ast.h
Fix: ast_value.cvq must be an int, not a bool;
[xonotic/gmqcc.git] / ast.h
diff --git a/ast.h b/ast.h
index a7fd7b8a7f1cf133969de4342de56faf5093c54c..8b8afd10eb04c3bdf8e052dfad82279695827432 100644 (file)
--- a/ast.h
+++ b/ast.h
@@ -131,7 +131,7 @@ typedef struct
     /* arrays get a member-count */
     size_t                  count;
     ast_value*             *params;
-    bool                    variadic;
+    uint32_t                flags;
     /* The codegen functions should store their output values
      * so we can call it multiple times without re-evaluating.
      * Store lvalue and rvalue seperately though. So that
@@ -140,6 +140,8 @@ typedef struct
     ir_value               *outl;
     ir_value               *outr;
 } ast_expression_common;
+#define AST_FLAG_VARIADIC     (1<<0)
+#define AST_FLAG_NORETURN     (1<<1)
 
 /* Value
  *
@@ -159,7 +161,7 @@ struct ast_value_s
     ast_value  *next;
     */
 
-    bool cvq;     /* const/var qualifier */
+    int  cvq;     /* const/var qualifier */
     bool isfield; /* this declares a field */
     bool hasvalue;
     union {
@@ -169,6 +171,7 @@ struct ast_value_s
         const char   *vstring;
         int           ventity;
         ast_function *vfunc;
+        ast_value    *vfield;
     } constval;
 
     /* usecount for the parser */
@@ -446,11 +449,19 @@ struct ast_loop_s
     ast_expression *postcond;
     ast_expression *increment;
     ast_expression *body;
+    /* For now we allow a seperate flag on whether or not the condition
+     * is supposed to be true or false.
+     * That way, the parser can generate a 'while not(!x)' for `while(x)`
+     * if desired, which is useful for the new -f{true,false}-empty-strings
+     * flag.
+     */
+    bool pre_not;
+    bool post_not;
 };
 ast_loop* ast_loop_new(lex_ctx ctx,
                        ast_expression *initexpr,
-                       ast_expression *precond,
-                       ast_expression *postcond,
+                       ast_expression *precond, bool pre_not,
+                       ast_expression *postcond, bool post_not,
                        ast_expression *increment,
                        ast_expression *body);
 void ast_loop_delete(ast_loop*);
@@ -572,7 +583,7 @@ bool ast_block_set_type(ast_block*, ast_expression *from);
 bool ast_block_codegen(ast_block*, ast_function*, bool lvalue, ir_value**);
 void ast_block_collect(ast_block*, ast_expression*);
 
-void ast_block_add_expr(ast_block*, ast_expression*);
+bool GMQCC_WARN ast_block_add_expr(ast_block*, ast_expression*);
 
 /* Function
  *
@@ -625,6 +636,7 @@ void ast_function_delete(ast_function*);
 const char* ast_function_label(ast_function*, const char *prefix);
 
 bool ast_function_codegen(ast_function *self, ir_builder *builder);
+bool ast_generate_accessors(ast_value *asvalue, ir_builder *ir);
 
 /* Expression union
  */