add restrict qualifier on pointer arguments
This commit is contained in:
@@ -224,16 +224,18 @@ void ast_print(AstNode *node, int indent) {
|
||||
}
|
||||
case AstNodeTypeTypePointer:
|
||||
{
|
||||
const char *const_or_mut_str = node->data.type.is_const ? "const" : "var";
|
||||
fprintf(stderr, "'%s' PointerType\n", const_or_mut_str);
|
||||
const char *const_or_mut_str = node->data.type.is_const ? "const " : "";
|
||||
const char *restrict_or_not_str = node->data.type.is_restrict ? "restrict " : "";
|
||||
fprintf(stderr, "%s%s PointerType\n", const_or_mut_str, restrict_or_not_str);
|
||||
|
||||
ast_print(node->data.type.child_type, indent + 2);
|
||||
break;
|
||||
}
|
||||
case AstNodeTypeTypeArray:
|
||||
{
|
||||
const char *const_or_mut_str = node->data.type.is_const ? "const" : "var";
|
||||
fprintf(stderr, "'%s' ArrayType\n", const_or_mut_str);
|
||||
const char *const_or_mut_str = node->data.type.is_const ? "const " : "";
|
||||
const char *restrict_or_not_str = node->data.type.is_restrict ? "restrict " : "";
|
||||
fprintf(stderr, "%s%s ArrayType\n", const_or_mut_str, restrict_or_not_str);
|
||||
if (node->data.type.array_size)
|
||||
ast_print(node->data.type.array_size, indent + 2);
|
||||
ast_print(node->data.type.child_type, indent + 2);
|
||||
@@ -1022,6 +1024,13 @@ static void ast_parse_type_assume_amp(ParseContext *pc, int *token_index, AstNod
|
||||
node->data.type.is_const = true;
|
||||
*token_index += 1;
|
||||
first_type_token = &pc->tokens->at(*token_index);
|
||||
if (first_type_token->id == TokenIdKeywordRestrict) {
|
||||
node->data.type.is_restrict = true;
|
||||
*token_index += 1;
|
||||
}
|
||||
} else if (first_type_token->id == TokenIdKeywordRestrict) {
|
||||
node->data.type.is_restrict = true;
|
||||
*token_index += 1;
|
||||
}
|
||||
|
||||
node->data.type.child_type = ast_parse_type(pc, token_index);
|
||||
@@ -1079,8 +1088,8 @@ static AstNode *ast_parse_compiler_fn_call(ParseContext *pc, int *token_index, b
|
||||
|
||||
/*
|
||||
Type : token(Symbol) | token(Unreachable) | token(Void) | PointerType | ArrayType | MaybeType | CompilerFnExpr
|
||||
PointerType : token(Ampersand) option(token(Const)) Type
|
||||
ArrayType : token(LBracket) option(Expression) token(RBracket) Type
|
||||
PointerType : token(Ampersand) option(token(Const)) option(token(Restrict)) Type
|
||||
ArrayType : token(LBracket) option(Expression) token(RBracket) option(token(Const)) option(token(Restrict)) Type
|
||||
*/
|
||||
static AstNode *ast_parse_type(ParseContext *pc, int *token_index) {
|
||||
Token *token = &pc->tokens->at(*token_index);
|
||||
@@ -1129,6 +1138,15 @@ static AstNode *ast_parse_type(ParseContext *pc, int *token_index) {
|
||||
if (const_tok->id == TokenIdKeywordConst) {
|
||||
*token_index += 1;
|
||||
node->data.type.is_const = true;
|
||||
|
||||
Token *next_tok = &pc->tokens->at(*token_index);
|
||||
if (next_tok->id == TokenIdKeywordRestrict) {
|
||||
*token_index += 1;
|
||||
node->data.type.is_restrict = true;
|
||||
}
|
||||
} else if (const_tok->id == TokenIdKeywordRestrict) {
|
||||
*token_index += 1;
|
||||
node->data.type.is_restrict = true;
|
||||
}
|
||||
|
||||
node->data.type.child_type = ast_parse_type(pc, token_index);
|
||||
@@ -1476,7 +1494,7 @@ static PrefixOp tok_to_prefix_op(Token *token) {
|
||||
}
|
||||
|
||||
/*
|
||||
PrefixOp : token(Not) | token(Dash) | token(Tilde) | (token(Ampersand) option(token(Const)))
|
||||
PrefixOp : token(Not) | token(Dash) | token(Tilde) | token(Star) | (token(Ampersand) option(token(Const)))
|
||||
*/
|
||||
static PrefixOp ast_parse_prefix_op(ParseContext *pc, int *token_index, bool mandatory) {
|
||||
Token *token = &pc->tokens->at(*token_index);
|
||||
|
||||
Reference in New Issue
Block a user