diff options
Diffstat (limited to 'flang')
-rw-r--r-- | flang/include/flang/Support/Fortran-features.h | 14 | ||||
-rw-r--r-- | flang/lib/Frontend/CompilerInvocation.cpp | 2 | ||||
-rw-r--r-- | flang/lib/Support/Fortran-features.cpp | 23 |
3 files changed, 26 insertions, 13 deletions
diff --git a/flang/include/flang/Support/Fortran-features.h b/flang/include/flang/Support/Fortran-features.h index ea0845b..39356da 100644 --- a/flang/include/flang/Support/Fortran-features.h +++ b/flang/include/flang/Support/Fortran-features.h @@ -81,6 +81,9 @@ ENUM_CLASS(UsageWarning, Portability, PointerToUndefinable, using LanguageFeatures = EnumSet<LanguageFeature, LanguageFeature_enumSize>; using UsageWarnings = EnumSet<UsageWarning, UsageWarning_enumSize>; +using LanguageFeatureOrWarning = std::variant<LanguageFeature, UsageWarning>; +using LanguageControlFlag = + std::pair<LanguageFeatureOrWarning, /*shouldEnable=*/bool>; class LanguageFeatureControl { public: @@ -94,6 +97,13 @@ public: void EnableWarning(UsageWarning w, bool yes = true) { warnUsage_.set(w, yes); } + void EnableWarning(LanguageFeatureOrWarning flag, bool yes = true) { + if (std::holds_alternative<LanguageFeature>(flag)) { + EnableWarning(std::get<LanguageFeature>(flag), yes); + } else { + EnableWarning(std::get<UsageWarning>(flag), yes); + } + } void WarnOnAllNonstandard(bool yes = true); bool IsWarnOnAllNonstandard() const { return warnAllLanguage_; } void WarnOnAllUsage(bool yes = true); @@ -116,9 +126,11 @@ public: bool ShouldWarn(LanguageFeature f) const { return warnLanguage_.test(f); } bool ShouldWarn(UsageWarning w) const { return warnUsage_.test(w); } // Cli options + // Find a warning by its Cli spelling, i.e. '[no-]warning-name'. + std::optional<LanguageControlFlag> FindWarning(std::string_view input); // Take a string from the Cli and apply it to the LanguageFeatureControl. // Return true if the option was recognized (and hence applied). - bool ApplyCliOption(std::string input); + bool EnableWarning(std::string_view input); // The add and replace functions are not currently used but are provided // to allow a flexible many-to-one mapping from Cli spellings to enum values. // Taking a string by value because the functions own this string after the diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 147849b..2603a3f 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -1011,7 +1011,7 @@ static bool parseDiagArgs(CompilerInvocation &res, llvm::opt::ArgList &args, if (wArg == "error") { res.setWarnAsErr(true); // -W(no-)<feature> - } else if (!features.ApplyCliOption(wArg)) { + } else if (!features.EnableWarning(wArg)) { const unsigned diagID = diags.getCustomDiagID( clang::DiagnosticsEngine::Error, "Unknown diagnostic option: -W%0"); diags.Report(diagID) << wArg; diff --git a/flang/lib/Support/Fortran-features.cpp b/flang/lib/Support/Fortran-features.cpp index 08ded17..17b5f83 100644 --- a/flang/lib/Support/Fortran-features.cpp +++ b/flang/lib/Support/Fortran-features.cpp @@ -151,22 +151,23 @@ LanguageFeatureControl::LanguageFeatureControl() { warnLanguage_.set(LanguageFeature::NullActualForAllocatable); } -// Take a string from the Cli and apply it to the LanguageFeatureControl. -bool LanguageFeatureControl::ApplyCliOption(std::string input) { +std::optional<LanguageControlFlag> LanguageFeatureControl::FindWarning( + std::string_view input) { bool negated{false}; if (input.size() > 3 && input.substr(0, 3) == "no-") { negated = true; input = input.substr(3); } - if (auto it{cliOptions_.find(input)}; it != cliOptions_.end()) { - if (std::holds_alternative<LanguageFeature>(it->second)) { - EnableWarning(std::get<LanguageFeature>(it->second), !negated); - return true; - } - if (std::holds_alternative<UsageWarning>(it->second)) { - EnableWarning(std::get<UsageWarning>(it->second), !negated); - return true; - } + if (auto it{cliOptions_.find(std::string{input})}; it != cliOptions_.end()) { + return std::make_pair(it->second, !negated); + } + return std::nullopt; +} + +bool LanguageFeatureControl::EnableWarning(std::string_view input) { + if (auto warningAndEnabled{FindWarning(input)}) { + EnableWarning(warningAndEnabled->first, warningAndEnabled->second); + return true; } return false; } |