diff options
author | Peter Klausler <pklausler@nvidia.com> | 2023-05-09 14:01:18 -0700 |
---|---|---|
committer | Peter Klausler <pklausler@nvidia.com> | 2023-05-16 13:56:24 -0700 |
commit | 191d48723f8b853a6ad65532c173c67155cbe606 (patch) | |
tree | 16b7753babd981a86901c5edf7dd1cc4f00c2218 /flang/include | |
parent | 9d877369b7527785f3fea202fea7525e328780f0 (diff) | |
download | llvm-191d48723f8b853a6ad65532c173c67155cbe606.tar.gz |
[flang] Finer control over warnings
Establish a set of optional usage warnings, and enable some
only in "-pedantic" mode that, in our subjective experience
with application codes, seem to issue frequently without
indicating usage that really needs to be corrected. By default,
with this patch the compiler should appear to be somewhat less
persnickety but not less informative.
Differential Revision: https://reviews.llvm.org/D150710
Diffstat (limited to 'flang/include')
-rw-r--r-- | flang/include/flang/Common/Fortran-features.h | 34 | ||||
-rw-r--r-- | flang/include/flang/Frontend/CompilerInvocation.h | 7 | ||||
-rw-r--r-- | flang/include/flang/Semantics/semantics.h | 5 |
3 files changed, 36 insertions, 10 deletions
diff --git a/flang/include/flang/Common/Fortran-features.h b/flang/include/flang/Common/Fortran-features.h index 390a97185923..987e56200ae6 100644 --- a/flang/include/flang/Common/Fortran-features.h +++ b/flang/include/flang/Common/Fortran-features.h @@ -16,6 +16,7 @@ namespace Fortran::common { +// Non-conforming extensions & legacies ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines, FixedFormContinuationWithColumn1Ampersand, LogicalAbbreviations, XOROperator, PunctuationInNames, OptionalFreeFormSpace, BOZExtensions, @@ -34,9 +35,17 @@ ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines, ProgramReturn, ImplicitNoneTypeNever, ImplicitNoneTypeAlways, ForwardRefImplicitNone, OpenAccessAppend, BOZAsDefaultInteger, DistinguishableSpecifics, DefaultSave, PointerInSeqType, NonCharacterFormat, - SaveMainProgram, SaveBigMainProgramVariables) + SaveMainProgram, SaveBigMainProgramVariables, + DistinctArrayConstructorLengths) + +// Portability and suspicious usage warnings for conforming code +ENUM_CLASS(UsageWarning, Portability, PointerToUndefinable, + NonTargetPassedToTarget, PointerToPossibleNoncontiguous, + ShortCharacterActual, ExprPassedToVolatile, ImplicitInterfaceActual, + PolymorphicTransferArg, PointerComponentTransferArg, TransferSizePresence) using LanguageFeatures = EnumSet<LanguageFeature, LanguageFeature_enumSize>; +using UsageWarnings = EnumSet<UsageWarning, UsageWarning_enumSize>; class LanguageFeatureControl { public: @@ -58,13 +67,22 @@ public: } LanguageFeatureControl(const LanguageFeatureControl &) = default; void Enable(LanguageFeature f, bool yes = true) { disable_.set(f, !yes); } - void EnableWarning(LanguageFeature f, bool yes = true) { warn_.set(f, yes); } - void WarnOnAllNonstandard(bool yes = true) { warnAll_ = yes; } + void EnableWarning(LanguageFeature f, bool yes = true) { + warnLanguage_.set(f, yes); + } + void EnableWarning(UsageWarning w, bool yes = true) { + warnUsage_.set(w, yes); + } + void WarnOnAllNonstandard(bool yes = true) { warnAllLanguage_ = yes; } + void WarnOnAllUsage(bool yes = true) { warnAllUsage_ = yes; } bool IsEnabled(LanguageFeature f) const { return !disable_.test(f); } bool ShouldWarn(LanguageFeature f) const { - return (warnAll_ && f != LanguageFeature::OpenMP && + return (warnAllLanguage_ && f != LanguageFeature::OpenMP && f != LanguageFeature::OpenACC) || - warn_.test(f); + warnLanguage_.test(f); + } + bool ShouldWarn(UsageWarning w) const { + return warnAllUsage_ || warnUsage_.test(w); } // Return all spellings of operators names, depending on features enabled std::vector<const char *> GetNames(LogicalOperator) const; @@ -72,8 +90,10 @@ public: private: LanguageFeatures disable_; - LanguageFeatures warn_; - bool warnAll_{false}; + LanguageFeatures warnLanguage_; + bool warnAllLanguage_{false}; + UsageWarnings warnUsage_; + bool warnAllUsage_{false}; }; } // namespace Fortran::common #endif // FORTRAN_COMMON_FORTRAN_FEATURES_H_ diff --git a/flang/include/flang/Frontend/CompilerInvocation.h b/flang/include/flang/Frontend/CompilerInvocation.h index 58479c841851..b3ea098ede57 100644 --- a/flang/include/flang/Frontend/CompilerInvocation.h +++ b/flang/include/flang/Frontend/CompilerInvocation.h @@ -106,6 +106,7 @@ class CompilerInvocation : public CompilerInvocationBase { Fortran::common::IntrinsicTypeDefaultKinds defaultKinds; bool enableConformanceChecks = false; + bool enableUsageChecks = false; /// Used in e.g. unparsing to dump the analyzed rather than the original /// parse-tree objects. @@ -184,6 +185,9 @@ public: return enableConformanceChecks; } + bool &getEnableUsageChecks() { return enableUsageChecks; } + const bool &getEnableUsageChecks() const { return enableUsageChecks; } + Fortran::parser::AnalyzedObjectsAsFortran &getAsFortran() { return asFortran; } @@ -209,6 +213,9 @@ public: // Enables the std=f2018 conformance check void setEnableConformanceChecks() { enableConformanceChecks = true; } + // Enables the usage checks + void setEnableUsageChecks() { enableUsageChecks = true; } + /// Useful setters void setModuleDir(std::string &dir) { moduleDir = dir; } diff --git a/flang/include/flang/Semantics/semantics.h b/flang/include/flang/Semantics/semantics.h index 1c4654f6438b..569147cfa753 100644 --- a/flang/include/flang/Semantics/semantics.h +++ b/flang/include/flang/Semantics/semantics.h @@ -81,8 +81,8 @@ public: bool IsEnabled(common::LanguageFeature feature) const { return languageFeatures_.IsEnabled(feature); } - bool ShouldWarn(common::LanguageFeature feature) const { - return languageFeatures_.ShouldWarn(feature); + template <typename A> bool ShouldWarn(A x) const { + return languageFeatures_.ShouldWarn(x); } const std::optional<parser::CharBlock> &location() const { return location_; } const std::vector<std::string> &searchDirectories() const { @@ -93,7 +93,6 @@ public: } const std::string &moduleDirectory() const { return moduleDirectory_; } const std::string &moduleFileSuffix() const { return moduleFileSuffix_; } - bool warnOnNonstandardUsage() const { return warnOnNonstandardUsage_; } bool warningsAreErrors() const { return warningsAreErrors_; } bool debugModuleWriter() const { return debugModuleWriter_; } const evaluate::IntrinsicProcTable &intrinsics() const { return intrinsics_; } |