Skip to content

Commit 44819b5

Browse files
committed
[flang] Define ATOMIC_ADD as an intrinsic procedure
This one appears to have been omitted when other ATOMIC_xxx intrinsic procedures were defined. There's already tests for it, but they apparently work even when ATOMIC_ADD must be interpreted as an external procedure with an implicit interface. Extend the tests with INTRINSIC NONE(EXTERNAL, TYPE) statements to ensure that they require the intrinsic interpretation.
1 parent 93fd72c commit 44819b5

File tree

12 files changed

+21
-14
lines changed

12 files changed

+21
-14
lines changed

flang/lib/Evaluate/intrinsics.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1311,6 +1311,14 @@ static const SpecificIntrinsicInterface specificIntrinsicFunction[]{
13111311

13121312
static const IntrinsicInterface intrinsicSubroutine[]{
13131313
{"abort", {}, {}, Rank::elemental, IntrinsicClass::impureSubroutine},
1314+
{"atomic_add",
1315+
{{"atom", AtomicInt, Rank::atom, Optionality::required,
1316+
common::Intent::InOut},
1317+
{"value", AnyInt, Rank::scalar, Optionality::required,
1318+
common::Intent::In},
1319+
{"stat", AnyInt, Rank::scalar, Optionality::optional,
1320+
common::Intent::Out}},
1321+
{}, Rank::elemental, IntrinsicClass::atomicSubroutine},
13141322
{"atomic_and",
13151323
{{"atom", AtomicInt, Rank::atom, Optionality::required,
13161324
common::Intent::InOut},
@@ -1585,7 +1593,6 @@ static const IntrinsicInterface intrinsicSubroutine[]{
15851593
};
15861594

15871595
// TODO: Intrinsic subroutine EVENT_QUERY
1588-
// TODO: Atomic intrinsic subroutines: ATOMIC_ADD
15891596
// TODO: Collective intrinsic subroutines: co_reduce
15901597

15911598
// Finds a built-in derived type and returns it as a DynamicType.
@@ -3232,8 +3239,8 @@ static bool ApplySpecificChecks(SpecificCall &call, FoldingContext &context) {
32323239
arg ? arg->sourceLocation() : context.messages().at(),
32333240
"Argument of ALLOCATED() must be an ALLOCATABLE object or component"_err_en_US);
32343241
}
3235-
} else if (name == "atomic_and" || name == "atomic_or" ||
3236-
name == "atomic_xor") {
3242+
} else if (name == "atomic_add" || name == "atomic_and" ||
3243+
name == "atomic_or" || name == "atomic_xor") {
32373244
return CheckForCoindexedObject(
32383245
context.messages(), call.arguments[2], name, "stat");
32393246
} else if (name == "atomic_cas") {

flang/test/Semantics/atomic01.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
program test_atomic_add
77
use iso_fortran_env, only : atomic_int_kind
8-
implicit none
8+
implicit none(external, type)
99

1010
integer(kind=atomic_int_kind) atom_object[*], atom_array(2)[*], quantity, array(1), coarray[*], non_coarray
1111
integer non_atom_object[*], non_atom, non_scalar(1), status, stat_array(1), coindexed[*]

flang/test/Semantics/atomic02.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
program test_atomic_and
66
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
7-
implicit none
7+
implicit none(external, type)
88

99
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, non_coarray
1010
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_val, array(10)

flang/test/Semantics/atomic03.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
program test_atomic_cas
66
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
7-
implicit none
7+
implicit none(external, type)
88

99
integer(kind=atomic_int_kind) :: int_scalar_coarray[*], non_scalar_coarray(10)[*], non_coarray
1010
integer(kind=atomic_int_kind) :: repeated_atom[*], array(10)

flang/test/Semantics/atomic04.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
program test_atomic_define
66
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
7-
implicit none
7+
implicit none(external, type)
88

99
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, non_coarray
1010
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_val, array(10)

flang/test/Semantics/atomic05.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
program test_atomic_fetch_add
66
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
7-
implicit none
7+
implicit none(external, type)
88

99
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, old_val, non_coarray
1010
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_old, repeated_val, array(10)

flang/test/Semantics/atomic06.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
program test_atomic_fetch_and
66
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
7-
implicit none
7+
implicit none(external, type)
88

99
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, old_val, non_coarray
1010
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_old, repeated_val, array(10)

flang/test/Semantics/atomic07.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
program test_atomic_fetch_or
66
use iso_fortran_env, only: atomic_int_kind
7-
implicit none
7+
implicit none(external, type)
88

99
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, old_val, non_coarray
1010
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_old, repeated_val, array(10), val_coarray[*], old_val_coarray[*]

flang/test/Semantics/atomic08.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
program test_atomic_fetch_xor
66
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
7-
implicit none
7+
implicit none(external, type)
88

99
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, old_val, non_coarray
1010
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_old, repeated_val, array(10)

flang/test/Semantics/atomic09.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
program test_atomic_or
66
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
7-
implicit none
7+
implicit none(external, type)
88

99
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, non_coarray
1010
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_val, array(10)

flang/test/Semantics/atomic10.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
program test_atomic_ref
66
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
7-
implicit none
7+
implicit none(external, type)
88

99
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, non_coarray
1010
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_val, array(10)

flang/test/Semantics/atomic11.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
program test_atomic_xor
66
use iso_fortran_env, only: atomic_int_kind, atomic_logical_kind
7-
implicit none
7+
implicit none(external, type)
88

99
integer(kind=atomic_int_kind) :: scalar_coarray[*], non_scalar_coarray(10)[*], val, non_coarray
1010
integer(kind=atomic_int_kind) :: repeated_atom[*], repeated_val, array(10)

0 commit comments

Comments
 (0)