Allow for @indent for attributes that don't require any parameters; Add -ignore-unknown-attributes

This commit is contained in:
gingerBill
2019-01-30 14:24:14 +00:00
parent 96ef6aa7f3
commit dee28d998f
7 changed files with 103 additions and 78 deletions

View File

@@ -101,6 +101,7 @@ struct BuildContext {
i32 optimization_level;
bool show_timings;
bool keep_temp_files;
bool ignore_unknown_attributes;
bool no_bounds_check;
bool no_output_files;
bool no_crt;

View File

@@ -2150,7 +2150,9 @@ void check_decl_attributes(CheckerContext *c, Array<Ast *> const &attributes, De
}
if (!proc(c, elem, name, value, ac)) {
error(elem, "Unknown attribute element name '%.*s'", LIT(name));
if (!build_context.ignore_unknown_attributes) {
error(elem, "Unknown attribute element name '%.*s'", LIT(name));
}
}
}
}

View File

@@ -215,6 +215,7 @@ enum BuildFlagKind {
BuildFlag_NoCRT,
BuildFlag_UseLLD,
BuildFlag_Vet,
BuildFlag_IgnoreUnknownAttributes,
BuildFlag_COUNT,
};
@@ -258,6 +259,7 @@ bool parse_build_flags(Array<String> args) {
add_flag(&build_flags, BuildFlag_NoCRT, str_lit("no-crt"), BuildFlagParam_None);
add_flag(&build_flags, BuildFlag_UseLLD, str_lit("lld"), BuildFlagParam_None);
add_flag(&build_flags, BuildFlag_Vet, str_lit("vet"), BuildFlagParam_None);
add_flag(&build_flags, BuildFlag_IgnoreUnknownAttributes, str_lit("-ignore-unknown-attributes"), BuildFlagParam_None);
GB_ASSERT(args.count >= 3);
Array<String> flag_args = array_slice(args, 3, args.count);
@@ -569,6 +571,10 @@ bool parse_build_flags(Array<String> args) {
case BuildFlag_Vet:
build_context.vet = true;
break;
case BuildFlag_IgnoreUnknownAttributes:
build_context.ignore_unknown_attributes = true;
break;
}
}

View File

@@ -3650,30 +3650,38 @@ Ast *parse_foreign_decl(AstFile *f) {
Ast *parse_attribute(AstFile *f, Token token, TokenKind open_kind, TokenKind close_kind) {
Array<Ast *> elems = {};
Token open = expect_token(f, open_kind);
f->expr_level++;
if (f->curr_token.kind != close_kind) {
elems = array_make<Ast *>(heap_allocator());
while (f->curr_token.kind != close_kind &&
f->curr_token.kind != Token_EOF) {
Ast *elem = nullptr;
elem = parse_ident(f);
if (f->curr_token.kind == Token_Eq) {
Token eq = expect_token(f, Token_Eq);
Ast *value = parse_value(f);
elem = ast_field_value(f, elem, value, eq);
}
Token open = {};
Token close = {};
array_add(&elems, elem);
if (f->curr_token.kind == Token_Ident) {
elems = array_make<Ast *>(heap_allocator(), 0, 1);
Ast *elem = parse_ident(f);
array_add(&elems, elem);
} else {
open = expect_token(f, open_kind);
f->expr_level++;
if (f->curr_token.kind != close_kind) {
elems = array_make<Ast *>(heap_allocator());
while (f->curr_token.kind != close_kind &&
f->curr_token.kind != Token_EOF) {
Ast *elem = nullptr;
elem = parse_ident(f);
if (f->curr_token.kind == Token_Eq) {
Token eq = expect_token(f, Token_Eq);
Ast *value = parse_value(f);
elem = ast_field_value(f, elem, value, eq);
}
if (!allow_token(f, Token_Comma)) {
break;
array_add(&elems, elem);
if (!allow_token(f, Token_Comma)) {
break;
}
}
}
f->expr_level--;
close = expect_closing(f, close_kind, str_lit("attribute"));
}
f->expr_level--;
Token close = expect_closing(f, close_kind, str_lit("attribute"));
Ast *attribute = ast_attribute(f, token, open, close, elems);
Ast *decl = parse_stmt(f);