[Flang][OpenMP] Use the ultimate symbol for allocatable check
authorKiran Chandramohan <kiran.chandramohan@arm.com>
Tue, 21 Feb 2023 15:16:16 +0000 (15:16 +0000)
committerKiran Chandramohan <kiran.chandramohan@arm.com>
Tue, 21 Feb 2023 15:26:09 +0000 (15:26 +0000)
Reviewed By: peixin

Differential Revision: https://reviews.llvm.org/D144383

flang/lib/Evaluate/tools.cpp
flang/test/Semantics/OpenMP/omp-private-is-pointer-allocatable-check.f90 [moved from flang/test/Semantics/OpenMP/omp-private-is-pointer-check.f90 with 51% similarity]

index a39493b..e5bc9cd 100644 (file)
@@ -1166,7 +1166,7 @@ bool IsAllocatableDesignator(const Expr<SomeType> &expr) {
   // Allocatable sub-objects are not themselves allocatable (9.5.3.1 NOTE 2).
   if (const semantics::Symbol *
       sym{UnwrapWholeSymbolOrComponentOrCoarrayRef(expr)}) {
-    return semantics::IsAllocatable(*sym);
+    return semantics::IsAllocatable(sym->GetUltimate());
   }
   return false;
 }
@@ -3,8 +3,16 @@
 subroutine s
   integer, pointer :: p
   integer, target :: t
+  real(4), allocatable :: arr
 
   !$omp parallel private(p)
     p=>t
   !$omp end parallel
+
+  allocate(arr)
+  !$omp parallel private(arr)
+  if (.not. allocated(arr)) then
+     print *, 'not allocated'
+  endif
+  !$omp end parallel
 end subroutine