X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ast.h;h=bc37eea72888fb3800028997f1f9b4559567224c;hb=af5b552a7f08b0115f620d999043e5722d6cdadb;hp=41ef31821b8d81fe3878d342c3b02a9ce323be1b;hpb=1ca3e724176898c5610d943d98915acef43214bb;p=xonotic%2Fgmqcc.git diff --git a/ast.h b/ast.h index 41ef318..bc37eea 100644 --- 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 { @@ -324,6 +326,7 @@ struct ast_member_s }; ast_member* ast_member_new(lex_ctx ctx, ast_expression *owner, unsigned int field, const char *name); void ast_member_delete(ast_member*); +bool ast_member_set_name(ast_member*, const char *name); bool ast_member_codegen(ast_member*, ast_function*, bool lvalue, ir_value**); @@ -447,11 +450,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*); @@ -573,7 +584,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 *