diff options
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index 8d7af3188..c22e0e19c 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -65,6 +65,7 @@ enum ProcTag { ProcTag_bounds_check = 1<<0, ProcTag_no_bounds_check = 1<<1, + ProcTag_require_results = 1<<4, ProcTag_foreign = 1<<10, @@ -72,6 +73,7 @@ enum ProcTag { ProcTag_link_name = 1<<12, ProcTag_inline = 1<<13, ProcTag_no_inline = 1<<14, + // ProcTag_dll_import = 1<<15, // ProcTag_dll_export = 1<<16, }; @@ -100,8 +102,9 @@ enum FieldFlag { FieldFlag_ellipsis = 1<<0, FieldFlag_using = 1<<1, FieldFlag_no_alias = 1<<2, + FieldFlag_c_vararg = 1<<3, - FieldFlag_Signature = FieldFlag_ellipsis|FieldFlag_using|FieldFlag_no_alias, + FieldFlag_Signature = FieldFlag_ellipsis|FieldFlag_using|FieldFlag_no_alias|FieldFlag_c_vararg, }; enum StmtAllowFlag { @@ -2999,7 +3002,7 @@ AstNode *parse_proc_type(AstFile *f, Token proc_token, String *link_name_) { parse_proc_tags(f, &tags, &link_name, &cc); - if (link_name_) *link_name_ = link_name; + if (link_name_) *link_name_ = link_name; return ast_proc_type(f, proc_token, params, results, tags, cc); } @@ -3030,6 +3033,7 @@ enum FieldPrefixKind { FieldPrefix_Using, FieldPrefix_NoAlias, + FieldPrefix_CVarArg, }; FieldPrefixKind is_token_field_prefix(AstFile *f) { @@ -3047,6 +3051,9 @@ FieldPrefixKind is_token_field_prefix(AstFile *f) { if (f->curr_token.string == "no_alias") { return FieldPrefix_NoAlias; } + if (f->curr_token.string == "c_vararg") { + return FieldPrefix_CVarArg; + } break; } } break; @@ -3058,6 +3065,7 @@ FieldPrefixKind is_token_field_prefix(AstFile *f) { u32 parse_field_prefixes(AstFile *f) { i32 using_count = 0; i32 no_alias_count = 0; + i32 c_vararg_count = 0; for (;;) { FieldPrefixKind kind = is_token_field_prefix(f); @@ -3067,15 +3075,18 @@ u32 parse_field_prefixes(AstFile *f) { switch (kind) { case FieldPrefix_Using: using_count += 1; next_token(f); break; case FieldPrefix_NoAlias: no_alias_count += 1; next_token(f); break; + case FieldPrefix_CVarArg: c_vararg_count += 1; next_token(f); break; } } if (using_count > 1) syntax_error(f->curr_token, "Multiple `using` in this field list"); if (no_alias_count > 1) syntax_error(f->curr_token, "Multiple `#no_alias` in this field list"); + if (c_vararg_count > 1) syntax_error(f->curr_token, "Multiple `#c_vararg` in this field list"); u32 field_flags = 0; if (using_count > 0) field_flags |= FieldFlag_using; if (no_alias_count > 0) field_flags |= FieldFlag_no_alias; + if (c_vararg_count > 0) field_flags |= FieldFlag_c_vararg; return field_flags; } @@ -3090,9 +3101,13 @@ u32 check_field_prefixes(AstFile *f, isize name_count, u32 allowed_flags, u32 se set_flags &= ~FieldFlag_using; } if ((allowed_flags&FieldFlag_no_alias) == 0 && (set_flags&FieldFlag_no_alias)) { - syntax_error(f->curr_token, "`no_alias` is not allowed within this field list"); + syntax_error(f->curr_token, "`#no_alias` is not allowed within this field list"); set_flags &= ~FieldFlag_no_alias; } + if ((allowed_flags&FieldFlag_c_vararg) == 0 && (set_flags&FieldFlag_c_vararg)) { + syntax_error(f->curr_token, "`#c_vararg` is not allowed within this field list"); + set_flags &= ~FieldFlag_c_vararg; + } return set_flags; } |