[flang-commits] [clang] [flang] [Flang] [Options] To be compatible with classic flang, add the -Mextend compilation option (PR #173833)
via flang-commits
flang-commits at lists.llvm.org
Tue Jun 23 05:15:31 PDT 2026
https://github.com/TZT123-a11y updated https://github.com/llvm/llvm-project/pull/173833
>From 8c5bd71687a4acc2a9d68db8050751ec71bbbdb8 Mon Sep 17 00:00:00 2001
From: tanzht <tanzht at sugon.com>
Date: Mon, 29 Dec 2025 15:29:06 +0800
Subject: [PATCH 1/6] To be compatible with classic flang, add the -Mextend
compilation option
---
clang/include/clang/Options/Options.td | 3 +++
clang/lib/Driver/ToolChains/Flang.cpp | 1 +
flang/lib/Frontend/CompilerInvocation.cpp | 21 ++++++++++++++++++++-
3 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index 8cd31a3be109a..9b99a1e90ceaa 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -7333,6 +7333,9 @@ def ffixed_line_length_EQ : Joined<["-"], "ffixed-line-length=">, Group<f_Group>
DocBrief<[{Set column after which characters are ignored in typical fixed-form lines in the source
file}]>;
def ffixed_line_length_VALUE : Joined<["-"], "ffixed-line-length-">, Group<f_Group>, Alias<ffixed_line_length_EQ>;
+def Mextend : Flag<["-"], "Mextend">, Group<f_Group>,
+ HelpText<"Classic Flang compat: Allow 132-column lines in fixed form">,
+ Visibility<[FC1Option, FlangOption]>;
def fconvert_EQ : Joined<["-"], "fconvert=">, Group<f_Group>,
HelpText<"Set endian conversion of data for unformatted files">;
def fdefault_double_8 : Flag<["-"],"fdefault-double-8">, Group<f_Group>,
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index 558a27e5adcc5..bc65d392699cf 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -38,6 +38,7 @@ void Flang::addFortranDialectOptions(const ArgList &Args,
ArgStringList &CmdArgs) const {
Args.addAllArgs(CmdArgs, {options::OPT_ffixed_form,
options::OPT_ffree_form,
+ options::OPT_Mextend,
options::OPT_ffixed_line_length_EQ,
options::OPT_fopenacc,
options::OPT_finput_charset_EQ,
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index dd25cdc0e5707..7046e7eb6a690 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1546,10 +1546,29 @@ static bool parseLangOptionsArgs(CompilerInvocation &invoc,
return success;
}
+static llvm::SmallVector<const char *>
+replaceClassicFlangArgs(llvm::ArrayRef<const char *> CommandLineArgs) {
+ llvm::SmallVector<const char *> NewArgs;
+ for (auto Arg : CommandLineArgs) {
+ // Process -mextend -> mapping to -ffixed-line-length=132
+ if (std::strcmp(Arg, "-Mextend") == 0) {
+ NewArgs.push_back("-ffixed-line-length=132");
+ }
+ else {
+ NewArgs.push_back(Arg);
+ }
+ }
+ return NewArgs;
+}
+
bool CompilerInvocation::createFromArgs(
- CompilerInvocation &invoc, llvm::ArrayRef<const char *> commandLineArgs,
+ CompilerInvocation &invoc, llvm::ArrayRef<const char *> commandLineArgs0,
clang::DiagnosticsEngine &diags, const char *argv0) {
+ auto NewCommandLineArgs =
+ replaceClassicFlangArgs(commandLineArgs0);
+ llvm::ArrayRef<const char *> commandLineArgs = NewCommandLineArgs;
+
bool success = true;
// Set the default triple for this CompilerInvocation. This might be
>From a93054280c3a3349a8531b8de38f919a3ddf1d59 Mon Sep 17 00:00:00 2001
From: tanzht <tanzht at sugon.com>
Date: Tue, 6 Jan 2026 11:20:50 +0800
Subject: [PATCH 2/6] Handle the parameter conversion from -Mextend to
-ffixed-line-length=132 in the compiler driver
---
clang/lib/Driver/ToolChains/Flang.cpp | 11 ++++++++++-
flang/lib/Frontend/CompilerInvocation.cpp | 21 +--------------------
2 files changed, 11 insertions(+), 21 deletions(-)
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index bc65d392699cf..deeef49eeb306 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -36,9 +36,18 @@ static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
void Flang::addFortranDialectOptions(const ArgList &Args,
ArgStringList &CmdArgs) const {
+ // Handle the -Mextend parameter
+ if (Arg *A = Args.getLastArg(options::OPT_Mextend)) {
+ // Check if -ffixed-line-length has been specified
+ if (!Args.hasArg(options::OPT_ffixed_line_length_EQ)) {
+ CmdArgs.push_back("-ffixed-line-length=132");
+ }
+ // If the user specifies both -Mextend and -ffixed-line-length=N,
+ // Then -ffixed-line-length=N will override -Mextend
+ }
+
Args.addAllArgs(CmdArgs, {options::OPT_ffixed_form,
options::OPT_ffree_form,
- options::OPT_Mextend,
options::OPT_ffixed_line_length_EQ,
options::OPT_fopenacc,
options::OPT_finput_charset_EQ,
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index a56b6072439ae..4fb1d91306745 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -1546,29 +1546,10 @@ static bool parseLangOptionsArgs(CompilerInvocation &invoc,
return success;
}
-static llvm::SmallVector<const char *>
-replaceClassicFlangArgs(llvm::ArrayRef<const char *> CommandLineArgs) {
- llvm::SmallVector<const char *> NewArgs;
- for (auto Arg : CommandLineArgs) {
- // Process -mextend -> mapping to -ffixed-line-length=132
- if (std::strcmp(Arg, "-Mextend") == 0) {
- NewArgs.push_back("-ffixed-line-length=132");
- }
- else {
- NewArgs.push_back(Arg);
- }
- }
- return NewArgs;
-}
-
bool CompilerInvocation::createFromArgs(
- CompilerInvocation &invoc, llvm::ArrayRef<const char *> commandLineArgs0,
+ CompilerInvocation &invoc, llvm::ArrayRef<const char *> commandLineArgs,
clang::DiagnosticsEngine &diags, const char *argv0) {
- auto NewCommandLineArgs =
- replaceClassicFlangArgs(commandLineArgs0);
- llvm::ArrayRef<const char *> commandLineArgs = NewCommandLineArgs;
-
bool success = true;
// Set the default triple for this CompilerInvocation. This might be
>From e8bb88bda2f64810c2492910a4c316ab5d1bb62c Mon Sep 17 00:00:00 2001
From: tanzht <tanzht at sugon.com>
Date: Tue, 6 Jan 2026 11:33:31 +0800
Subject: [PATCH 3/6] Add the test case mextend.f90 of -Mextend in
flang/test/driver
---
flang/test/Driver/mextend.f90 | 53 +++++++++++++++++++++++++++++++++++
1 file changed, 53 insertions(+)
create mode 100644 flang/test/Driver/mextend.f90
diff --git a/flang/test/Driver/mextend.f90 b/flang/test/Driver/mextend.f90
new file mode 100644
index 0000000000000..cfbb3b13ef6af
--- /dev/null
+++ b/flang/test/Driver/mextend.f90
@@ -0,0 +1,53 @@
+! Test that -Mextend option is properly converted to -ffixed-line-length=132
+! and that explicit -ffixed-line-length overrides -Mextend.
+
+! RUN: %flang -### -Mextend %s 2>&1 | FileCheck %s
+! RUN: %flang -### -Mextend -ffixed-line-length=80 %s 2>&1 | FileCheck %s --check-prefix=OVERRIDE
+! RUN: %flang -### -ffixed-line-length=100 %s 2>&1 | FileCheck %s --check-prefix=EXPLICIT
+! RUN: %flang -### -Mextend -ffixed-form %s 2>&1 | FileCheck %s --check-prefix=FIXEDFORM
+! RUN: %flang -### -Mextend -ffree-form %s 2>&1 | FileCheck %s --check-prefix=FREEFORM
+
+! CHECK: flang{{.*}}-fc1
+! CHECK-SAME: -ffixed-line-length=132
+! CHECK-NOT: -Mextend
+
+! Test that explicit -ffixed-line-length=80 overrides -Mextend
+! OVERRIDE: flang{{.*}}-fc1
+! OVERRIDE-SAME: -ffixed-line-length=80
+! OVERRIDE-NOT: -ffixed-line-length=132
+! OVERRIDE-NOT: -Mextend
+
+! Test that just -ffixed-line-length=100 works
+! EXPLICIT: flang{{.*}}-fc1
+! EXPLICIT-SAME: -ffixed-line-length=100
+! EXPLICIT-NOT: -Mextend
+
+! Test that -Mextend works with -ffixed-form
+! FIXEDFORM: flang{{.*}}-fc1
+! FIXEDFORM-SAME: -ffixed-line-length=132
+! FIXEDFORM-SAME: -ffixed-form
+! FIXEDFORM-NOT: -Mextend
+
+! Test that -Mextend works with -ffree-form
+! FREEFORM: flang{{.*}}-fc1
+! FREEFORM-SAME: -ffixed-line-length=132
+! FREEFORM-SAME: -ffree-form
+! FREEFORM-NOT: -Mextend
+
+! Dummy Fortran code to compile
+program test_mextend
+ implicit none
+ integer :: i, j, k
+ real :: x, y, z
+
+ ! A long line to test extended line length
+ ! 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
+ x = 1.0
+ y = 2.0
+ z = x + y
+
+ print *, "Test -Mextend option"
+ print *, "x = ", x
+ print *, "y = ", y
+ print *, "z = ", z
+end program test_mextend
\ No newline at end of file
>From 12f45a294f05224abdb7557ac7fb77fa7552d560 Mon Sep 17 00:00:00 2001
From: tanzht <tanzht at sugon.com>
Date: Tue, 6 Jan 2026 15:24:41 +0800
Subject: [PATCH 4/6] Fix clang-format issues
---
clang/lib/Driver/ToolChains/Flang.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index deeef49eeb306..17bef6a3382b9 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -45,7 +45,7 @@ void Flang::addFortranDialectOptions(const ArgList &Args,
// If the user specifies both -Mextend and -ffixed-line-length=N,
// Then -ffixed-line-length=N will override -Mextend
}
-
+
Args.addAllArgs(CmdArgs, {options::OPT_ffixed_form,
options::OPT_ffree_form,
options::OPT_ffixed_line_length_EQ,
>From bfc47a4bfdf13c0797243a745f982d9a26c1918f Mon Sep 17 00:00:00 2001
From: tanzht <tanzht at sugon.com>
Date: Tue, 6 Jan 2026 15:44:04 +0800
Subject: [PATCH 5/6] Fix -Wunused-but-set-variable warnings in Flang.cpp
---
clang/lib/Driver/ToolChains/Flang.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index 17bef6a3382b9..5389156316787 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -37,7 +37,7 @@ static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
void Flang::addFortranDialectOptions(const ArgList &Args,
ArgStringList &CmdArgs) const {
// Handle the -Mextend parameter
- if (Arg *A = Args.getLastArg(options::OPT_Mextend)) {
+ if (Args.hasArg(options::OPT_Mextend)) {
// Check if -ffixed-line-length has been specified
if (!Args.hasArg(options::OPT_ffixed_line_length_EQ)) {
CmdArgs.push_back("-ffixed-line-length=132");
>From 8bd60589605a301aadd1dc07da89bf1d50ea59a7 Mon Sep 17 00:00:00 2001
From: tanzht <tanzht at sugon.com>
Date: Tue, 6 Jan 2026 18:35:40 +0800
Subject: [PATCH 6/6] Move classic options to Flang-only section and Improve
option conflict handling
---
clang/include/clang/Options/Options.td | 2 +-
clang/lib/Driver/ToolChains/Flang.cpp | 18 +++++++++++-------
2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/clang/include/clang/Options/Options.td b/clang/include/clang/Options/Options.td
index e1e4098ca83cd..cfc8e87699c0b 100644
--- a/clang/include/clang/Options/Options.td
+++ b/clang/include/clang/Options/Options.td
@@ -7340,7 +7340,7 @@ file}]>;
def ffixed_line_length_VALUE : Joined<["-"], "ffixed-line-length-">, Group<f_Group>, Alias<ffixed_line_length_EQ>;
def Mextend : Flag<["-"], "Mextend">, Group<f_Group>,
HelpText<"Classic Flang compat: Allow 132-column lines in fixed form">,
- Visibility<[FC1Option, FlangOption]>;
+ Visibility<[FlangOption]>;
def fconvert_EQ : Joined<["-"], "fconvert=">, Group<f_Group>,
HelpText<"Set endian conversion of data for unformatted files">;
def fdefault_double_8 : Flag<["-"],"fdefault-double-8">, Group<f_Group>,
diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp
index 5389156316787..23473ac1d73ac 100644
--- a/clang/lib/Driver/ToolChains/Flang.cpp
+++ b/clang/lib/Driver/ToolChains/Flang.cpp
@@ -36,19 +36,23 @@ static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
void Flang::addFortranDialectOptions(const ArgList &Args,
ArgStringList &CmdArgs) const {
- // Handle the -Mextend parameter
- if (Args.hasArg(options::OPT_Mextend)) {
- // Check if -ffixed-line-length has been specified
- if (!Args.hasArg(options::OPT_ffixed_line_length_EQ)) {
+ // Handle -Mextend and -ffixed-line-length conflict
+ // The last specified option takes precedence
+ Arg *LastLineLengthArg = Args.getLastArg(options::OPT_ffixed_line_length_EQ,
+ options::OPT_Mextend);
+
+ if (LastLineLengthArg) {
+ if (LastLineLengthArg->getOption().matches(options::OPT_ffixed_line_length_EQ)) {
+ // User specified -ffixed-line-length=N (either before or after -Mextend)
+ LastLineLengthArg->render(Args, CmdArgs);
+ } else {
+ // -Mextend was the last specified option
CmdArgs.push_back("-ffixed-line-length=132");
}
- // If the user specifies both -Mextend and -ffixed-line-length=N,
- // Then -ffixed-line-length=N will override -Mextend
}
Args.addAllArgs(CmdArgs, {options::OPT_ffixed_form,
options::OPT_ffree_form,
- options::OPT_ffixed_line_length_EQ,
options::OPT_fopenacc,
options::OPT_finput_charset_EQ,
options::OPT_fimplicit_none,
More information about the flang-commits
mailing list