diff --git a/flang/lib/Frontend/FrontendAction.cpp b/flang/lib/Frontend/FrontendAction.cpp --- a/flang/lib/Frontend/FrontendAction.cpp +++ b/flang/lib/Frontend/FrontendAction.cpp @@ -51,6 +51,13 @@ Fortran::parser::Options parserOptions = this->instance().invocation().fortranOpts(); + // Set the fixed form flag based on the file extension + auto pathDotIndex{currentInputPath.rfind(".")}; + if (pathDotIndex != std::string::npos) { + std::string pathSuffix{currentInputPath.substr(pathDotIndex + 1)}; + parserOptions.isFixedForm = + pathSuffix == "f" || pathSuffix == "F" || pathSuffix == "ff"; + } // Prescan. In case of failure, report and return. ci.parsing().Prescan(currentInputPath, parserOptions); diff --git a/flang/lib/Frontend/FrontendOptions.cpp b/flang/lib/Frontend/FrontendOptions.cpp --- a/flang/lib/Frontend/FrontendOptions.cpp +++ b/flang/lib/Frontend/FrontendOptions.cpp @@ -13,9 +13,11 @@ InputKind FrontendOptions::GetInputKindForExtension(llvm::StringRef extension) { return llvm::StringSwitch(extension) - // TODO: Should match the list in flang/test/lit.cfg.py + // Note: keep this list in-sync with flang/test/lit.cfg.py + // TODO: Add Cuda Fortan files (i.e. `*.cuf` and `*.CUF`). // FIXME: Currently this API allows at most 9 items per case. .Cases("f", "F", "f77", "f90", "F90", "f95", "F95", "ff95", "f18", "F18", Language::Fortran) + .Cases("ff", "FOR", "for", "f77", "ff90", "fpp", "FPP", Language::Fortran) .Default(Language::Unknown); } diff --git a/flang/test/Flang-Driver/Inputs/fixed-form-test.f b/flang/test/Flang-Driver/Inputs/fixed-form-test.f new file mode 100644 --- /dev/null +++ b/flang/test/Flang-Driver/Inputs/fixed-form-test.f @@ -0,0 +1,2 @@ + program A + end \ No newline at end of file diff --git a/flang/test/Flang-Driver/Inputs/free-form-test.f90 b/flang/test/Flang-Driver/Inputs/free-form-test.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Flang-Driver/Inputs/free-form-test.f90 @@ -0,0 +1,2 @@ +program A +end \ No newline at end of file diff --git a/flang/test/Flang-Driver/fixed-free-detection.f90 b/flang/test/Flang-Driver/fixed-free-detection.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Flang-Driver/fixed-free-detection.f90 @@ -0,0 +1,38 @@ +! Ensure the driver behaves differently on a fixed form file, to a free form file, based on the file extension. + +! REQUIRES: new-flang-driver + +!-------------------------- +! FLANG DRIVER (flang-new) +!-------------------------- +! RUN: %flang-new -E %S/Inputs/free-form-test.f90 2>&1 | FileCheck %s --check-prefix=FREEFORM +! RUN: %flang-new -E %S/Inputs/fixed-form-test.f 2>&1 | FileCheck %s --check-prefix=FIXEDFORM +! RUN: %flang-new -E %S/Inputs/free-form-test.f90 %S/Inputs/fixed-form-test.f 2>&1 | FileCheck %s --check-prefix=MULTIPLEFORMS + +!----------------------------------------- +! FRONTEND FLANG DRIVER (flang-new -fc1) +!----------------------------------------- +! RUN: %flang-new -fc1 -E %S/Inputs/free-form-test.f90 2>&1 | FileCheck %s --check-prefix=FREEFORM +! RUN: %flang-new -fc1 -E %S/Inputs/fixed-form-test.f 2>&1 | FileCheck %s --check-prefix=FIXEDFORM +! RUN: %flang-new -fc1 -E %S/Inputs/free-form-test.f90 %S/Inputs/fixed-form-test.f 2>&1 | FileCheck %s --check-prefix=MULTIPLEFORMS + +!------------------------------------- +! EXPECTED OUTPUT FOR A FREE FORM FILE +!------------------------------------- +! FREEFORM:program a +! FREEFORM-NOT:programa + +!--------------------------------------- +! EXPECTED OUTPUT FOR A FIXED FORM FILE +!--------------------------------------- +! FIXEDFORM:programa +! FIXEDFORM-NOT:program a + +!------------------------------------------------ +! EXPECTED OUTPUT FOR 2 FILES OF DIFFERENT FORMS +!------------------------------------------------ +! MULTIPLEFORMS:program a +! MULTIPLEFORMS-NOT:programa +! MULTIPLEFORMS-NEXT:end +! MULTIPLEFORMS-NEXT:programa +! MULTIPLEFORMS-NOT:program a \ No newline at end of file