[clang] [flang] [flang] Align `-x` language modes with `gfortran` (PR #130268)
IƱaki Amatria Barral via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 7 05:53:01 PST 2025
https://github.com/inaki-amatria updated https://github.com/llvm/llvm-project/pull/130268
>From 3753b14814c845ab695ffbe985f8b2fd5a478de2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?I=C3=B1aki=20Amatria=20Barral?= <inaki.amatria at appentra.com>
Date: Fri, 7 Mar 2025 08:45:05 +0100
Subject: [PATCH 1/2] [flang] Remove implicit assumption of fixed-form
This change ensures that flang no longer assumes fixed-form when using
`-x f95`. The only case where fixed-form is still assumed is when
`-x f95` is used with `.i` files, unless explicitly overridden by the
user.
---
clang/lib/Driver/ToolChains/Flang.cpp | 9 +++++++--
.../Driver/dash-x-f95-do-not-assume-fixed-form.f90 | 12 ++++++++++++
2 files changed, 19 insertions(+), 2 deletions(-)
create mode 100644 flang/test/Driver/dash-x-f95-do-not-assume-fixed-form.f90
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index d4fea633d0edf..3ee305fc0460d 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -817,8 +817,13 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA,
// 'flang -E' always produces output that is suitable for use as fixed form
// Fortran. However it is only valid free form source if the original is also
- // free form.
- if (InputType == types::TY_PP_Fortran &&
+ // free form. Ensure this logic does not incorrectly assume fixed-form for
+ // cases where it shouldn't, such as `flang -x f95 foo.f90`.
+ bool isAtemporaryPreprocessedFile =
+ Input.isFilename() &&
+ llvm::sys::path::extension(Input.getFilename())
+ .ends_with(types::getTypeTempSuffix(InputType, /*CLStyle=*/false));
+ if (InputType == types::TY_PP_Fortran && isAtemporaryPreprocessedFile &&
!Args.getLastArg(options::OPT_ffixed_form, options::OPT_ffree_form))
CmdArgs.push_back("-ffixed-form");
diff --git a/flang/test/Driver/dash-x-f95-do-not-assume-fixed-form.f90 b/flang/test/Driver/dash-x-f95-do-not-assume-fixed-form.f90
new file mode 100644
index 0000000000000..d6faa4b5c00ae
--- /dev/null
+++ b/flang/test/Driver/dash-x-f95-do-not-assume-fixed-form.f90
@@ -0,0 +1,12 @@
+! This test verifies that using `-x f95` does not cause the driver to assume
+! this file is in fixed-form.
+
+program main
+ print *, "Hello, World!"
+end
+
+! RUN: %flang -### -x f95 %s 2>&1 | FileCheck --check-prefix=PRINT-PHASES %s
+! PRINT-PHASES-NOT: -ffixed-form
+
+! RUN: %flang -Werror -fsyntax-only -x f95 %s 2>&1 | FileCheck --check-prefix=COMPILE --allow-empty %s
+! COMPILE-NOT: error
>From eceaa346f959c8bec1a1ffa7ac5c7738c41c7b71 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?I=C3=B1aki=20Amatria=20Barral?= <inaki.amatria at appentra.com>
Date: Fri, 7 Mar 2025 08:57:30 +0100
Subject: [PATCH 2/2] [flang] Ensure `-x f95-cpp-input` enables `-cpp`
This change ensures that specifying `-x f95-cpp-input` automatically
enables `-cpp`, making `flang`'s behavior consistent with `gfortran`.
`flang/test/Driver/input-from-stdin/input-from-stdin.f90` changes
because the driver assumes `-x f95-cpp-input` for `<stdin>`. Therefore,
after this patch, Fortran source that comes from `<stdin>` will now be
preprocessed.
---
flang/lib/Frontend/CompilerInvocation.cpp | 6 ++++
flang/test/Driver/dash-x-f95-cpp-input.f | 35 +++++++++++++++++++
.../input-from-stdin/input-from-stdin.f90 | 2 +-
3 files changed, 42 insertions(+), 1 deletion(-)
create mode 100644 flang/test/Driver/dash-x-f95-cpp-input.f
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 8b07a50824899..1537122ddced5 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -863,6 +863,12 @@ static void parsePreprocessorArgs(Fortran::frontend::PreprocessorOptions &opts,
(currentArg->getOption().matches(clang::driver::options::OPT_cpp))
? PPMacrosFlag::Include
: PPMacrosFlag::Exclude;
+ // Enable -cpp based on -x unless explicitly disabled with -nocpp
+ if (opts.macrosFlag != PPMacrosFlag::Exclude)
+ if (const auto *dashX = args.getLastArg(clang::driver::options::OPT_x))
+ opts.macrosFlag = llvm::StringSwitch<PPMacrosFlag>(dashX->getValue())
+ .Case("f95-cpp-input", PPMacrosFlag::Include)
+ .Default(opts.macrosFlag);
opts.noReformat = args.hasArg(clang::driver::options::OPT_fno_reformat);
opts.preprocessIncludeLines =
diff --git a/flang/test/Driver/dash-x-f95-cpp-input.f b/flang/test/Driver/dash-x-f95-cpp-input.f
new file mode 100644
index 0000000000000..8406755e0439d
--- /dev/null
+++ b/flang/test/Driver/dash-x-f95-cpp-input.f
@@ -0,0 +1,35 @@
+program main
+ print *, __FILE__, __LINE__
+end
+
+! This test verifies that `flang`'s `-x` options behave like `gfortran`'s.
+! Specifically:
+! - `-x f95` should process the file based on its extension unless overridden.
+! - `-x f95-cpp-input` should behave like `-x f95` but with preprocessing
+! (`-cpp`) enabled unless overridden.
+
+! ---
+! Ensure the file is treated as fixed-form unless explicitly set otherwise
+! ---
+! RUN: not %flang -Werror -fsyntax-only -x f95 -cpp %s 2>&1 | FileCheck --check-prefix=SCAN-ERROR %s
+! RUN: not %flang -Werror -fsyntax-only -x f95-cpp-input %s 2>&1 | FileCheck --check-prefix=SCAN-ERROR %s
+
+! SCAN-ERROR: error
+
+! RUN: %flang -Werror -fsyntax-only -x f95 -cpp -ffree-form %s 2>&1 | FileCheck --check-prefix=NO-SCAN-ERROR --allow-empty %s
+! RUN: %flang -Werror -fsyntax-only -x f95-cpp-input -ffree-form %s 2>&1 | FileCheck --check-prefix=NO-SCAN-ERROR --allow-empty %s
+
+! NO-SCAN-ERROR-NOT: error
+
+! ---
+! Ensure `-cpp` is not enabled by default unless explicitly requested
+! ---
+! RUN: not %flang -Werror -fsyntax-only -x f95 -ffree-form %s 2>&1 | FileCheck --check-prefix=SEMA-ERROR %s
+! RUN: not %flang -Werror -fsyntax-only -x f95-cpp-input -nocpp -ffree-form %s 2>&1 | FileCheck --check-prefix=SEMA-ERROR %s
+
+! SEMA-ERROR: error
+
+! RUN: %flang -Werror -fsyntax-only -x f95 -cpp -ffree-form %s 2>&1 | FileCheck --check-prefix=NO-SEMA-ERROR --allow-empty %s
+! RUN: %flang -Werror -fsyntax-only -x f95-cpp-input -ffree-form %s 2>&1 | FileCheck --check-prefix=NO-SEMA-ERROR --allow-empty %s
+
+! NO-SEMA-ERROR-NOT: error
diff --git a/flang/test/Driver/input-from-stdin/input-from-stdin.f90 b/flang/test/Driver/input-from-stdin/input-from-stdin.f90
index 285f0751b35d8..1fcc0340a64ba 100644
--- a/flang/test/Driver/input-from-stdin/input-from-stdin.f90
+++ b/flang/test/Driver/input-from-stdin/input-from-stdin.f90
@@ -6,7 +6,7 @@
! Input type is implicit
! RUN: cat %s | %flang -E -cpp - | FileCheck %s --check-prefix=PP-NOT-DEFINED
! RUN: cat %s | %flang -DNEW -E -cpp - | FileCheck %s --check-prefix=PP-DEFINED
-! RUN: cat %s | %flang -DNEW -E - | FileCheck %s --check-prefix=PP-NOT-DEFINED
+! RUN: cat %s | %flang -DNEW -E - | FileCheck %s --check-prefix=PP-DEFINED
! RUN: cat %s | %flang -DNEW -E -nocpp - | FileCheck %s --check-prefix=PP-NOT-DEFINED
! Input type is explicit
More information about the cfe-commits
mailing list