diff options
Diffstat (limited to 'src/parser.cpp')
| -rw-r--r-- | src/parser.cpp | 64 |
1 files changed, 36 insertions, 28 deletions
diff --git a/src/parser.cpp b/src/parser.cpp index fef9a95a0..4595909d9 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -88,28 +88,29 @@ struct Parser { gbMutex file_decl_mutex; }; +enum ProcInlining { + ProcInlining_none = 0, + ProcInlining_inline = 1, + ProcInlining_no_inline = 2, +}; + enum ProcTag { ProcTag_bounds_check = 1<<0, ProcTag_no_bounds_check = 1<<1, - - ProcTag_require_results = 1<<4, - - ProcTag_link_name = 1<<11, - ProcTag_inline = 1<<12, - ProcTag_no_inline = 1<<13, - - // ProcTag_dll_import = 1<<15, - // ProcTag_dll_export = 1<<16, }; enum ProcCallingConvention { - ProcCC_Invalid = 0, - ProcCC_Odin = 1, - ProcCC_Contextless = 2, - ProcCC_C = 3, - ProcCC_Std = 4, - ProcCC_Fast = 5, + ProcCC_Invalid = 0, + ProcCC_Odin, + ProcCC_Contextless, + ProcCC_CDecl, + ProcCC_StdCall, + ProcCC_FastCall, + + // TODO(bill): Add extra calling conventions + // ProcCC_VectorCall, + // ProcCC_ClrCall, ProcCC_ForeignBlockDefault = -1, }; @@ -172,6 +173,7 @@ Array<AstNode *> make_ast_node_array(AstFile *f, isize init_capacity = 8) { AstNode *type; \ AstNode *body; \ u64 tags; \ + ProcInlining inlining; \ }) \ AST_NODE_KIND(CompoundLit, "compound literal", struct { \ AstNode *type; \ @@ -2275,11 +2277,20 @@ AstNode *parse_operand(AstFile *f, bool lhs) { syntax_error(expr, "%.*s must be followed by a procedure literal, got %.*s", LIT(token.string), LIT(ast_node_strings[expr->kind])); return ast_bad_expr(f, token, f->curr_token); } + ProcInlining pi = ProcInlining_none; if (token.kind == Token_inline) { - expr->ProcLit.tags |= ProcTag_inline; + pi = ProcInlining_inline; } else if (token.kind == Token_no_inline) { - expr->ProcLit.tags |= ProcTag_no_inline; + pi = ProcInlining_no_inline; + } + if (pi != ProcInlining_none) { + if (expr->ProcLit.inlining != ProcInlining_none && + expr->ProcLit.inlining != pi) { + syntax_error(expr, "You cannot apply both `inline` and `no_inline` to a procedure literal"); + } + expr->ProcLit.inlining = pi; } + return expr; } break; @@ -3255,17 +3266,14 @@ AstNode *parse_results(AstFile *f) { ProcCallingConvention string_to_calling_convention(String s) { - if (s == "odin") { - return ProcCC_Odin; - } else if (s == "contextless") { - return ProcCC_Contextless; - } else if (s == "cdecl" || s == "c") { - return ProcCC_C; - } else if (s == "stdcall" || s == "std") { - return ProcCC_Std; - } else if (s == "fastcall" || s == "fast") { - return ProcCC_Fast; - } + if (s == "odin") return ProcCC_Odin; + if (s == "contextless") return ProcCC_Contextless; + if (s == "cdecl") return ProcCC_CDecl; + if (s == "c") return ProcCC_CDecl; + if (s == "stdcall") return ProcCC_StdCall; + if (s == "std") return ProcCC_StdCall; + if (s == "fastcall") return ProcCC_FastCall; + if (s == "fast") return ProcCC_FastCall; return ProcCC_Invalid; } |