@@ -1449,21 +1449,88 @@ static bool ParseSILArgs(SILOptions &Opts, ArgList &Args,
14491449 // -Ounchecked might also set removal of runtime asserts (cond_fail).
14501450 Opts.RemoveRuntimeAsserts |= Args.hasArg (OPT_RemoveRuntimeAsserts);
14511451
1452- // If experimental move only is enabled, always enable lexical lifetime as
1453- // well. Move only depends on lexical lifetimes.
1454- bool enableExperimentalLexicalLifetimes =
1455- Args.hasArg (OPT_enable_lexical_lifetimes) ||
1456- Args.hasArg (OPT_enable_experimental_move_only);
1457- // Error if both experimental lexical lifetimes and disable lexical lifetimes
1458- // are both set.
1459- if (enableExperimentalLexicalLifetimes &&
1460- Args.hasArg (OPT_disable_lexical_lifetimes)) {
1452+ Optional<bool > enableLexicalBorrowScopesFlag;
1453+ if (Arg *A = Args.getLastArg (OPT_enable_lexical_borrow_scopes)) {
1454+ enableLexicalBorrowScopesFlag =
1455+ llvm::StringSwitch<Optional<bool >>(A->getValue ())
1456+ .Case (" true" , true )
1457+ .Case (" false" , false )
1458+ .Default (None);
1459+ }
1460+ Optional<bool > enableLexicalLifetimesFlag;
1461+ if (Arg *A = Args.getLastArg (OPT_enable_lexical_lifetimes)) {
1462+ enableLexicalLifetimesFlag =
1463+ llvm::StringSwitch<Optional<bool >>(A->getValue ())
1464+ .Case (" true" , true )
1465+ .Case (" false" , false )
1466+ .Default (None);
1467+ }
1468+ if (Args.getLastArg (OPT_enable_lexical_lifetimes_noArg)) {
1469+ if (!enableLexicalLifetimesFlag.getValueOr (true )) {
1470+ // Error if lexical lifetimes have been disabled via the meta-var form
1471+ // and enabled via the flag.
1472+ Diags.diagnose (SourceLoc (), diag::error_invalid_arg_combination,
1473+ " enable-lexical-lifetimes" ,
1474+ " enable-lexical-lifetimes=false" );
1475+ return true ;
1476+ } else {
1477+ enableLexicalLifetimesFlag = true ;
1478+ }
1479+ }
1480+
1481+ if (enableLexicalLifetimesFlag.getValueOr (false ) &&
1482+ !enableLexicalBorrowScopesFlag.getValueOr (true )) {
1483+ // Error if lexical lifetimes have been enabled but lexical borrow scopes--
1484+ // on which they are dependent--have been disabled.
1485+ Diags.diagnose (SourceLoc (), diag::error_invalid_arg_combination,
1486+ " enable-lexical-lifetimes=true" ,
1487+ " enable-lexical-borrow-scopes=false" );
14611488 return true ;
1462- } else {
1463- if (enableExperimentalLexicalLifetimes)
1489+ }
1490+
1491+ if (Args.hasArg (OPT_enable_experimental_move_only) &&
1492+ (enableLexicalBorrowScopesFlag.getValueOr (false ))) {
1493+ // Error if move-only is enabled and lexical borrow scopes--on which it
1494+ // depends--has been disabled.
1495+ Diags.diagnose (SourceLoc (), diag::error_invalid_arg_combination,
1496+ " enable-experimental-move-only" ,
1497+ " enable-lexical-borrow-scopes=false" );
1498+ return true ;
1499+ }
1500+
1501+ if (Args.hasArg (OPT_enable_experimental_move_only) &&
1502+ (enableLexicalLifetimesFlag.getValueOr (false ))) {
1503+ // Error if move-only is enabled and lexical lifetimes--on which it
1504+ // depends--has been disabled.
1505+ Diags.diagnose (SourceLoc (), diag::error_invalid_arg_combination,
1506+ " enable-experimental-move-only" ,
1507+ " enable-lexical-lifetimes=false" );
1508+ return true ;
1509+ }
1510+
1511+ // -enable-copy-propagation implies -enable-lexical-lifetimes unless
1512+ // otherwise specified.
1513+ if (Args.hasArg (OPT_enable_copy_propagation))
1514+ Opts.LexicalLifetimes = LexicalLifetimesOption::ExperimentalLate;
1515+
1516+ // If move-only is enabled, always enable lexical lifetime as well. Move-only
1517+ // depends on lexical lifetimes.
1518+ if (Args.hasArg (OPT_enable_experimental_move_only))
1519+ Opts.LexicalLifetimes = LexicalLifetimesOption::ExperimentalLate;
1520+
1521+ if (enableLexicalLifetimesFlag) {
1522+ if (*enableLexicalLifetimesFlag) {
14641523 Opts.LexicalLifetimes = LexicalLifetimesOption::ExperimentalLate;
1465- if (Args.hasArg (OPT_disable_lexical_lifetimes))
1524+ } else {
1525+ Opts.LexicalLifetimes = LexicalLifetimesOption::Early;
1526+ }
1527+ }
1528+ if (enableLexicalBorrowScopesFlag) {
1529+ if (*enableLexicalBorrowScopesFlag) {
1530+ Opts.LexicalLifetimes = LexicalLifetimesOption::Early;
1531+ } else {
14661532 Opts.LexicalLifetimes = LexicalLifetimesOption::Off;
1533+ }
14671534 }
14681535
14691536 Opts.EnableCopyPropagation |= Args.hasArg (OPT_enable_copy_propagation);
0 commit comments