aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler/ast-tree.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index fc9217e..d89f816 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -3727,7 +3727,7 @@ bool isConst(AstTree *tree) {
return false;
}
}
- return isConst(metadata->operand);
+ return isConst(metadata->operand) && isConst(metadata->operand);
}
case AST_TREE_TOKEN_NONE:
}
@@ -7296,11 +7296,17 @@ bool setTypesTypeArray(AstTree *tree, AstTreeSetTypesHelper helper) {
AstTree *param = metadata->parameters.data[i];
if (!setAllTypes(param, newHelper, NULL, NULL)) {
return false;
- } else if (!isIntType(param->type)) {
+ } else if (!typeIsEqual(param->type, &AST_TREE_I64_TYPE) &&
+ !typeIsEqual(param->type, &AST_TREE_U64_TYPE)) {
printError(param->str_begin, param->str_end,
"Should only be int (for now)");
return false;
+ } else if (!isConst(param)) {
+ printError(param->str_begin, param->str_end,
+ "Should only be const (for now)");
+ return false;
}
+ metadata->parameters.data[i] = getValue(param, false);
}
} else {
printError(tree->str_begin, tree->str_end,
@@ -7822,8 +7828,11 @@ size_t getSizeOfType(AstTree *type) {
case AST_TREE_TOKEN_TYPE_ARRAY: {
AstTreeBracket *metadata = type->metadata;
if (metadata->parameters.size == 1 &&
- isIntType(metadata->parameters.data[0]->type)) {
- return *(AstTreeInt *)metadata->parameters.data[0]->metadata;
+ (typeIsEqual(metadata->parameters.data[0]->type, &AST_TREE_I64_TYPE) ||
+ typeIsEqual(metadata->parameters.data[0]->type, &AST_TREE_U64_TYPE))) {
+ const size_t itemSize = getSizeOfType(metadata->operand);
+ const size_t size = *(u64 *)metadata->parameters.data[0]->metadata;
+ return size * itemSize;
} else {
UNREACHABLE;
}