[flang-commits] [flang] [Flang][OpenMP] Deprecate Allocate Directive (PR #142378)
Jack Styles via flang-commits
flang-commits at lists.llvm.org
Mon Jun 2 06:49:40 PDT 2025
https://github.com/Stylie777 updated https://github.com/llvm/llvm-project/pull/142378
>From ccc9ab7d82afa4c9d418321e14dd8e0e851edc03 Mon Sep 17 00:00:00 2001
From: Jack Styles <jack.styles at arm.com>
Date: Mon, 2 Jun 2025 11:12:00 +0100
Subject: [PATCH 1/3] [Flang][OpenMP] Deprecate Allocate Directive
As part of OpenMP 5.2, the allocate directive has been deprecated
in favour of the allocators construct for Fortran. To enable this in
flang, a warning has been added informing the user of this. Tests to
ensure this behaviour is continued are also included.
See also: #110008
---
flang/lib/Semantics/resolve-directives.cpp | 5 +++++
.../OpenMP/Todo/omp-declarative-allocate-align.f90 | 1 +
.../Lower/OpenMP/Todo/omp-declarative-allocate.f90 | 1 +
flang/test/Semantics/OpenMP/allocate-align01.f90 | 2 ++
flang/test/Semantics/OpenMP/allocate01.f90 | 2 ++
flang/test/Semantics/OpenMP/allocate02.f90 | 4 ++++
flang/test/Semantics/OpenMP/allocate03.f90 | 2 ++
flang/test/Semantics/OpenMP/allocate04.f90 | 5 +++++
flang/test/Semantics/OpenMP/allocate05.f90 | 2 ++
flang/test/Semantics/OpenMP/allocate06.f90 | 2 ++
flang/test/Semantics/OpenMP/allocate07.f90 | 5 +++++
flang/test/Semantics/OpenMP/allocate08.f90 | 10 ++++++++++
flang/test/Semantics/OpenMP/allocate09.f90 | 8 ++++++++
13 files changed, 49 insertions(+)
diff --git a/flang/lib/Semantics/resolve-directives.cpp b/flang/lib/Semantics/resolve-directives.cpp
index 9fa7bc8964854..10121898817db 100644
--- a/flang/lib/Semantics/resolve-directives.cpp
+++ b/flang/lib/Semantics/resolve-directives.cpp
@@ -2024,6 +2024,7 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPThreadprivate &x) {
bool OmpAttributeVisitor::Pre(const parser::OpenMPDeclarativeAllocate &x) {
PushContext(x.source, llvm::omp::Directive::OMPD_allocate);
+ IssueNonConformanceWarning(llvm::omp::Directive::OMPD_allocate, x.source);
const auto &list{std::get<parser::OmpObjectList>(x.t)};
ResolveOmpObjectList(list, Symbol::Flag::OmpDeclarativeAllocateDirective);
return false;
@@ -2036,6 +2037,7 @@ bool OmpAttributeVisitor::Pre(const parser::OpenMPDispatchConstruct &x) {
bool OmpAttributeVisitor::Pre(const parser::OpenMPExecutableAllocate &x) {
PushContext(x.source, llvm::omp::Directive::OMPD_allocate);
+ IssueNonConformanceWarning(llvm::omp::Directive::OMPD_allocate, x.source);
const auto &list{std::get<std::optional<parser::OmpObjectList>>(x.t)};
if (list) {
ResolveOmpObjectList(*list, Symbol::Flag::OmpExecutableAllocateDirective);
@@ -3074,6 +3076,9 @@ void OmpAttributeVisitor::IssueNonConformanceWarning(
case llvm::omp::OMPD_parallel_master_taskloop_simd:
setAlternativeStr("PARALLEL_MASKED TASKLOOP SIMD");
break;
+ case llvm::omp::OMPD_allocate:
+ setAlternativeStr("ALLOCATORS");
+ break;
case llvm::omp::OMPD_target_loop:
default:;
}
diff --git a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate-align.f90 b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate-align.f90
index 8daf20e1ae400..d9d7890222467 100644
--- a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate-align.f90
+++ b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate-align.f90
@@ -5,6 +5,7 @@
program main
integer :: x
+ ! CHECK: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
! CHECK: not yet implemented: OpenMPDeclarativeAllocate
!$omp allocate(x) align(32)
end
diff --git a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90 b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90
index 425ccbc5dd56c..44bfc32e1565d 100644
--- a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90
+++ b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90
@@ -5,6 +5,7 @@
program main
integer :: x, y
+ // CHECK: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
// CHECK: not yet implemented: OpenMPDeclarativeAllocate
!$omp allocate(x, y)
end
diff --git a/flang/test/Semantics/OpenMP/allocate-align01.f90 b/flang/test/Semantics/OpenMP/allocate-align01.f90
index ba0776cf46a6d..2217505d13895 100644
--- a/flang/test/Semantics/OpenMP/allocate-align01.f90
+++ b/flang/test/Semantics/OpenMP/allocate-align01.f90
@@ -11,8 +11,10 @@ program allocate_align_tree
integer :: z, t, xx
t = 2
z = 3
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: The alignment value should be a constant positive integer
!$omp allocate(j) align(xx)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: The alignment value should be a constant positive integer
!$omp allocate(xarray) align(-32) allocator(omp_large_cap_mem_alloc)
allocate(j(z), xarray(t))
diff --git a/flang/test/Semantics/OpenMP/allocate01.f90 b/flang/test/Semantics/OpenMP/allocate01.f90
index 6ccb8bb09e830..c8aa6cf8ad977 100644
--- a/flang/test/Semantics/OpenMP/allocate01.f90
+++ b/flang/test/Semantics/OpenMP/allocate01.f90
@@ -15,10 +15,12 @@ subroutine sema()
integer :: a, b
real, dimension (:,:), allocatable :: darray
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: List items must be declared in the same scoping unit in which the ALLOCATE directive appears
!$omp allocate(y)
print *, a
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: List items must be declared in the same scoping unit in which the ALLOCATE directive appears
!$omp allocate(x) allocator(omp_default_mem_alloc)
allocate ( x(a), darray(a, b) )
diff --git a/flang/test/Semantics/OpenMP/allocate02.f90 b/flang/test/Semantics/OpenMP/allocate02.f90
index 8f0579e810bb9..fa175d0ab7ced 100644
--- a/flang/test/Semantics/OpenMP/allocate02.f90
+++ b/flang/test/Semantics/OpenMP/allocate02.f90
@@ -11,14 +11,18 @@ subroutine allocate()
integer :: a, b
real, dimension (:,:), allocatable :: darray
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(x, y) allocator(omp_default_mem_alloc)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: At most one ALLOCATOR clause can appear on the ALLOCATE directive
!$omp allocate(x, y) allocator(omp_default_mem_alloc) allocator(omp_default_mem_alloc)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(darray) allocator(omp_default_mem_alloc)
allocate ( darray(a, b) )
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: At most one ALLOCATOR clause can appear on the ALLOCATE directive
!$omp allocate(darray) allocator(omp_default_mem_alloc) allocator(omp_default_mem_alloc)
allocate ( darray(a, b) )
diff --git a/flang/test/Semantics/OpenMP/allocate03.f90 b/flang/test/Semantics/OpenMP/allocate03.f90
index e35115f3897cc..15f924bf2ca1f 100644
--- a/flang/test/Semantics/OpenMP/allocate03.f90
+++ b/flang/test/Semantics/OpenMP/allocate03.f90
@@ -15,9 +15,11 @@ subroutine allocate()
real, dimension (:,:), allocatable :: darray
integer :: a, b
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: A variable that is part of another variable (as an array or structure element) cannot appear on the ALLOCATE directive
!$omp allocate(my_var%array)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: A variable that is part of another variable (as an array or structure element) cannot appear on the ALLOCATE directive
!$omp allocate(darray, my_var%array) allocator(omp_default_mem_alloc)
allocate ( darray(a, b) )
diff --git a/flang/test/Semantics/OpenMP/allocate04.f90 b/flang/test/Semantics/OpenMP/allocate04.f90
index bbd74eb2ca101..2882e62acc2af 100644
--- a/flang/test/Semantics/OpenMP/allocate04.f90
+++ b/flang/test/Semantics/OpenMP/allocate04.f90
@@ -15,14 +15,19 @@ subroutine allocate(z)
integer :: x, y, z
associate (a => x)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(x) allocator(omp_default_mem_alloc)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: PRIVATE clause is not allowed on the ALLOCATE directive
!$omp allocate(y) private(y)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: List item 'z' in ALLOCATE directive must not be a dummy argument
!$omp allocate(z)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: List item 'p' in ALLOCATE directive must not have POINTER attribute
!$omp allocate(p)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: List item 'a' in ALLOCATE directive must not be an associate name
!$omp allocate(a)
end associate
diff --git a/flang/test/Semantics/OpenMP/allocate05.f90 b/flang/test/Semantics/OpenMP/allocate05.f90
index a787e8bb32a4c..2c81c4dbc82c7 100644
--- a/flang/test/Semantics/OpenMP/allocate05.f90
+++ b/flang/test/Semantics/OpenMP/allocate05.f90
@@ -13,11 +13,13 @@ subroutine allocate()
real, dimension (:,:), allocatable :: darray
!$omp target
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate allocator(omp_default_mem_alloc)
allocate ( darray(a, b) )
!$omp end target
!$omp target
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: ALLOCATE directives that appear in a TARGET region must specify an allocator clause
!$omp allocate
allocate ( darray(a, b) )
diff --git a/flang/test/Semantics/OpenMP/allocate06.f90 b/flang/test/Semantics/OpenMP/allocate06.f90
index e14134cd07301..f6172c9d905bb 100644
--- a/flang/test/Semantics/OpenMP/allocate06.f90
+++ b/flang/test/Semantics/OpenMP/allocate06.f90
@@ -11,9 +11,11 @@ subroutine allocate()
integer :: a, b, x
real, dimension (:,:), allocatable :: darray
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: List items specified in the ALLOCATE directive must not have the ALLOCATABLE attribute unless the directive is associated with an ALLOCATE statement
!$omp allocate(darray) allocator(omp_default_mem_alloc)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(darray) allocator(omp_default_mem_alloc)
allocate(darray(a, b))
diff --git a/flang/test/Semantics/OpenMP/allocate07.f90 b/flang/test/Semantics/OpenMP/allocate07.f90
index 396df598b2521..cad55a5adf4bf 100644
--- a/flang/test/Semantics/OpenMP/allocate07.f90
+++ b/flang/test/Semantics/OpenMP/allocate07.f90
@@ -18,18 +18,23 @@ subroutine allocate()
CHARACTER(LEN=32) :: w
INTEGER, DIMENSION(:), ALLOCATABLE :: y
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: A type parameter inquiry cannot appear on the ALLOCATE directive
!$omp allocate(x%KIND)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: A type parameter inquiry cannot appear on the ALLOCATE directive
!$omp allocate(w%LEN)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: A type parameter inquiry cannot appear on the ALLOCATE directive
!$omp allocate(y%KIND)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: A type parameter inquiry cannot appear on the ALLOCATE directive
!$omp allocate(my_var%kind_param)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: A type parameter inquiry cannot appear on the ALLOCATE directive
!$omp allocate(my_var%len_param)
diff --git a/flang/test/Semantics/OpenMP/allocate08.f90 b/flang/test/Semantics/OpenMP/allocate08.f90
index fc950ea4fca36..6ceb87bfa9bdc 100644
--- a/flang/test/Semantics/OpenMP/allocate08.f90
+++ b/flang/test/Semantics/OpenMP/allocate08.f90
@@ -25,20 +25,30 @@ subroutine allocate()
trait(1)%value = default_mem_fb
custom_allocator = omp_init_allocator(memspace, 1, trait)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(x) allocator(omp_default_mem_alloc)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(y) allocator(omp_default_mem_alloc)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(z) allocator(omp_default_mem_alloc)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(x)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(y)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(z)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(w) allocator(custom_allocator)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: If list items within the ALLOCATE directive have the SAVE attribute, are a common block name, or are declared in the scope of a module, then only predefined memory allocator parameters can be used in the allocator clause
!$omp allocate(x) allocator(custom_allocator)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: If list items within the ALLOCATE directive have the SAVE attribute, are a common block name, or are declared in the scope of a module, then only predefined memory allocator parameters can be used in the allocator clause
!$omp allocate(y) allocator(custom_allocator)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: If list items within the ALLOCATE directive have the SAVE attribute, are a common block name, or are declared in the scope of a module, then only predefined memory allocator parameters can be used in the allocator clause
!$omp allocate(z) allocator(custom_allocator)
end subroutine allocate
diff --git a/flang/test/Semantics/OpenMP/allocate09.f90 b/flang/test/Semantics/OpenMP/allocate09.f90
index 0f93a340fe1e4..c078f060d620a 100644
--- a/flang/test/Semantics/OpenMP/allocate09.f90
+++ b/flang/test/Semantics/OpenMP/allocate09.f90
@@ -12,23 +12,31 @@ subroutine allocate()
integer, dimension(:), allocatable :: a, b, c, d, e, f, &
g, h, i, j, k, l
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(a) allocator(omp_default_mem_alloc)
allocate(a(1), b(2))
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(c, d) allocator(omp_default_mem_alloc)
allocate(c(3), d(4))
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(e) allocator(omp_default_mem_alloc)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(f, g) allocator(omp_default_mem_alloc)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate
allocate(e(5), f(6), g(7))
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: Object 'i' in ALLOCATE directive not found in corresponding ALLOCATE statement
!$omp allocate(h, i) allocator(omp_default_mem_alloc)
allocate(h(8))
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!ERROR: Object 'j' in ALLOCATE directive not found in corresponding ALLOCATE statement
!$omp allocate(j, k) allocator(omp_default_mem_alloc)
+ !WARNING: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
!$omp allocate(l) allocator(omp_default_mem_alloc)
allocate(k(9), l(10))
>From 8fa7d56024e14927fca7f4322ef018f0c99fa78a Mon Sep 17 00:00:00 2001
From: Jack Styles <jack.styles at arm.com>
Date: Mon, 2 Jun 2025 14:15:51 +0100
Subject: [PATCH 2/3] Address review comments
The following has been fixed:
- Updated comments to be `!` instead of `\\` in test file
---
flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90 | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90 b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90
index 44bfc32e1565d..8e8294a1b91b1 100644
--- a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90
+++ b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90
@@ -5,7 +5,7 @@
program main
integer :: x, y
- // CHECK: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
- // CHECK: not yet implemented: OpenMPDeclarativeAllocate
+ ! CHECK: OpenMP directive ALLOCATE has been deprecated, please use ALLOCATORS instead.
+ ! CHECK: not yet implemented: OpenMPDeclarativeAllocate
!$omp allocate(x, y)
end
>From 4ec415866caf2c0a92c4a18aaf961817006a099b Mon Sep 17 00:00:00 2001
From: Jack Styles <jack.styles at arm.com>
Date: Mon, 2 Jun 2025 14:48:35 +0100
Subject: [PATCH 3/3] fix failing test
---
flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90 b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90
index 8e8294a1b91b1..4bd3e03f4b847 100644
--- a/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90
+++ b/flang/test/Lower/OpenMP/Todo/omp-declarative-allocate.f90
@@ -1,6 +1,6 @@
! This test checks lowering of OpenMP allocate Directive.
-// RUN: not flang -fc1 -emit-fir -fopenmp %s 2>&1 | FileCheck %s
+! RUN: not flang -fc1 -emit-fir -fopenmp %s 2>&1 | FileCheck %s
program main
integer :: x, y
More information about the flang-commits
mailing list