-
Notifications
You must be signed in to change notification settings - Fork 10.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[flang] Downgrade a too-strong error message to a warning #80095
Conversation
When a compilation unit has an interface to an external subroutine or function, and there is a global object (like a module) with the same name, we're emitting an error. This is too strong, the program will still build. This comes up in real applications, too. Downgrade the error to a warning.
@llvm/pr-subscribers-flang-semantics Author: Peter Klausler (klausler) ChangesWhen a compilation unit has an interface to an external subroutine or function, and there is a global object (like a module) with the same name, we're emitting an error. This is too strong, the program will still build. This comes up in real applications, too. Downgrade the error to a warning. Full diff: https://github.com/llvm/llvm-project/pull/80095.diff 3 Files Affected:
diff --git a/flang/include/flang/Common/Fortran-features.h b/flang/include/flang/Common/Fortran-features.h
index e5757468c0d84..1e678c341d813 100644
--- a/flang/include/flang/Common/Fortran-features.h
+++ b/flang/include/flang/Common/Fortran-features.h
@@ -54,7 +54,7 @@ ENUM_CLASS(UsageWarning, Portability, PointerToUndefinable,
ShortCharacterActual, ExprPassedToVolatile, ImplicitInterfaceActual,
PolymorphicTransferArg, PointerComponentTransferArg, TransferSizePresence,
F202XAllocatableBreakingChange, DimMustBePresent, CommonBlockPadding,
- LogicalVsCBool, BindCCharLength, ProcDummyArgShapes)
+ LogicalVsCBool, BindCCharLength, ProcDummyArgShapes, ExternalNameConflict)
using LanguageFeatures = EnumSet<LanguageFeature, LanguageFeature_enumSize>;
using UsageWarnings = EnumSet<UsageWarning, UsageWarning_enumSize>;
diff --git a/flang/lib/Semantics/check-declarations.cpp b/flang/lib/Semantics/check-declarations.cpp
index 8af9dc11f822e..816227fb3354f 100644
--- a/flang/lib/Semantics/check-declarations.cpp
+++ b/flang/lib/Semantics/check-declarations.cpp
@@ -1465,10 +1465,11 @@ void CheckHelper::CheckExternal(const Symbol &symbol) {
if (interfaceName == definitionName) {
parser::Message *msg{nullptr};
if (!IsProcedure(*global)) {
- if (symbol.flags().test(Symbol::Flag::Function) ||
- symbol.flags().test(Symbol::Flag::Subroutine)) {
- msg = messages_.Say(
- "The global entity '%s' corresponding to the local procedure '%s' is not a callable subprogram"_err_en_US,
+ if ((symbol.flags().test(Symbol::Flag::Function) ||
+ symbol.flags().test(Symbol::Flag::Subroutine)) &&
+ context_.ShouldWarn(common::UsageWarning::ExternalNameConflict)) {
+ msg = WarnIfNotInModuleFile(
+ "The global entity '%s' corresponding to the local procedure '%s' is not a callable subprogram"_warn_en_US,
global->name(), symbol.name());
}
} else if (auto chars{Characterize(symbol)}) {
diff --git a/flang/test/Semantics/local-vs-global.f90 b/flang/test/Semantics/local-vs-global.f90
index d1f0a666a6451..6e2b3c47d4552 100644
--- a/flang/test/Semantics/local-vs-global.f90
+++ b/flang/test/Semantics/local-vs-global.f90
@@ -1,4 +1,4 @@
-! RUN: %python %S/test_errors.py %s %flang_fc1
+! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic
module module_before_1
end
@@ -46,9 +46,9 @@ function implicit_func_before_2(a)
program test
external justfine ! OK to name a BLOCK DATA if not called
- !ERROR: The global entity 'module_before_1' corresponding to the local procedure 'module_before_1' is not a callable subprogram
+ !WARNING: The global entity 'module_before_1' corresponding to the local procedure 'module_before_1' is not a callable subprogram
external module_before_1
- !ERROR: The global entity 'block_data_before_1' corresponding to the local procedure 'block_data_before_1' is not a callable subprogram
+ !WARNING: The global entity 'block_data_before_1' corresponding to the local procedure 'block_data_before_1' is not a callable subprogram
external block_data_before_1
!ERROR: The global subprogram 'explicit_before_1' may not be referenced via the implicit interface 'explicit_before_1'
external explicit_before_1
@@ -56,9 +56,9 @@ program test
!ERROR: The global subprogram 'explicit_func_before_1' may not be referenced via the implicit interface 'explicit_func_before_1'
external explicit_func_before_1
external implicit_func_before_1
- !ERROR: The global entity 'module_after_1' corresponding to the local procedure 'module_after_1' is not a callable subprogram
+ !WARNING: The global entity 'module_after_1' corresponding to the local procedure 'module_after_1' is not a callable subprogram
external module_after_1
- !ERROR: The global entity 'block_data_after_1' corresponding to the local procedure 'block_data_after_1' is not a callable subprogram
+ !WARNING: The global entity 'block_data_after_1' corresponding to the local procedure 'block_data_after_1' is not a callable subprogram
external block_data_after_1
!ERROR: The global subprogram 'explicit_after_1' may not be referenced via the implicit interface 'explicit_after_1'
external explicit_after_1
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
When a compilation unit has an interface to an external subroutine or function, and there is a global object (like a module) with the same name, we're emitting an error. This is too strong, the program will still build. This comes up in real applications, too. Downgrade the error to a warning.
When a compilation unit has an interface to an external subroutine or function, and there is a global object (like a module) with the same name, we're emitting an error. This is too strong, the program will still build. This comes up in real applications, too. Downgrade the error to a warning.