Skip to content

Commit

Permalink
[flang] Accept IGNORE_TKR in separate module procedure interface (#98374
Browse files Browse the repository at this point in the history
)

We emit an incorrect error message when !DIR$ IGNORE_TKR appears in a
separate module procedure's interface declaration.

Fixes #98210.
  • Loading branch information
klausler committed Jul 11, 2024
1 parent d5285fe commit d6f314c
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 9 deletions.
15 changes: 6 additions & 9 deletions flang/lib/Semantics/check-declarations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -762,13 +762,10 @@ void CheckHelper::CheckObjectEntity(
}
if (auto ignoreTKR{GetIgnoreTKR(symbol)}; !ignoreTKR.empty()) {
const Symbol *ownerSymbol{symbol.owner().symbol()};
const auto *ownerSubp{ownerSymbol->detailsIf<SubprogramDetails>()};
bool inInterface{ownerSubp && ownerSubp->isInterface()};
bool inExplicitInterface{
inInterface && !IsSeparateModuleProcedureInterface(ownerSymbol)};
bool inModuleProc{
!inInterface && ownerSymbol && IsModuleProcedure(*ownerSymbol)};
if (!inExplicitInterface && !inModuleProc) {
bool inModuleProc{ownerSymbol && IsModuleProcedure(*ownerSymbol)};
bool inExplicitExternalInterface{
InInterface() && !IsSeparateModuleProcedureInterface(ownerSymbol)};
if (!InInterface() && !inModuleProc) {
messages_.Say(
"!DIR$ IGNORE_TKR may apply only in an interface or a module procedure"_err_en_US);
}
Expand All @@ -779,7 +776,7 @@ void CheckHelper::CheckObjectEntity(
}
if (IsPassedViaDescriptor(symbol)) {
if (IsAllocatableOrObjectPointer(&symbol)) {
if (inExplicitInterface) {
if (inExplicitExternalInterface) {
if (context_.ShouldWarn(common::UsageWarning::IgnoreTKRUsage)) {
WarnIfNotInModuleFile(
"!DIR$ IGNORE_TKR should not apply to an allocatable or pointer"_warn_en_US);
Expand All @@ -794,7 +791,7 @@ void CheckHelper::CheckObjectEntity(
WarnIfNotInModuleFile(
"!DIR$ IGNORE_TKR(R) is not meaningful for an assumed-rank array"_warn_en_US);
}
} else if (inExplicitInterface) {
} else if (inExplicitExternalInterface) {
if (context_.ShouldWarn(common::UsageWarning::IgnoreTKRUsage)) {
WarnIfNotInModuleFile(
"!DIR$ IGNORE_TKR(R) should not apply to a dummy argument passed via descriptor"_warn_en_US);
Expand Down
13 changes: 13 additions & 0 deletions flang/test/Semantics/ignore_tkr01.f90
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,11 @@ subroutine t14(x)
real x(:)
end

module subroutine t24(x)
!dir$ ignore_tkr(t) x
real x(:)
end

end interface

contains
Expand Down Expand Up @@ -158,6 +163,14 @@ subroutine bad1(x)
real, intent(in) :: x
end

submodule(m) subm
contains
module subroutine t24(x)
!dir$ ignore_tkr(t) x
real x(:)
end
end

program test

!ERROR: !DIR$ IGNORE_TKR directive must appear in a subroutine or function
Expand Down

0 comments on commit d6f314c

Please sign in to comment.