Skip to content

Commit adacd61

Browse files
committed
Add -disable-experimental-string-processing
Introduce a frontend flag that disables experimental string processing, including `/.../` literals.
1 parent f725a67 commit adacd61

File tree

4 files changed

+41
-4
lines changed

4 files changed

+41
-4
lines changed

include/swift/Option/FrontendOptions.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,9 @@ def disable_deserialization_recovery :
562562
def enable_experimental_string_processing :
563563
Flag<["-"], "enable-experimental-string-processing">,
564564
HelpText<"Enable experimental string processing">;
565+
def disable_experimental_string_processing :
566+
Flag<["-"], "disable-experimental-string-processing">,
567+
HelpText<"Disable experimental string processing">;
565568

566569
def enable_experimental_variadic_generics :
567570
Flag<["-"], "enable-experimental-variadic-generics">,

lib/Frontend/CompilerInvocation.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -500,17 +500,25 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
500500
= A->getOption().matches(OPT_enable_deserialization_recovery);
501501
}
502502

503-
// Experimental string processing
504-
Opts.EnableExperimentalStringProcessing |=
505-
Args.hasArg(OPT_enable_experimental_string_processing);
506-
507503
// Whether '/.../' regex literals are enabled. This implies experimental
508504
// string processing.
509505
if (Args.hasArg(OPT_enable_bare_slash_regex)) {
510506
Opts.EnableBareSlashRegexLiterals = true;
511507
Opts.EnableExperimentalStringProcessing = true;
512508
}
513509

510+
// Experimental string processing.
511+
if (auto A = Args.getLastArg(OPT_enable_experimental_string_processing,
512+
OPT_disable_experimental_string_processing)) {
513+
Opts.EnableExperimentalStringProcessing =
514+
A->getOption().matches(OPT_enable_experimental_string_processing);
515+
516+
// When experimental string processing is explicitly disabled, also disable
517+
// forward slash regex `/.../`.
518+
if (!Opts.EnableExperimentalStringProcessing)
519+
Opts.EnableBareSlashRegexLiterals = false;
520+
}
521+
514522
Opts.EnableExperimentalBoundGenericExtensions |=
515523
Args.hasArg(OPT_enable_experimental_bound_generic_extensions);
516524

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// RUN: %target-typecheck-verify-swift -enable-bare-slash-regex -disable-experimental-string-processing
2+
// RUN: %target-typecheck-verify-swift -disable-experimental-string-processing -enable-bare-slash-regex
3+
// RUN: %target-typecheck-verify-swift -enable-experimental-string-processing -disable-experimental-string-processing -enable-bare-slash-regex
4+
5+
prefix operator /
6+
7+
_ = /x/
8+
// expected-error@-1 {{'/' is not a prefix unary operator}}
9+
// expected-error@-2 {{cannot find 'x' in scope}}
10+
// expected-error@-3 {{'/' is not a postfix unary operator}}
11+
12+
_ = #/x/# // expected-error {{expected expression in assignment}}
13+
14+
func foo(_ x: Regex<Substring>) {} // expected-error {{cannot find type 'Regex' in scope}}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: %target-typecheck-verify-swift -enable-bare-slash-regex -enable-experimental-string-processing
2+
// RUN: %target-typecheck-verify-swift -enable-experimental-string-processing -enable-bare-slash-regex
3+
// RUN: %target-typecheck-verify-swift -disable-experimental-string-processing -enable-experimental-string-processing -enable-bare-slash-regex
4+
5+
// REQUIRES: swift_in_compiler
6+
7+
prefix operator / // expected-error {{prefix operator may not contain '/'}}
8+
9+
_ = /x/
10+
_ = #/x/#
11+
12+
func foo(_ x: Regex<Substring>) {}

0 commit comments

Comments
 (0)