constant globals checking
[ccc.git] / type.c
1 #include "ast.h"
2
3 void type_error(const char *msg, ...)
4 {
5 va_list ap;
6 va_start(ap, msg);
7 fprintf(stderr, "type error: ");
8 vfprintf(stderr, msg, ap);
9 va_end(ap);
10 die("");
11 }
12
13 void check_expr_constant(struct expr *expr)
14 {
15 switch (expr->type) {
16 case ebinop:
17 check_expr_constant(expr->data.ebinop.l);
18 check_expr_constant(expr->data.ebinop.r);
19 break;
20 case eunop:
21 check_expr_constant(expr->data.eunop.l);
22 break;
23 case efuncall:
24 case eident:
25 type_error("Initialiser is not constant\n");
26 break;
27 default:
28 break;
29 }
30 }
31
32 struct vardecl *type_vardecl(struct vardecl *vardecl)
33 {
34 return vardecl;
35 }
36
37 struct decl *type_decl(struct decl *decl)
38 {
39 switch (decl->type) {
40 case dcomponent:
41 fprintf(stderr, "type_decl:component unsupported\n");
42 break;
43 case dfundecl:
44 fprintf(stderr, "type_decl:fundecl unsupported\n");
45 break;
46 case dvardecl:
47 decl->data.dvar = type_vardecl(decl->data.dvar);
48 break;
49 }
50 return decl;
51 }
52
53 struct ast *type(struct ast *ast)
54 {
55 for (int i = 0; i<ast->ndecls; i++) {
56 if (ast->decls[i]->type == dvardecl) {
57 //Check globals
58 check_expr_constant(ast->decls[i]->data.dvar->expr);
59 break;
60 }
61 }
62 return ast;
63 }
64