[flang][driver] Add options for -std=f2018
Reviewed By: awarzynski
Differential Revision: https://reviews.llvm.org/D97119
GitOrigin-RevId: 4c7ebf79e923072e8d298134e6ca04618fe4eba9
diff --git a/include/flang/Frontend/CompilerInvocation.h b/include/flang/Frontend/CompilerInvocation.h
index 3be6f3f..99050dc 100644
--- a/include/flang/Frontend/CompilerInvocation.h
+++ b/include/flang/Frontend/CompilerInvocation.h
@@ -74,6 +74,8 @@
// Fortran Dialect options
Fortran::common::IntrinsicTypeDefaultKinds defaultKinds_;
+ bool EnableConformanceChecks_ = false;
+
public:
CompilerInvocation() = default;
@@ -96,6 +98,11 @@
bool &debugModuleDir() { return debugModuleDir_; }
const bool &debugModuleDir() const { return debugModuleDir_; }
+ bool &enableConformanceChecks() { return EnableConformanceChecks_; }
+ const bool &enableConformanceChecks() const {
+ return EnableConformanceChecks_;
+ }
+
Fortran::common::IntrinsicTypeDefaultKinds &defaultKinds() {
return defaultKinds_;
}
@@ -111,6 +118,9 @@
llvm::ArrayRef<const char *> commandLineArgs,
clang::DiagnosticsEngine &diags);
+ // Enables the std=f2018 conformance check
+ void set_EnableConformanceChecks() { EnableConformanceChecks_ = true; }
+
/// Useful setters
void SetModuleDir(std::string &moduleDir) { moduleDir_ = moduleDir; }
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index 69c78bd..6d0003e 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -389,6 +389,26 @@
res.frontendOpts().features_.Enable(
Fortran::common::LanguageFeature::OpenMP);
}
+
+ //-fpedantic
+ if (args.hasArg(clang::driver::options::OPT_pedantic)) {
+ res.set_EnableConformanceChecks();
+ }
+ // -std=f2018. Current behaviour is same as -fpedantic
+ // TODO: Set proper options when more fortran standards
+ // are supported.
+ if (args.hasArg(clang::driver::options::OPT_std_EQ)) {
+ auto standard = args.getLastArgValue(clang::driver::options::OPT_std_EQ);
+ // We only allow f2018 as the given standard
+ if (standard.equals("f2018")) {
+ res.set_EnableConformanceChecks();
+ } else {
+ const unsigned diagID =
+ diags.getCustomDiagID(clang::DiagnosticsEngine::Error,
+ "Only -std=f2018 is allowed currently.");
+ diags.Report(diagID);
+ }
+ }
return;
}
@@ -539,6 +559,11 @@
if (frontendOptions.instrumentedParse_)
fortranOptions.instrumentedParse = true;
+
+ // Set the standard
+ if (enableConformanceChecks()) {
+ fortranOptions.features.WarnOnAllNonstandard();
+ }
}
void CompilerInvocation::setSemanticsOpts(
@@ -549,5 +574,6 @@
defaultKinds(), fortranOptions.features, allCookedSources);
semanticsContext_->set_moduleDirectory(moduleDir())
- .set_searchDirectories(fortranOptions.searchDirectories);
+ .set_searchDirectories(fortranOptions.searchDirectories)
+ .set_warnOnNonstandardUsage(enableConformanceChecks());
}
diff --git a/test/Driver/driver-help-hidden.f90 b/test/Driver/driver-help-hidden.f90
index 8c3c481..e8b1141 100644
--- a/test/Driver/driver-help-hidden.f90
+++ b/test/Driver/driver-help-hidden.f90
@@ -47,6 +47,8 @@
! CHECK-NEXT: -I <dir> Add directory to the end of the list of include search paths
! CHECK-NEXT: -module-dir <dir> Put MODULE files in <dir>
! CHECK-NEXT: -o <file> Write output to <file>
+! CHECK-NEXT: -pedantic Warn on language extensions
+! CHECK-NEXT: -std=<value> Language standard to compile for
! CHECK-NEXT: -U <macro> Undefine macro <macro>
! CHECK-NEXT: --version Print version information
! CHECK-NEXT: -Xflang <arg> Pass <arg> to the flang compiler
diff --git a/test/Driver/driver-help.f90 b/test/Driver/driver-help.f90
index 6bcce89..855d6f2 100644
--- a/test/Driver/driver-help.f90
+++ b/test/Driver/driver-help.f90
@@ -47,6 +47,8 @@
! HELP-NEXT: -I <dir> Add directory to the end of the list of include search paths
! HELP-NEXT: -module-dir <dir> Put MODULE files in <dir>
! HELP-NEXT: -o <file> Write output to <file>
+! HELP-NEXT: -pedantic Warn on language extensions
+! HELP-NEXT: -std=<value> Language standard to compile for
! HELP-NEXT: -U <macro> Undefine macro <macro>
! HELP-NEXT: --version Print version information
! HELP-NEXT: -Xflang <arg> Pass <arg> to the flang compiler
@@ -96,6 +98,8 @@
! HELP-FC1-NEXT: -I <dir> Add directory to the end of the list of include search paths
! HELP-FC1-NEXT: -module-dir <dir> Put MODULE files in <dir>
! HELP-FC1-NEXT: -o <file> Write output to <file>
+! HELP-FC1-NEXT: -pedantic Warn on language extensions
+! HELP-FC1-NEXT: -std=<value> Language standard to compile for
! HELP-FC1-NEXT: -test-io Run the InputOuputTest action. Use for development and testing only.
! HELP-FC1-NEXT: -U <macro> Undefine macro <macro>
! HELP-FC1-NEXT: --version Print version information
diff --git a/test/Driver/std2018.f90 b/test/Driver/std2018.f90
new file mode 100644
index 0000000..acc063e
--- /dev/null
+++ b/test/Driver/std2018.f90
@@ -0,0 +1,28 @@
+! Ensure argument -std=f2018 works as expected.
+
+!-----------------------------------------
+! FRONTEND FLANG DRIVER (flang-new -fc1)
+!-----------------------------------------
+! RUN: %flang_fc1 -fsyntax-only %s 2>&1 | FileCheck %s --allow-empty --check-prefix=WITHOUT
+! RUN: %flang_fc1 -fsyntax-only -std=f2018 %s 2>&1 | FileCheck %s --check-prefix=GIVEN
+! RUN: %flang_fc1 -fsyntax-only -pedantic %s 2>&1 | FileCheck %s --check-prefix=GIVEN
+
+!-----------------------------------------
+! EXPECTED OUTPUT WITHOUT
+!-----------------------------------------
+! WITHOUT-NOT: A DO loop should terminate with an END DO or CONTINUE
+
+!-----------------------------------------
+! EXPECTED OUTPUT WITH
+!-----------------------------------------
+! GIVEN: A DO loop should terminate with an END DO or CONTINUE
+
+subroutine foo2()
+ do 01 m=1,2
+ select case (m)
+ case default
+ print*, "default", m
+ case (1)
+ print*, "start"
+01 end select
+end subroutine
diff --git a/test/Driver/std2018_wrong.f90 b/test/Driver/std2018_wrong.f90
new file mode 100644
index 0000000..867d014
--- /dev/null
+++ b/test/Driver/std2018_wrong.f90
@@ -0,0 +1,12 @@
+! REQUIRES: new-flang-driver
+! Ensure argument -std=f2018 works as expected.
+
+!-----------------------------------------
+! FRONTEND FLANG DRIVER (flang-new -fc1)
+!-----------------------------------------
+! RUN: not %flang_fc1 -std=90 %s 2>&1 | FileCheck %s --check-prefix=WRONG
+
+!-----------------------------------------
+! EXPECTED OUTPUT WITH WRONG
+!-----------------------------------------
+! WRONG: Only -std=f2018 is allowed currently.
diff --git a/tools/f18/f18.cpp b/tools/f18/f18.cpp
index 5bc069c..e22905a 100644
--- a/tools/f18/f18.cpp
+++ b/tools/f18/f18.cpp
@@ -487,7 +487,8 @@
options.features.Enable(
Fortran::common::LanguageFeature::BackslashEscapes, true);
} else if (arg == "-Mstandard" || arg == "-std=f95" ||
- arg == "-std=f2003" || arg == "-std=f2008" || arg == "-std=legacy") {
+ arg == "-std=f2003" || arg == "-std=f2008" || arg == "-std=legacy" ||
+ arg == "-std=f2018" || arg == "-pedantic") {
driver.warnOnNonstandardUsage = true;
} else if (arg == "-fopenacc") {
options.features.Enable(Fortran::common::LanguageFeature::OpenACC);