[Flang] Use the ultimate symbol in a DeallocateStmt check
authorKiran Chandramohan <kiran.chandramohan@arm.com>
Fri, 7 Oct 2022 14:40:26 +0000 (14:40 +0000)
committerKiran Chandramohan <kiran.chandramohan@arm.com>
Fri, 7 Oct 2022 14:47:59 +0000 (14:47 +0000)
Use the ultimate symbol while calling the `IsAllocatableOrPointer`
function to ensure that the check works as expected for
host-associated symbols.

Fixes #58178

Reviewed By: PeteSteinfeld

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

flang/lib/Semantics/check-deallocate.cpp
flang/test/Semantics/OpenMP/dealloc.f90 [new file with mode: 0644]

index d26935d..0b21244 100644 (file)
@@ -26,7 +26,8 @@ void DeallocateChecker::Leave(const parser::DeallocateStmt &deallocateStmt) {
               } else if (!IsVariableName(*symbol)) {
                 context_.Say(name.source,
                     "name in DEALLOCATE statement must be a variable name"_err_en_US);
-              } else if (!IsAllocatableOrPointer(*symbol)) { // C932
+              } else if (!IsAllocatableOrPointer(
+                             symbol->GetUltimate())) { // C932
                 context_.Say(name.source,
                     "name in DEALLOCATE statement must have the ALLOCATABLE or POINTER attribute"_err_en_US);
               } else {
diff --git a/flang/test/Semantics/OpenMP/dealloc.f90 b/flang/test/Semantics/OpenMP/dealloc.f90
new file mode 100644 (file)
index 0000000..b25fa62
--- /dev/null
@@ -0,0 +1,13 @@
+! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
+
+! Test to check that no errors are present when allocate statements
+! are applied on privatised variables.
+
+subroutine s
+  implicit none
+  double precision,allocatable,dimension(:) :: r
+  !$omp parallel private(r)
+  allocate(r(1))
+  deallocate(r)
+  !$omp end parallel
+end subroutine