aboutsummaryrefslogtreecommitdiff
path: root/src/parser.cpp
diff options
context:
space:
mode:
authorLemonBoy <thatlemon@gmail.com>2019-09-05 12:22:02 +0200
committerAndrew Kelley <andrew@ziglang.org>2019-09-05 13:04:58 -0400
commitfabf45f5fc0a1827913be5675130db5db514c136 (patch)
treec81705ac2785869cd53a7a2dc758c0b9be38c718 /src/parser.cpp
parenta7fd14096c8dbc9cb5ed9a3731753b24e32d5757 (diff)
downloadzig-fabf45f5fc0a1827913be5675130db5db514c136.tar.gz
zig-fabf45f5fc0a1827913be5675130db5db514c136.zip
Add the noinline keyword for function declarations
Diffstat (limited to 'src/parser.cpp')
-rw-r--r--src/parser.cpp19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/parser.cpp b/src/parser.cpp
index 21bbc4d246..ba8757e4ae 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -578,7 +578,7 @@ static AstNode *ast_parse_top_level_comptime(ParseContext *pc) {
}
// TopLevelDecl
-// <- (KEYWORD_export / KEYWORD_extern STRINGLITERAL? / KEYWORD_inline)? FnProto (SEMICOLON / Block)
+// <- (KEYWORD_export / KEYWORD_extern STRINGLITERAL? / (KEYWORD_inline / KEYWORD_noinline))? FnProto (SEMICOLON / Block)
// / (KEYWORD_export / KEYWORD_extern STRINGLITERAL?)? KEYWORD_threadlocal? VarDecl
// / KEYWORD_use Expr SEMICOLON
static AstNode *ast_parse_top_level_decl(ParseContext *pc, VisibMod visib_mod) {
@@ -587,12 +587,14 @@ static AstNode *ast_parse_top_level_decl(ParseContext *pc, VisibMod visib_mod) {
first = eat_token_if(pc, TokenIdKeywordExtern);
if (first == nullptr)
first = eat_token_if(pc, TokenIdKeywordInline);
+ if (first == nullptr)
+ first = eat_token_if(pc, TokenIdKeywordNoInline);
if (first != nullptr) {
Token *lib_name = nullptr;
if (first->id == TokenIdKeywordExtern)
lib_name = eat_token_if(pc, TokenIdStringLiteral);
- if (first->id != TokenIdKeywordInline) {
+ if (first->id != TokenIdKeywordInline && first->id != TokenIdKeywordNoInline) {
Token *thread_local_kw = eat_token_if(pc, TokenIdKeywordThreadLocal);
AstNode *var_decl = ast_parse_var_decl(pc);
if (var_decl != nullptr) {
@@ -623,8 +625,19 @@ static AstNode *ast_parse_top_level_decl(ParseContext *pc, VisibMod visib_mod) {
fn_proto->data.fn_proto.visib_mod = visib_mod;
fn_proto->data.fn_proto.is_extern = first->id == TokenIdKeywordExtern;
fn_proto->data.fn_proto.is_export = first->id == TokenIdKeywordExport;
- fn_proto->data.fn_proto.is_inline = first->id == TokenIdKeywordInline;
+ switch (first->id) {
+ case TokenIdKeywordInline:
+ fn_proto->data.fn_proto.fn_inline = FnInlineAlways;
+ break;
+ case TokenIdKeywordNoInline:
+ fn_proto->data.fn_proto.fn_inline = FnInlineNever;
+ break;
+ default:
+ fn_proto->data.fn_proto.fn_inline = FnInlineAuto;
+ break;
+ }
fn_proto->data.fn_proto.lib_name = token_buf(lib_name);
+
AstNode *res = fn_proto;
if (body != nullptr) {
res = ast_create_node_copy_line_info(pc, NodeTypeFnDef, fn_proto);