[flang-commits] [flang] 40fae67 - [Flang][OpenMP] Fix to construct-names inside OpenMP construct with default(none) (#82479)

via flang-commits flang-commits at lists.llvm.org
Wed Feb 21 04:14:58 PST 2024


Author: harishch4
Date: 2024-02-21T17:44:54+05:30
New Revision: 40fae67a50e08e6b5b5300210021218e404d63a7

URL: https://github.com/llvm/llvm-project/commit/40fae67a50e08e6b5b5300210021218e404d63a7
DIFF: https://github.com/llvm/llvm-project/commit/40fae67a50e08e6b5b5300210021218e404d63a7.diff

LOG: [Flang][OpenMP] Fix to construct-names inside OpenMP construct with default(none) (#82479)

When a do loop with a construct-name is used inside OpenMP construct
with default(none), an incorrect error will be raised as below.

```
program cn_and_default
    implicit none
    integer :: i

    !$omp parallel default(none)
        loop: do i = 1, 10
        end do loop
    !$omp end parallel
end program
```

> The DEFAULT(NONE) clause requires that 'loop' must be listed in a
data-sharing attribute clause

This patch fixes this by adding a condition to check and skip processing
construct-names.

Added: 
    

Modified: 
    flang/lib/Semantics/resolve-directives.cpp
    flang/test/Semantics/OpenMP/default-none.f90

Removed: 
    


################################################################################
diff  --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index 4b6d083671bc92..a826f0181e580c 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -1982,6 +1982,12 @@ void OmpAttributeVisitor::Post(const parser::OpenMPAllocatorsConstruct &x) {
 void OmpAttributeVisitor::Post(const parser::Name &name) {
   auto *symbol{name.symbol};
   if (symbol && !dirContext_.empty() && GetContext().withinConstruct) {
+    // Exclude construct-names
+    if (auto *details{symbol->detailsIf<semantics::MiscDetails>()}) {
+      if (details->kind() == semantics::MiscDetails::Kind::ConstructName) {
+        return;
+      }
+    }
     if (!symbol->owner().IsDerivedType() && !IsProcedure(*symbol) &&
         !IsObjectWithDSA(*symbol) && !IsNamedConstant(*symbol)) {
       // TODO: create a separate function to go through the rules for

diff  --git a/flang/test/Semantics/OpenMP/default-none.f90 b/flang/test/Semantics/OpenMP/default-none.f90
index d027f46f005846..11ba878ea77940 100644
--- a/flang/test/Semantics/OpenMP/default-none.f90
+++ b/flang/test/Semantics/OpenMP/default-none.f90
@@ -39,3 +39,11 @@ subroutine sb3(x)
    print *, x
  end subroutine
 end subroutine
+
+!construct-name inside default(none)
+subroutine sb4
+  !$omp parallel default(none)
+    loop: do i = 1, 10
+    end do loop
+  !$omp end parallel
+end subroutine


        


More information about the flang-commits mailing list