Skip to content

Commit

Permalink
[flang] Don't use-associate intrinsics
Browse files Browse the repository at this point in the history
When an intrinsic is referenced in a module scope, a symbol for it is
added. When that module is USEd, the intrinsic should not be included.
Otherwise we can get ambiguous reference errors with the same intrinsic
coming from two difference modules.

Differential Revision: https://reviews.llvm.org/D83905
  • Loading branch information
tskeith committed Jul 15, 2020
1 parent ed6b578 commit fa5e448
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 12 deletions.
1 change: 1 addition & 0 deletions flang/lib/Semantics/resolve-names.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2310,6 +2310,7 @@ void ModuleVisitor::Post(const parser::UseStmt &x) {
}
for (const auto &[name, symbol] : *useModuleScope_) {
if (symbol->attrs().test(Attr::PUBLIC) &&
!symbol->attrs().test(Attr::INTRINSIC) &&
!symbol->detailsIf<MiscDetails>()) {
if (useNames.count(name) == 0) {
auto *localSymbol{FindInScope(currScope(), name)};
Expand Down
3 changes: 0 additions & 3 deletions flang/test/Semantics/modfile30.f90
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ module m2
! type(t),parameter::a=t()
!end

! Don't write out intrinsics
module m3a
integer, parameter :: i4 = selected_int_kind(9)
end
Expand All @@ -60,7 +59,6 @@ module m3b
!Expect: m3b.mod
!module m3b
! use m3a,only:i4
! use m3a,only:selected_int_kind
! integer(4)::j
!end

Expand All @@ -82,7 +80,6 @@ module m4b
!Expect: m4b.mod
!module m4b
! use m4a,only:a
! use m4a,only:achar
! character(1_4,1),parameter::b="\001"
!end

28 changes: 19 additions & 9 deletions flang/test/Semantics/resolve14.f90
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,30 @@ module m1
integer :: x
integer :: y
integer :: z
integer, parameter :: k1 = selected_int_kind(9)
end
module m2
real :: y
real :: z
real :: w
integer, parameter :: k2 = selected_int_kind(9)
end

use m1, xx => x, y => z
use m2
volatile w
!ERROR: Cannot change CONTIGUOUS attribute on use-associated 'w'
contiguous w
!ERROR: 'z' is use-associated from module 'm2' and cannot be re-declared
integer z
!ERROR: Reference to 'y' is ambiguous
y = 1
program p1
use m1
use m2
! check that selected_int_kind is not use-associated
integer, parameter :: k = selected_int_kind(9)
end

program p2
use m1, xx => x, y => z
use m2
volatile w
!ERROR: Cannot change CONTIGUOUS attribute on use-associated 'w'
contiguous w
!ERROR: 'z' is use-associated from module 'm2' and cannot be re-declared
integer z
!ERROR: Reference to 'y' is ambiguous
y = 1
end

0 comments on commit fa5e448

Please sign in to comment.