/* 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
ir_value *outl;
ir_value *outr;
} ast_expression_common;
+#define AST_FLAG_VARIADIC (1<<0)
+#define AST_FLAG_NORETURN (1<<1)
/* Value
*
ast_value *next;
*/
- bool cvq; /* const/var qualifier */
+ int cvq; /* const/var qualifier */
+ bool isfield; /* this declares a field */
bool hasvalue;
union {
double vfloat;
const char *vstring;
int ventity;
ast_function *vfunc;
+ ast_value *vfield;
} constval;
/* usecount for the parser */
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*);
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
*
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
*/