Skip to content

Commit 191d487

Browse files
committed
[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
1 parent 9d87736 commit 191d487

31 files changed

+235
-190
lines changed

flang/include/flang/Common/Fortran-features.h

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
namespace Fortran::common {
1818

19+
// Non-conforming extensions & legacies
1920
ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines,
2021
FixedFormContinuationWithColumn1Ampersand, LogicalAbbreviations,
2122
XOROperator, PunctuationInNames, OptionalFreeFormSpace, BOZExtensions,
@@ -34,9 +35,17 @@ ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines,
3435
ProgramReturn, ImplicitNoneTypeNever, ImplicitNoneTypeAlways,
3536
ForwardRefImplicitNone, OpenAccessAppend, BOZAsDefaultInteger,
3637
DistinguishableSpecifics, DefaultSave, PointerInSeqType, NonCharacterFormat,
37-
SaveMainProgram, SaveBigMainProgramVariables)
38+
SaveMainProgram, SaveBigMainProgramVariables,
39+
DistinctArrayConstructorLengths)
40+
41+
// Portability and suspicious usage warnings for conforming code
42+
ENUM_CLASS(UsageWarning, Portability, PointerToUndefinable,
43+
NonTargetPassedToTarget, PointerToPossibleNoncontiguous,
44+
ShortCharacterActual, ExprPassedToVolatile, ImplicitInterfaceActual,
45+
PolymorphicTransferArg, PointerComponentTransferArg, TransferSizePresence)
3846

3947
using LanguageFeatures = EnumSet<LanguageFeature, LanguageFeature_enumSize>;
48+
using UsageWarnings = EnumSet<UsageWarning, UsageWarning_enumSize>;
4049

4150
class LanguageFeatureControl {
4251
public:
@@ -58,22 +67,33 @@ class LanguageFeatureControl {
5867
}
5968
LanguageFeatureControl(const LanguageFeatureControl &) = default;
6069
void Enable(LanguageFeature f, bool yes = true) { disable_.set(f, !yes); }
61-
void EnableWarning(LanguageFeature f, bool yes = true) { warn_.set(f, yes); }
62-
void WarnOnAllNonstandard(bool yes = true) { warnAll_ = yes; }
70+
void EnableWarning(LanguageFeature f, bool yes = true) {
71+
warnLanguage_.set(f, yes);
72+
}
73+
void EnableWarning(UsageWarning w, bool yes = true) {
74+
warnUsage_.set(w, yes);
75+
}
76+
void WarnOnAllNonstandard(bool yes = true) { warnAllLanguage_ = yes; }
77+
void WarnOnAllUsage(bool yes = true) { warnAllUsage_ = yes; }
6378
bool IsEnabled(LanguageFeature f) const { return !disable_.test(f); }
6479
bool ShouldWarn(LanguageFeature f) const {
65-
return (warnAll_ && f != LanguageFeature::OpenMP &&
80+
return (warnAllLanguage_ && f != LanguageFeature::OpenMP &&
6681
f != LanguageFeature::OpenACC) ||
67-
warn_.test(f);
82+
warnLanguage_.test(f);
83+
}
84+
bool ShouldWarn(UsageWarning w) const {
85+
return warnAllUsage_ || warnUsage_.test(w);
6886
}
6987
// Return all spellings of operators names, depending on features enabled
7088
std::vector<const char *> GetNames(LogicalOperator) const;
7189
std::vector<const char *> GetNames(RelationalOperator) const;
7290

7391
private:
7492
LanguageFeatures disable_;
75-
LanguageFeatures warn_;
76-
bool warnAll_{false};
93+
LanguageFeatures warnLanguage_;
94+
bool warnAllLanguage_{false};
95+
UsageWarnings warnUsage_;
96+
bool warnAllUsage_{false};
7797
};
7898
} // namespace Fortran::common
7999
#endif // FORTRAN_COMMON_FORTRAN_FEATURES_H_

flang/include/flang/Frontend/CompilerInvocation.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ class CompilerInvocation : public CompilerInvocationBase {
106106
Fortran::common::IntrinsicTypeDefaultKinds defaultKinds;
107107

108108
bool enableConformanceChecks = false;
109+
bool enableUsageChecks = false;
109110

110111
/// Used in e.g. unparsing to dump the analyzed rather than the original
111112
/// parse-tree objects.
@@ -184,6 +185,9 @@ class CompilerInvocation : public CompilerInvocationBase {
184185
return enableConformanceChecks;
185186
}
186187

188+
bool &getEnableUsageChecks() { return enableUsageChecks; }
189+
const bool &getEnableUsageChecks() const { return enableUsageChecks; }
190+
187191
Fortran::parser::AnalyzedObjectsAsFortran &getAsFortran() {
188192
return asFortran;
189193
}
@@ -209,6 +213,9 @@ class CompilerInvocation : public CompilerInvocationBase {
209213
// Enables the std=f2018 conformance check
210214
void setEnableConformanceChecks() { enableConformanceChecks = true; }
211215

216+
// Enables the usage checks
217+
void setEnableUsageChecks() { enableUsageChecks = true; }
218+
212219
/// Useful setters
213220
void setModuleDir(std::string &dir) { moduleDir = dir; }
214221

flang/include/flang/Semantics/semantics.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ class SemanticsContext {
8181
bool IsEnabled(common::LanguageFeature feature) const {
8282
return languageFeatures_.IsEnabled(feature);
8383
}
84-
bool ShouldWarn(common::LanguageFeature feature) const {
85-
return languageFeatures_.ShouldWarn(feature);
84+
template <typename A> bool ShouldWarn(A x) const {
85+
return languageFeatures_.ShouldWarn(x);
8686
}
8787
const std::optional<parser::CharBlock> &location() const { return location_; }
8888
const std::vector<std::string> &searchDirectories() const {
@@ -93,7 +93,6 @@ class SemanticsContext {
9393
}
9494
const std::string &moduleDirectory() const { return moduleDirectory_; }
9595
const std::string &moduleFileSuffix() const { return moduleFileSuffix_; }
96-
bool warnOnNonstandardUsage() const { return warnOnNonstandardUsage_; }
9796
bool warningsAreErrors() const { return warningsAreErrors_; }
9897
bool debugModuleWriter() const { return debugModuleWriter_; }
9998
const evaluate::IntrinsicProcTable &intrinsics() const { return intrinsics_; }

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -774,8 +774,9 @@ static bool parseDialectArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
774774
// -pedantic
775775
if (args.hasArg(clang::driver::options::OPT_pedantic)) {
776776
res.setEnableConformanceChecks();
777+
res.setEnableUsageChecks();
777778
}
778-
// -std=f2018 (currently this implies -pedantic)
779+
// -std=f2018
779780
// TODO: Set proper options when more fortran standards
780781
// are supported.
781782
if (args.hasArg(clang::driver::options::OPT_std_EQ)) {
@@ -1045,9 +1046,11 @@ void CompilerInvocation::setFortranOpts() {
10451046
if (frontendOptions.needProvenanceRangeToCharBlockMappings)
10461047
fortranOptions.needProvenanceRangeToCharBlockMappings = true;
10471048

1048-
if (getEnableConformanceChecks()) {
1049+
if (getEnableConformanceChecks())
10491050
fortranOptions.features.WarnOnAllNonstandard();
1050-
}
1051+
1052+
if (getEnableUsageChecks())
1053+
fortranOptions.features.WarnOnAllUsage();
10511054
}
10521055

10531056
void CompilerInvocation::setSemanticsOpts(
@@ -1060,7 +1063,6 @@ void CompilerInvocation::setSemanticsOpts(
10601063
semanticsContext->set_moduleDirectory(getModuleDir())
10611064
.set_searchDirectories(fortranOptions.searchDirectories)
10621065
.set_intrinsicModuleDirectories(fortranOptions.intrinsicModuleDirectories)
1063-
.set_warnOnNonstandardUsage(getEnableConformanceChecks())
10641066
.set_warningsAreErrors(getWarnAsErr())
10651067
.set_moduleFileSuffix(getModuleFileSuffix());
10661068

flang/lib/Semantics/assignment.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,7 @@ void AssignmentContext::Analyze(const parser::PointerAssignmentStmt &stmt) {
9090
if (const evaluate::Assignment * assignment{GetAssignment(stmt)}) {
9191
parser::CharBlock at{context_.location().value()};
9292
auto restorer{foldingContext().messages().SetLocation(at)};
93-
CheckPointerAssignment(
94-
foldingContext(), *assignment, context_.FindScope(at));
93+
CheckPointerAssignment(context_, *assignment, context_.FindScope(at));
9594
}
9695
}
9796

0 commit comments

Comments
 (0)