[flang] Align -x language modes with gfortran (#130268)
This PR addresses some of the issues described in https://github.com/llvm/llvm-project/issues/127617. Key changes: - Stop assuming fixed-form for `-x f95` unless the input is a `.i` file. This change ensures compatibility with `-save-temps` workflows while preventing unintended fixed-form assumptions. - Ensure `-x f95-cpp-input` enables `-cpp` by default, aligning Flang's behavior with `gfortran`.
This commit is contained in:
committed by
GitHub
parent
1db978cd78
commit
bdbe8fa1f3
@@ -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");
|
||||
|
||||
|
||||
@@ -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 =
|
||||
|
||||
35
flang/test/Driver/dash-x-f95-cpp-input.f
Normal file
35
flang/test/Driver/dash-x-f95-cpp-input.f
Normal file
@@ -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: Could not scan
|
||||
|
||||
! 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: Semantic errors
|
||||
|
||||
! 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
|
||||
12
flang/test/Driver/dash-x-f95-do-not-assume-fixed-form.f90
Normal file
12
flang/test/Driver/dash-x-f95-do-not-assume-fixed-form.f90
Normal file
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user