[flang-commits] [flang] b0cea89 - [flang] Allow redudant attributes on use-/host- associated names
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Thu May 18 12:07:31 PDT 2023
Author: Peter Klausler
Date: 2023-05-18T12:07:25-07:00
New Revision: b0cea8941cab913d9a811ac5331ae63a22ada03f
URL: https://github.com/llvm/llvm-project/commit/b0cea8941cab913d9a811ac5331ae63a22ada03f
DIFF: https://github.com/llvm/llvm-project/commit/b0cea8941cab913d9a811ac5331ae63a22ada03f.diff
LOG: [flang] Allow redudant attributes on use-/host- associated names
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 https://github.com/llvm/llvm-project/issues/60274
Differential Revision: https://reviews.llvm.org/D150819
Added:
flang/test/Semantics/resolve119.f90
Modified:
flang/lib/Semantics/resolve-names.cpp
Removed:
################################################################################
diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp
index fa782f3b414b..4a4841d5a936 100644
--- a/flang/lib/Semantics/resolve-names.cpp
+++ b/flang/lib/Semantics/resolve-names.cpp
@@ -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;
}
diff --git a/flang/test/Semantics/resolve119.f90 b/flang/test/Semantics/resolve119.f90
new file mode 100644
index 000000000000..71294303d795
--- /dev/null
+++ b/flang/test/Semantics/resolve119.f90
@@ -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
+
More information about the flang-commits
mailing list