https://github.com/eugeneepshteyn created https://github.com/llvm/llvm-project/pull/125248
When -fimplicit-none-ext is passed, flang behaves as if "implicit none(external)" was specified for all relevant constructs in Fortran source file. Note: implicit17.f90 was based on implicit07.f90 with `implicit none(external)` removed and `-fimplicit-none-ext` added. >From 11cb96c5dcb911a24596c646fbbc3cc6f3fd10a4 Mon Sep 17 00:00:00 2001 From: Eugene Epshteyn <eepsht...@nvidia.com> Date: Fri, 31 Jan 2025 10:52:00 -0500 Subject: [PATCH 1/3] [flang] Add support for -fimplicit-none-ext option When enabled, flang behaves as if "implicit none(external)" was specified for all relevant constructs in Fortran source file. Signed-off-by: Eugene Epshteyn <eepsht...@nvidia.com> --- clang/include/clang/Driver/Options.td | 1 + clang/lib/Driver/ToolChains/Flang.cpp | 1 + flang/include/flang/Common/Fortran-features.h | 2 +- flang/lib/Common/Fortran-features.cpp | 1 + flang/lib/Frontend/CompilerInvocation.cpp | 7 +++++++ flang/lib/Semantics/resolve-names.cpp | 2 +- 6 files changed, 12 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index d8123cc39fdc951..c33fdb6a1c163d5 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -6876,6 +6876,7 @@ defm backslash : OptInFC1FFlag<"backslash", "Specify that backslash in string in defm xor_operator : OptInFC1FFlag<"xor-operator", "Enable .XOR. as a synonym of .NEQV.">; defm logical_abbreviations : OptInFC1FFlag<"logical-abbreviations", "Enable logical abbreviations">; defm implicit_none : OptInFC1FFlag<"implicit-none", "No implicit typing allowed unless overridden by IMPLICIT statements">; +defm implicit_none_ext : OptInFC1FFlag<"implicit-none-ext", "No implicit externals allowed">; defm underscoring : OptInFC1FFlag<"underscoring", "Appends one trailing underscore to external names">; defm ppc_native_vec_elem_order: BoolOptionWithoutMarshalling<"f", "ppc-native-vector-element-order", PosFlag<SetTrue, [], [ClangOption], "Specifies PowerPC native vector element order (default)">, diff --git a/clang/lib/Driver/ToolChains/Flang.cpp b/clang/lib/Driver/ToolChains/Flang.cpp index 1ae865f379110bc..e4019c434968744 100644 --- a/clang/lib/Driver/ToolChains/Flang.cpp +++ b/clang/lib/Driver/ToolChains/Flang.cpp @@ -42,6 +42,7 @@ void Flang::addFortranDialectOptions(const ArgList &Args, options::OPT_fopenacc, options::OPT_finput_charset_EQ, options::OPT_fimplicit_none, + options::OPT_fimplicit_none_ext, options::OPT_fno_implicit_none, options::OPT_fbackslash, options::OPT_fno_backslash, diff --git a/flang/include/flang/Common/Fortran-features.h b/flang/include/flang/Common/Fortran-features.h index 9549e8bfbbef0bc..23c7afe9eec2bbf 100644 --- a/flang/include/flang/Common/Fortran-features.h +++ b/flang/include/flang/Common/Fortran-features.h @@ -54,7 +54,7 @@ ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines, PolymorphicActualAllocatableOrPointerToMonomorphicDummy, RelaxedPureDummy, UndefinableAsynchronousOrVolatileActual, AutomaticInMainProgram, PrintCptr, SavedLocalInSpecExpr, PrintNamelist, AssumedRankPassedToNonAssumedRank, - IgnoreIrrelevantAttributes, Unsigned) + IgnoreIrrelevantAttributes, Unsigned, ImplicitNoneExternal) // Portability and suspicious usage warnings ENUM_CLASS(UsageWarning, Portability, PointerToUndefinable, diff --git a/flang/lib/Common/Fortran-features.cpp b/flang/lib/Common/Fortran-features.cpp index 3565275915a3120..678e2274960ac4b 100644 --- a/flang/lib/Common/Fortran-features.cpp +++ b/flang/lib/Common/Fortran-features.cpp @@ -22,6 +22,7 @@ LanguageFeatureControl::LanguageFeatureControl() { disable_.set(LanguageFeature::CudaUnified); disable_.set(LanguageFeature::ImplicitNoneTypeNever); disable_.set(LanguageFeature::ImplicitNoneTypeAlways); + disable_.set(LanguageFeature::ImplicitNoneExternal); disable_.set(LanguageFeature::DefaultSave); disable_.set(LanguageFeature::SaveMainProgram); // These features, if enabled, conflict with valid standard usage, diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 68b5950d3a51b7b..e9ef308e987941a 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -740,6 +740,13 @@ static bool parseFrontendArgs(FrontendOptions &opts, llvm::opt::ArgList &args, args.hasFlag(clang::driver::options::OPT_fimplicit_none, clang::driver::options::OPT_fno_implicit_none, false)); + // -f{no-}implicit-none-ext + opts.features.Enable( + Fortran::common::LanguageFeature::ImplicitNoneExternal, + args.hasFlag(clang::driver::options::OPT_fimplicit_none_ext, + clang::driver::options::OPT_fno_implicit_none_ext, false)); + + // -f{no-}backslash opts.features.Enable(Fortran::common::LanguageFeature::BackslashEscapes, args.hasFlag(clang::driver::options::OPT_fbackslash, diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index a586b8e969ec618..8474e4d62249918 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -87,7 +87,7 @@ class ImplicitRules { bool inheritFromParent_{false}; // look in parent if not specified here bool isImplicitNoneType_{ context_.IsEnabled(common::LanguageFeature::ImplicitNoneTypeAlways)}; - bool isImplicitNoneExternal_{false}; + bool isImplicitNoneExternal_{context_.IsEnabled(common::LanguageFeature::ImplicitNoneExternal)}; // map_ contains the mapping between letters and types that were defined // by the IMPLICIT statements of the related scope. It does not contain // the default Fortran mappings nor the mapping defined in parents. >From 734dea98e9e9c790a904c02183397d3e17841245 Mon Sep 17 00:00:00 2001 From: Eugene Epshteyn <eepsht...@nvidia.com> Date: Fri, 31 Jan 2025 11:07:24 -0500 Subject: [PATCH 2/3] clang-format Signed-off-by: Eugene Epshteyn <eepsht...@nvidia.com> --- flang/lib/Frontend/CompilerInvocation.cpp | 1 - flang/lib/Semantics/resolve-names.cpp | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index e9ef308e987941a..a2c1d3efef6cf3c 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -746,7 +746,6 @@ static bool parseFrontendArgs(FrontendOptions &opts, llvm::opt::ArgList &args, args.hasFlag(clang::driver::options::OPT_fimplicit_none_ext, clang::driver::options::OPT_fno_implicit_none_ext, false)); - // -f{no-}backslash opts.features.Enable(Fortran::common::LanguageFeature::BackslashEscapes, args.hasFlag(clang::driver::options::OPT_fbackslash, diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 8474e4d62249918..59adcc8d40d66f7 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -87,7 +87,8 @@ class ImplicitRules { bool inheritFromParent_{false}; // look in parent if not specified here bool isImplicitNoneType_{ context_.IsEnabled(common::LanguageFeature::ImplicitNoneTypeAlways)}; - bool isImplicitNoneExternal_{context_.IsEnabled(common::LanguageFeature::ImplicitNoneExternal)}; + bool isImplicitNoneExternal_{ + context_.IsEnabled(common::LanguageFeature::ImplicitNoneExternal)}; // map_ contains the mapping between letters and types that were defined // by the IMPLICIT statements of the related scope. It does not contain // the default Fortran mappings nor the mapping defined in parents. >From 65fa4164d1e0b9c52813a696e9190d3bc51a4ff5 Mon Sep 17 00:00:00 2001 From: Eugene Epshteyn <eepsht...@nvidia.com> Date: Fri, 31 Jan 2025 11:40:46 -0500 Subject: [PATCH 3/3] Added LIT test Signed-off-by: Eugene Epshteyn <eepsht...@nvidia.com> --- flang/test/Semantics/implicit17.f90 | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 flang/test/Semantics/implicit17.f90 diff --git a/flang/test/Semantics/implicit17.f90 b/flang/test/Semantics/implicit17.f90 new file mode 100644 index 000000000000000..e11123d621501dc --- /dev/null +++ b/flang/test/Semantics/implicit17.f90 @@ -0,0 +1,14 @@ +! RUN: %python %S/test_errors.py %s %flang_fc1 -fimplicit-none-ext +external x +integer :: f, i, arr(1) = [0] +call x +!ERROR: 'y' is an external procedure without the EXTERNAL attribute in a scope with IMPLICIT NONE(EXTERNAL) +call y +!ERROR: 'f' is an external procedure without the EXTERNAL attribute in a scope with IMPLICIT NONE(EXTERNAL) +i = f() +block + !ERROR: 'z' is an external procedure without the EXTERNAL attribute in a scope with IMPLICIT NONE(EXTERNAL) + call z +end block +print *, arr(1) ! no error +end _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits