[flang-commits] [flang] [Flang] Add 'f2023' and 'f202Y' as valid flags for '-std=' option (PR #182387)

via flang-commits flang-commits at lists.llvm.org
Thu Feb 19 14:15:37 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-driver

Author: None (chris-earl)

<details>
<summary>Changes</summary>

These flags are added to support error checking required by the Fortran 2023 standard that should be disabled by default in flang as well as prepare for future standard requirements.

---
Full diff: https://github.com/llvm/llvm-project/pull/182387.diff


5 Files Affected:

- (modified) flang/include/flang/Support/LangOptions.def (+2) 
- (modified) flang/include/flang/Support/LangOptions.h (+7) 
- (modified) flang/lib/Frontend/CompilerInvocation.cpp (+15-5) 
- (renamed) flang/test/Driver/std20XX-wrong.f90 (+2-2) 
- (renamed) flang/test/Driver/std20XX.f90 (+3-1) 


``````````diff
diff --git a/flang/include/flang/Support/LangOptions.def b/flang/include/flang/Support/LangOptions.def
index e310ecf37a52d..2160610259f1a 100644
--- a/flang/include/flang/Support/LangOptions.def
+++ b/flang/include/flang/Support/LangOptions.def
@@ -22,6 +22,8 @@ LANGOPT(Name, Bits, Default)
 ENUM_LANGOPT(FPContractMode, FPModeKind, 2, FPM_Fast) ///< FP Contract Mode (off/fast)
 /// signed integer overflow handling
 ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 1, SOB_Undefined)
+/// Specify Fortran standard
+ENUM_LANGOPT(FortranStandard, FortranStandardTy, 3, FortranUnspecified)
 
 /// Indicate a build without the standard GPU libraries.
 LANGOPT(NoGPULib  , 1, false)
diff --git a/flang/include/flang/Support/LangOptions.h b/flang/include/flang/Support/LangOptions.h
index 1dd676e62a9e5..c297874b8582c 100644
--- a/flang/include/flang/Support/LangOptions.h
+++ b/flang/include/flang/Support/LangOptions.h
@@ -43,6 +43,13 @@ class LangOptionsBase {
     FPM_Fast,
   };
 
+  enum FortranStandardTy {
+    FortranUnspecified = 0, // default
+    Fortran2018 = 1,
+    Fortran2023 = 2,
+    Fortran202Y = 3,
+  };
+
 #define LANGOPT(Name, Bits, Default) unsigned Name : Bits;
 #define ENUM_LANGOPT(Name, Type, Bits, Default)
 #include "LangOptions.def"
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index fc4975f9592eb..d424933436a55 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1148,19 +1148,29 @@ static bool parseDialectArgs(CompilerInvocation &res, llvm::opt::ArgList &args,
         Fortran::common::LanguageFeature::OpenACC);
   }
 
-  // -std=f2018
-  // TODO: Set proper options when more fortran standards
-  // are supported.
+  // -std=f20**
   if (args.hasArg(clang::options::OPT_std_EQ)) {
     auto standard = args.getLastArgValue(clang::options::OPT_std_EQ);
-    // We only allow f2018 as the given standard
     if (standard == "f2018") {
       res.setEnableConformanceChecks();
       res.getFrontendOpts().features.WarnOnAllNonstandard();
+      res.getLangOpts().setFortranStandard(
+          Fortran::common::LangOptions::Fortran2018);
+    } else if (standard == "f2023") {
+      res.setEnableConformanceChecks();
+      res.getFrontendOpts().features.WarnOnAllNonstandard();
+      res.getLangOpts().setFortranStandard(
+          Fortran::common::LangOptions::Fortran2023);
+    } else if (standard == "f202Y") {
+      res.setEnableConformanceChecks();
+      res.getFrontendOpts().features.WarnOnAllNonstandard();
+      res.getLangOpts().setFortranStandard(
+          Fortran::common::LangOptions::Fortran202Y);
     } else {
       const unsigned diagID =
           diags.getCustomDiagID(clang::DiagnosticsEngine::Error,
-                                "Only -std=f2018 is allowed currently.");
+                                "Only 'f2018', 'f2023', or 'f202Y' are "
+                                "accepted to -std= currently.");
       diags.Report(diagID);
     }
   }
diff --git a/flang/test/Driver/std2018-wrong.f90 b/flang/test/Driver/std20XX-wrong.f90
similarity index 61%
rename from flang/test/Driver/std2018-wrong.f90
rename to flang/test/Driver/std20XX-wrong.f90
index 93ba153d75f7f..227bf59e45acb 100644
--- a/flang/test/Driver/std2018-wrong.f90
+++ b/flang/test/Driver/std20XX-wrong.f90
@@ -1,8 +1,8 @@
-! Ensure argument -std=f2018 works as expected.
+! Ensure argument -std=f20XX works as expected.
 
 !-----------------------------------------
 ! FRONTEND FLANG DRIVER (flang -fc1)
 !-----------------------------------------
 ! RUN: not %flang_fc1 -std=90 %s  2>&1 | FileCheck %s --check-prefix=WRONG
 
-! WRONG: Only -std=f2018 is allowed currently.
+! WRONG: Only 'f2018', 'f2023', or 'f202Y' are accepted to -std= currently.
diff --git a/flang/test/Driver/std2018.f90 b/flang/test/Driver/std20XX.f90
similarity index 75%
rename from flang/test/Driver/std2018.f90
rename to flang/test/Driver/std20XX.f90
index 1727f92127b71..afec991d1e1a6 100644
--- a/flang/test/Driver/std2018.f90
+++ b/flang/test/Driver/std20XX.f90
@@ -1,10 +1,12 @@
-! Ensure argument -std=f2018 works as expected.
+! Ensure argument -std=f20XX works as expected.
 
 !-----------------------------------------
 ! FRONTEND FLANG DRIVER (flang -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 -std=f2023 %s  2>&1 | FileCheck %s --check-prefix=GIVEN
+! RUN: %flang_fc1 -fsyntax-only -std=f202Y %s  2>&1 | FileCheck %s --check-prefix=GIVEN
 ! RUN: %flang_fc1 -fsyntax-only -pedantic %s  2>&1 | FileCheck %s --check-prefix=GIVEN
 
 ! WITHOUT-NOT: A DO loop should terminate with an END DO or CONTINUE

``````````

</details>


https://github.com/llvm/llvm-project/pull/182387


More information about the flang-commits mailing list