[flang] Silence bogus error on use after IMPORT

When a scope uses an explicit IMPORT statement to import a
symbol from the scope's host, it should not emit a bogus error
message later if that symbol is used in a specification construct.
The code that checks for imports being hidden by local declarations
was not allowing for the presence of host association (or USE)
indirection symbols in the local scope.  Fix by using GetUltimate()
before checking for the hidden symbol.

Differential Revision: https://reviews.llvm.org/D118747
This commit is contained in:
Peter Klausler 2022-01-31 10:07:53 -08:00
parent bc699ed0bf
commit aee705661f
2 changed files with 19 additions and 4 deletions

View File

@ -6769,9 +6769,12 @@ void ResolveNamesVisitor::CheckImports() {
void ResolveNamesVisitor::CheckImport(
const SourceName &location, const SourceName &name) {
if (auto *symbol{FindInScope(name)}) {
Say(location, "'%s' from host is not accessible"_err_en_US, name)
.Attach(symbol->name(), "'%s' is hidden by this entity"_en_US,
symbol->name());
const Symbol &ultimate{symbol->GetUltimate()};
if (&ultimate.owner() == &currScope()) {
Say(location, "'%s' from host is not accessible"_err_en_US, name)
.Attach(symbol->name(), "'%s' is hidden by this entity"_en_US,
symbol->name());
}
}
}

View File

@ -1,5 +1,5 @@
! RUN: %python %S/test_errors.py %s %flang_fc1
module m
module m1
type t1
end type
type t3
@ -42,3 +42,15 @@ contains
call s5()
end
end module
module m2
integer, parameter :: ck = kind('a')
end module
program main
use m2
interface
subroutine s0(x)
import :: ck
character(kind=ck) :: x ! no error
end subroutine
end interface
end program