From 654b24e5146860933f2d5161b988b37331f4ed29 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 23 Sep 2020 17:17:32 +0100 Subject: [PATCH] Add `-disallow-do` --- src/build_settings.cpp | 1 + src/main.cpp | 6 ++++++ src/parser.cpp | 25 +++++++++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 1072141b1..084a7eddd 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -154,6 +154,7 @@ struct BuildContext { bool cross_compiling; bool different_os; bool keep_object_files; + bool disallow_do; bool use_llvm_api; diff --git a/src/main.cpp b/src/main.cpp index 767140007..e53f1b7d9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -579,6 +579,7 @@ enum BuildFlagKind { BuildFlag_UseLLVMApi, BuildFlag_IgnoreUnknownAttributes, BuildFlag_ExtraLinkerFlags, + BuildFlag_DisallowDo, BuildFlag_DefaultToNilAllocator, @@ -677,6 +678,7 @@ bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_UseLLVMApi, str_lit("llvm-api"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_IgnoreUnknownAttributes, str_lit("ignore-unknown-attributes"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_ExtraLinkerFlags, str_lit("extra-linker-flags"), BuildFlagParam_String); + add_flag(&build_flags, BuildFlag_DisallowDo, str_lit("disallow-do"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_DefaultToNilAllocator, str_lit("default-to-nil-allocator"), BuildFlagParam_None); @@ -1103,6 +1105,10 @@ bool parse_build_flags(Array args) { build_context.extra_linker_flags = value.value_string; break; + case BuildFlag_DisallowDo: + build_context.disallow_do = true; + break; + case BuildFlag_DefaultToNilAllocator: build_context.ODIN_DEFAULT_TO_NIL_ALLOCATOR = true; break; diff --git a/src/parser.cpp b/src/parser.cpp index 2ddad3b58..bb819a4ab 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1998,6 +1998,10 @@ Ast *parse_operand(AstFile *f, bool lhs) { body = convert_stmt_to_body(f, parse_stmt(f)); f->curr_proc = curr_proc; + if (build_context.disallow_do) { + syntax_error(body, "'do' has been disallowed"); + } + return ast_proc_lit(f, type, body, tags, where_token, where_clauses); } @@ -3558,6 +3562,9 @@ Ast *parse_if_stmt(AstFile *f) { if (allow_token(f, Token_do)) { body = convert_stmt_to_body(f, parse_stmt(f)); + if (build_context.disallow_do) { + syntax_error(body, "'do' has been disallowed"); + } } else { body = parse_block_stmt(f, false); } @@ -3573,6 +3580,9 @@ Ast *parse_if_stmt(AstFile *f) { case Token_do: { Token arrow = expect_token(f, Token_do); else_stmt = convert_stmt_to_body(f, parse_stmt(f)); + if (build_context.disallow_do) { + syntax_error(else_stmt, "'do' has been disallowed"); + } } break; default: syntax_error(f->curr_token, "Expected if statement block statement"); @@ -3603,6 +3613,9 @@ Ast *parse_when_stmt(AstFile *f) { if (allow_token(f, Token_do)) { body = convert_stmt_to_body(f, parse_stmt(f)); + if (build_context.disallow_do) { + syntax_error(body, "'do' has been disallowed"); + } } else { body = parse_block_stmt(f, true); } @@ -3618,6 +3631,9 @@ Ast *parse_when_stmt(AstFile *f) { case Token_do: { Token arrow = expect_token(f, Token_do); else_stmt = convert_stmt_to_body(f, parse_stmt(f)); + if (build_context.disallow_do) { + syntax_error(else_stmt, "'do' has been disallowed"); + } } break; default: syntax_error(f->curr_token, "Expected when statement block statement"); @@ -3698,6 +3714,9 @@ Ast *parse_for_stmt(AstFile *f) { if (allow_token(f, Token_do)) { body = convert_stmt_to_body(f, parse_stmt(f)); + if (build_context.disallow_do) { + syntax_error(body, "'do' has been disallowed"); + } } else { body = parse_block_stmt(f, false); } @@ -3728,6 +3747,9 @@ Ast *parse_for_stmt(AstFile *f) { if (allow_token(f, Token_do)) { body = convert_stmt_to_body(f, parse_stmt(f)); + if (build_context.disallow_do) { + syntax_error(body, "'do' has been disallowed"); + } } else { body = parse_block_stmt(f, false); } @@ -4072,6 +4094,9 @@ Ast *parse_stmt(AstFile *f) { if (allow_token(f, Token_do)) { body = convert_stmt_to_body(f, parse_stmt(f)); + if (build_context.disallow_do) { + syntax_error(body, "'do' has been disallowed"); + } } else { body = parse_block_stmt(f, false); }