https://github.com/eugeneepshteyn updated https://github.com/llvm/llvm-project/pull/125248
>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/5] [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 d8123cc39fdc95..c33fdb6a1c163d 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 1ae865f379110b..e4019c43496874 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 9549e8bfbbef0b..23c7afe9eec2bb 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 3565275915a312..678e2274960ac4 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 68b5950d3a51b7..e9ef308e987941 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 a586b8e969ec61..8474e4d6224991 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/5] 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 e9ef308e987941..a2c1d3efef6cf3 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 8474e4d6224991..59adcc8d40d66f 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/5] 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 00000000000000..e11123d621501d --- /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 >From 6862ce37f0f0dac90a75e2c76bbeb4c0c1948dfd Mon Sep 17 00:00:00 2001 From: Eugene Epshteyn <eepsht...@nvidia.com> Date: Fri, 31 Jan 2025 12:03:11 -0500 Subject: [PATCH 4/5] Moved ImplicitNoneExternal per code review feedback --- flang/include/flang/Common/Fortran-features.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flang/include/flang/Common/Fortran-features.h b/flang/include/flang/Common/Fortran-features.h index 23c7afe9eec2bb..5afb9649f4ce65 100644 --- a/flang/include/flang/Common/Fortran-features.h +++ b/flang/include/flang/Common/Fortran-features.h @@ -33,7 +33,7 @@ ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines, EquivalenceNumericWithCharacter, EquivalenceNonDefaultNumeric, EquivalenceSameNonSequence, AdditionalIntrinsics, AnonymousParents, OldLabelDoEndStatements, LogicalIntegerAssignment, EmptySourceFile, - ProgramReturn, ImplicitNoneTypeNever, ImplicitNoneTypeAlways, + ProgramReturn, ImplicitNoneTypeNever, ImplicitNoneTypeAlways, ImplicitNoneExternal, ForwardRefImplicitNone, OpenAccessAppend, BOZAsDefaultInteger, DistinguishableSpecifics, DefaultSave, PointerInSeqType, NonCharacterFormat, SaveMainProgram, SaveBigMainProgramVariables, @@ -54,7 +54,7 @@ ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines, PolymorphicActualAllocatableOrPointerToMonomorphicDummy, RelaxedPureDummy, UndefinableAsynchronousOrVolatileActual, AutomaticInMainProgram, PrintCptr, SavedLocalInSpecExpr, PrintNamelist, AssumedRankPassedToNonAssumedRank, - IgnoreIrrelevantAttributes, Unsigned, ImplicitNoneExternal) + IgnoreIrrelevantAttributes, Unsigned) // Portability and suspicious usage warnings ENUM_CLASS(UsageWarning, Portability, PointerToUndefinable, >From 1ef509d0f514143a364ce1632d1c2feef8ab5f4e Mon Sep 17 00:00:00 2001 From: Eugene Epshteyn <eepsht...@nvidia.com> Date: Fri, 31 Jan 2025 12:04:34 -0500 Subject: [PATCH 5/5] clang-format --- flang/include/flang/Common/Fortran-features.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/flang/include/flang/Common/Fortran-features.h b/flang/include/flang/Common/Fortran-features.h index 5afb9649f4ce65..a40428b79489ae 100644 --- a/flang/include/flang/Common/Fortran-features.h +++ b/flang/include/flang/Common/Fortran-features.h @@ -33,14 +33,14 @@ ENUM_CLASS(LanguageFeature, BackslashEscapes, OldDebugLines, EquivalenceNumericWithCharacter, EquivalenceNonDefaultNumeric, EquivalenceSameNonSequence, AdditionalIntrinsics, AnonymousParents, OldLabelDoEndStatements, LogicalIntegerAssignment, EmptySourceFile, - ProgramReturn, ImplicitNoneTypeNever, ImplicitNoneTypeAlways, ImplicitNoneExternal, - ForwardRefImplicitNone, OpenAccessAppend, BOZAsDefaultInteger, - DistinguishableSpecifics, DefaultSave, PointerInSeqType, NonCharacterFormat, - SaveMainProgram, SaveBigMainProgramVariables, - DistinctArrayConstructorLengths, PPCVector, RelaxedIntentInChecking, - ForwardRefImplicitNoneData, NullActualForAllocatable, - ActualIntegerConvertedToSmallerKind, HollerithOrCharacterAsBOZ, - BindingAsProcedure, StatementFunctionExtensions, + ProgramReturn, ImplicitNoneTypeNever, ImplicitNoneTypeAlways, + ImplicitNoneExternal, ForwardRefImplicitNone, OpenAccessAppend, + BOZAsDefaultInteger, DistinguishableSpecifics, DefaultSave, + PointerInSeqType, NonCharacterFormat, SaveMainProgram, + SaveBigMainProgramVariables, DistinctArrayConstructorLengths, PPCVector, + RelaxedIntentInChecking, ForwardRefImplicitNoneData, + NullActualForAllocatable, ActualIntegerConvertedToSmallerKind, + HollerithOrCharacterAsBOZ, BindingAsProcedure, StatementFunctionExtensions, UseGenericIntrinsicWhenSpecificDoesntMatch, DataStmtExtensions, RedundantContiguous, RedundantAttribute, InitBlankCommon, EmptyBindCDerivedType, MiscSourceExtensions, AllocateToOtherLength, _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits