[flang-commits] [PATCH] D150819: [flang] Allow redudant attributes on use-/host- associated names

Peter Klausler via Phabricator via flang-commits flang-commits at lists.llvm.org
Wed May 17 14:36:03 PDT 2023


klausler created this revision.
klausler added a reviewer: PeteSteinfeld.
klausler added a project: Flang.
Herald added subscribers: sunshaoce, jdoerfert.
Herald added a reviewer: sscalpone.
Herald added a project: All.
klausler requested review of this revision.

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.


https://reviews.llvm.org/D150819

Files:
  flang/lib/Semantics/resolve-names.cpp
  flang/test/Semantics/resolve119.f90


Index: flang/test/Semantics/resolve119.f90
===================================================================
--- /dev/null
+++ 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
+
Index: flang/lib/Semantics/resolve-names.cpp
===================================================================
--- flang/lib/Semantics/resolve-names.cpp
+++ flang/lib/Semantics/resolve-names.cpp
@@ -2329,6 +2329,10 @@
                       .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;
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D150819.523178.patch
Type: text/x-patch
Size: 2845 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/flang-commits/attachments/20230517/50f3794f/attachment.bin>


More information about the flang-commits mailing list