[flang-commits] [flang] 17f5b8b - [flang][driver] add ability to look up feature flags without setting them (#144559)
via flang-commits
flang-commits at lists.llvm.org
Wed Jun 18 11:21:38 PDT 2025
Author: Andre Kuhlenschmidt
Date: 2025-06-18T11:21:35-07:00
New Revision: 17f5b8b52a3552de1143efb42af6a94d47d8c7fd
URL: https://github.com/llvm/llvm-project/commit/17f5b8b52a3552de1143efb42af6a94d47d8c7fd
DIFF: https://github.com/llvm/llvm-project/commit/17f5b8b52a3552de1143efb42af6a94d47d8c7fd.diff
LOG: [flang][driver] add ability to look up feature flags without setting them (#144559)
This just adds some convenience methods to feature control and rewrites
old code in terms of those methods. Also cleans up some names that I
just realize were overloads of another method.
Added:
Modified:
flang/include/flang/Support/Fortran-features.h
flang/lib/Frontend/CompilerInvocation.cpp
flang/lib/Support/Fortran-features.cpp
Removed:
################################################################################
diff --git a/flang/include/flang/Support/Fortran-features.h b/flang/include/flang/Support/Fortran-features.h
index ea0845b7d605f..39356daa3606a 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 @@ class LanguageFeatureControl {
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 @@ class LanguageFeatureControl {
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 147849b0b7d2a..2603a3f6dc643 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 08ded173de513..17b5f8368916d 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;
}
More information about the flang-commits
mailing list