-
Notifications
You must be signed in to change notification settings - Fork 15.4k
[flang][driver] add ability to look up feature flags without setting them #144559
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
klausler
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Needs a better name, otherwise fine.
|
@llvm/pr-subscribers-flang-driver Author: Andre Kuhlenschmidt (akuhlens) ChangesThis 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. Full diff: https://github.com/llvm/llvm-project/pull/144559.diff 3 Files Affected:
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;
}
|
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.