Skip to content

Commit

Permalink
[flang] Allow redudant attributes on use-/host- associated names
Browse files Browse the repository at this point in the history
Constraint C815 in F'2018 allows a name to acquire an attribute at
most once per scope.  For some attributes, the attribute may have
already been inherited, and the compiler was emitting a bogus error
message for a redundant application of the same attribute in another
scope.

Fixes #60274

Differential Revision: https://reviews.llvm.org/D150819
  • Loading branch information
klausler committed May 18, 2023
1 parent 0c71a6e commit b0cea89
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 0 deletions.
4 changes: 4 additions & 0 deletions flang/lib/Semantics/resolve-names.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2329,6 +2329,10 @@ Symbol &ScopeHandler::MakeHostAssocSymbol(
.first->second};
name.symbol = &symbol;
symbol.attrs() = hostSymbol.attrs(); // TODO: except PRIVATE, PUBLIC?
// These attributes can be redundantly reapplied without error
// on the host-associated name, at most once (C815).
symbol.implicitAttrs() =
symbol.attrs() & Attrs{Attr::ASYNCHRONOUS, Attr::VOLATILE};
symbol.flags() = hostSymbol.flags();
return symbol;
}
Expand Down
78 changes: 78 additions & 0 deletions flang/test/Semantics/resolve119.f90
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
! RUN: %python %S/test_errors.py %s %flang_fc1
! C815: an attribute may be applied at most once per scope
module m
real a1, a2, v1, v2
asynchronous a1
asynchronous a2
!ERROR: ASYNCHRONOUS attribute was already specified on 'a2'
asynchronous a2
volatile v1
volatile v2
!ERROR: VOLATILE attribute was already specified on 'v2'
volatile v2
contains
subroutine modsub
asynchronous a1
asynchronous a2
!ERROR: ASYNCHRONOUS attribute was already specified on 'a2'
asynchronous a2
volatile v1
volatile v2
!ERROR: VOLATILE attribute was already specified on 'v2'
volatile v2
block
asynchronous a1
asynchronous a2
!ERROR: ASYNCHRONOUS attribute was already specified on 'a2'
asynchronous a2
volatile v1
volatile v2
!ERROR: VOLATILE attribute was already specified on 'v2'
volatile v2
end block
end
end

subroutine s
use m
asynchronous a1
asynchronous a2
!ERROR: ASYNCHRONOUS attribute was already specified on 'a2'
asynchronous a2
volatile v1
volatile v2
!ERROR: VOLATILE attribute was already specified on 'v2'
volatile v2
block
asynchronous a1
asynchronous a2
!ERROR: ASYNCHRONOUS attribute was already specified on 'a2'
asynchronous a2
volatile v1
volatile v2
!ERROR: VOLATILE attribute was already specified on 'v2'
volatile v2
end block
contains
subroutine internal
asynchronous a1
asynchronous a2
!ERROR: ASYNCHRONOUS attribute was already specified on 'a2'
asynchronous a2
volatile v1
volatile v2
!ERROR: VOLATILE attribute was already specified on 'v2'
volatile v2
block
asynchronous a1
asynchronous a2
!ERROR: ASYNCHRONOUS attribute was already specified on 'a2'
asynchronous a2
volatile v1
volatile v2
!ERROR: VOLATILE attribute was already specified on 'v2'
volatile v2
end block
end
end

0 comments on commit b0cea89

Please sign in to comment.