diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/build_settings.cpp | 7 | ||||
| -rw-r--r-- | src/check_stmt.cpp | 8 | ||||
| -rw-r--r-- | src/check_type.cpp | 11 | ||||
| -rw-r--r-- | src/parser.cpp | 2 |
4 files changed, 18 insertions, 10 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp index e66d46713..6b8fefa59 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -366,9 +366,7 @@ enum OptInFeatureFlags : u64 { OptInFeatureFlag_IntegerDivisionByZero_AllBits, OptInFeatureFlag_ForceTypeAssert = 1u<<6, - - - + OptInFeatureFlag_UsingStmt = 1u<<7, }; u64 get_feature_flag_from_name(String const &name) { @@ -387,6 +385,9 @@ u64 get_feature_flag_from_name(String const &name) { if (name == "integer-division-by-zero:all-bits") { return OptInFeatureFlag_IntegerDivisionByZero_AllBits; } + if (name == "using-stmt") { + return OptInFeatureFlag_UsingStmt; + } if (name == "force-type-assert") { return OptInFeatureFlag_ForceTypeAssert; } diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 2dc621a84..1f433df36 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -2945,10 +2945,12 @@ gb_internal void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) error(us->token, "Empty 'using' list"); return; } - if (check_vet_flags(node) & VetFlag_UsingStmt) { + + u64 feature_flags = check_feature_flags(ctx, node); + if ((feature_flags & OptInFeatureFlag_UsingStmt) == 0) { ERROR_BLOCK(); - error(node, "'using' as a statement is not allowed when '-vet' or '-vet-using' is applied"); - error_line("\t'using' is considered bad practice to use as a statement outside of immediate refactoring\n"); + error(node, "'using' has been disallowed as it is considered bad practice to use as a statement outside of immediate refactoring"); + error_line("\tIt you do require it for refactoring purposes or legacy code, it can be enabled on a per-file basis with '#+feature using-stmt'\n"); } for (Ast *expr : us->list) { diff --git a/src/check_type.cpp b/src/check_type.cpp index 41c5f48d1..b1d0045e9 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1845,11 +1845,14 @@ gb_internal Type *check_get_params(CheckerContext *ctx, Scope *scope, Ast *_para Type *specialization = nullptr; bool is_using = (p->flags&FieldFlag_using) != 0; - if ((check_vet_flags(param) & VetFlag_UsingParam) && is_using) { - ERROR_BLOCK(); - error(param, "'using' on a procedure parameter is not allowed when '-vet' or '-vet-using-param' is applied"); - error_line("\t'using' is considered bad practice to use as a statement/procedure parameter outside of immediate refactoring\n"); + + u64 feature_flags = check_feature_flags(ctx, param); + + if (is_using && (feature_flags & OptInFeatureFlag_UsingStmt) == 0) { + ERROR_BLOCK(); + error(param, "'using' has been disallowed as it is considered bad practice to use as a statement/procedure parameter outside of immediate refactoring"); + error_line("\tIt you do require it for refactoring purposes or legacy code, it can be enabled on a per-file basis with '#+feature using-stmt'\n"); } if (type_expr == nullptr) { diff --git a/src/parser.cpp b/src/parser.cpp index c14055275..360537ab7 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -6504,6 +6504,8 @@ gb_internal u64 parse_feature_tag(Token token_for_pos, String s) { syntax_error(token_for_pos, "Invalid feature flag name: %.*s", LIT(p)); error_line("\tExpected one of the following\n"); error_line("\tdynamic-literals\n"); + error_line("\tglobal-context\n"); + error_line("\tusing-stmt\n"); error_line("\tinteger-division-by-zero:trap\n"); error_line("\tinteger-division-by-zero:zero\n"); error_line("\tinteger-division-by-zero:self\n"); |