[flang-commits] [flang] [flang] Add image_index to list of intrinsics and add tests (PR #79519)

via flang-commits flang-commits at lists.llvm.org
Thu Jan 25 15:28:03 PST 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-semantics

Author: Katherine Rasmussen (ktras)

<details>
<summary>Changes</summary>

Add image_index to the list of intrinsic functions and add additional check on its args in check-call.cpp. Add two semantics tests for image_index.

---
Full diff: https://github.com/llvm/llvm-project/pull/79519.diff


5 Files Affected:

- (modified) flang/docs/Intrinsics.md (+1-1) 
- (modified) flang/lib/Evaluate/intrinsics.cpp (+12-1) 
- (modified) flang/lib/Semantics/check-call.cpp (+19) 
- (added) flang/test/Semantics/image_index01.f90 (+41) 
- (added) flang/test/Semantics/image_index02.f90 (+109) 


``````````diff
diff --git a/flang/docs/Intrinsics.md b/flang/docs/Intrinsics.md
index 5ade2574032977..66ed2d05f2332b 100644
--- a/flang/docs/Intrinsics.md
+++ b/flang/docs/Intrinsics.md
@@ -753,7 +753,7 @@ This phase currently supports all the intrinsic procedures listed above but the
 
 | Intrinsic Category | Intrinsic Procedures Lacking Support |
 | --- | --- |
-| Coarray intrinsic functions | IMAGE_INDEX, COSHAPE |
+| Coarray intrinsic functions | COSHAPE |
 | Object characteristic inquiry functions | ALLOCATED, ASSOCIATED, EXTENDS_TYPE_OF, IS_CONTIGUOUS, PRESENT, RANK, SAME_TYPE, STORAGE_SIZE |
 | Type inquiry intrinsic functions | BIT_SIZE, DIGITS, EPSILON, HUGE, KIND, MAXEXPONENT, MINEXPONENT, NEW_LINE, PRECISION, RADIX, RANGE, TINY|
 | Non-standard intrinsic functions | AND, OR, XOR, SHIFT, ZEXT, IZEXT, COSD, SIND, TAND, ACOSD, ASIND, ATAND, ATAN2D, COMPL, EQV, NEQV, INT8, JINT, JNINT, KNINT, QCMPLX, DREAL, DFLOAT, QEXT, QFLOAT, QREAL, DNUM, NUM, JNUM, KNUM, QNUM, RNUM, RAN, RANF, ILEN, SIZEOF, MCLOCK, SECNDS, COTAN, IBCHNG, ISHA, ISHC, ISHL, IXOR, IARG, IARGC, NARGS, GETPID, NUMARG, BADDRESS, IADDR, CACHESIZE, EOF, FP_CLASS, INT_PTR_KIND, ISNAN, MALLOC |
diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp
index da6d5970089884..20addc9cae3632 100644
--- a/flang/lib/Evaluate/intrinsics.cpp
+++ b/flang/lib/Evaluate/intrinsics.cpp
@@ -529,6 +529,17 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
     {"ieor", {{"i", OperandInt}, {"j", OperandInt, Rank::elementalOrBOZ}},
         OperandInt},
     {"ieor", {{"i", BOZ}, {"j", SameInt}}, SameInt},
+    {"image_index",
+        {{"coarray", AnyData, Rank::coarray}, {"sub", AnyInt, Rank::vector}},
+        DefaultInt, Rank::scalar, IntrinsicClass::transformationalFunction},
+    {"image_index",
+        {{"coarray", AnyData, Rank::coarray}, {"sub", AnyInt, Rank::vector},
+            {"team", TeamType, Rank::scalar}},
+        DefaultInt, Rank::scalar, IntrinsicClass::transformationalFunction},
+    {"image_index",
+        {{"coarray", AnyData, Rank::coarray}, {"sub", AnyInt, Rank::vector},
+            {"team_number", AnyInt, Rank::scalar}},
+        DefaultInt, Rank::scalar, IntrinsicClass::transformationalFunction},
     {"image_status", {{"image", SameInt}, OptionalTEAM}, DefaultInt},
     {"index",
         {{"string", SameCharNoLen}, {"substring", SameCharNoLen},
@@ -930,7 +941,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
 };
 
 // TODO: Coarray intrinsic functions
-//  IMAGE_INDEX, COSHAPE
+//  COSHAPE
 // TODO: Non-standard intrinsic functions
 //  SHIFT,
 //  COMPL, EQV, NEQV, INT8, JINT, JNINT, KNINT,
diff --git a/flang/lib/Semantics/check-call.cpp b/flang/lib/Semantics/check-call.cpp
index c924a817ec7e19..99b9c0426ffbc8 100644
--- a/flang/lib/Semantics/check-call.cpp
+++ b/flang/lib/Semantics/check-call.cpp
@@ -1433,6 +1433,23 @@ static void CheckAssociated(evaluate::ActualArguments &arguments,
   }
 }
 
+// IMAGE_INDEX (F'2023 16.9.107)
+static void CheckImage_Index(evaluate::ActualArguments &arguments,
+    parser::ContextualMessages &messages) {
+  if (arguments[1] && arguments[0]) {
+    if (auto subArrShape{evaluate::GetShape(arguments[1]->UnwrapExpr())}) {
+      if (const auto *coarrayArgSymbol{UnwrapWholeSymbolOrComponentDataRef(
+              arguments[0]->UnwrapExpr())}) {
+        if (evaluate::ToInt64(*subArrShape->front()) !=
+            coarrayArgSymbol->Corank()) {
+          messages.Say(arguments[1]->sourceLocation(),
+              "The size of the 'sub=' argument for intrinsic 'image_index' must be equal to the corank of the 'coarray=' argument"_err_en_US);
+        }
+      }
+    }
+  }
+}
+
 // MOVE_ALLOC (F'2023 16.9.147)
 static void CheckMove_Alloc(evaluate::ActualArguments &arguments,
     parser::ContextualMessages &messages) {
@@ -1678,6 +1695,8 @@ static void CheckSpecificIntrinsic(evaluate::ActualArguments &arguments,
     const evaluate::SpecificIntrinsic &intrinsic) {
   if (intrinsic.name == "associated") {
     CheckAssociated(arguments, context, scope);
+  } else if (intrinsic.name == "image_index") {
+    CheckImage_Index(arguments, context.foldingContext().messages());
   } else if (intrinsic.name == "move_alloc") {
     CheckMove_Alloc(arguments, context.foldingContext().messages());
   } else if (intrinsic.name == "reduce") {
diff --git a/flang/test/Semantics/image_index01.f90 b/flang/test/Semantics/image_index01.f90
new file mode 100644
index 00000000000000..1ed6779c69bdb7
--- /dev/null
+++ b/flang/test/Semantics/image_index01.f90
@@ -0,0 +1,41 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+! Ensure standard-conforming image_index function references are
+! accepted, based on the 16.9.107 section of the Fortran 2023 standard
+
+program image_index_test
+  use iso_fortran_env, only: team_type
+  implicit none
+
+  integer n, array(1), team_num
+  integer scalar_coarray[*], array_coarray(1)[*], coarray_corank3[10, 0:9, 0:*]
+  integer subscripts_corank1(1), subscripts_corank3(3)
+  type(team_type) :: home, league(2)
+
+  !___ standard-conforming statements - IMAGE_INDEX(COARRAY, SUB) ___
+  n = image_index(scalar_coarray, [1])
+  n = image_index(scalar_coarray, subscripts_corank1)
+  n = image_index(array_coarray, [1])
+  n = image_index(array_coarray, subscripts_corank1)
+  n = image_index(coarray=scalar_coarray, sub=subscripts_corank1)
+  n = image_index(coarray_corank3, subscripts_corank3)
+  n = image_index(sub=subscripts_corank1, coarray=scalar_coarray)
+
+  !___ standard-conforming statements - IMAGE_INDEX(COARRAY, SUB, TEAM) ___
+  n = image_index(scalar_coarray, [1], home)
+  n = image_index(scalar_coarray, subscripts_corank1, league(1))
+  n = image_index(array_coarray, [1], home)
+  n = image_index(array_coarray, subscripts_corank1, league(1))
+  n = image_index(coarray_corank3, subscripts_corank3, league(1))
+  n = image_index(coarray=scalar_coarray, sub=subscripts_corank1, team=home)
+  n = image_index(team=home, sub=[1], coarray=scalar_coarray)
+
+  !___ standard-conforming statements - IMAGE_INDEX(COARRAY, SUB, TEAM_NUMBER) ___
+  n = image_index(scalar_coarray, [1], team_num)
+  n = image_index(scalar_coarray, subscripts_corank1, team_number=team_num)
+  n = image_index(array_coarray, [1], team_num)
+  n = image_index(array_coarray, subscripts_corank1, array(1))
+  n = image_index(coarray_corank3, subscripts_corank3, team_num)
+  n = image_index(coarray=scalar_coarray, sub=subscripts_corank1, team_number=team_num)
+  n = image_index(team_number=team_num, sub=[1], coarray=scalar_coarray)
+
+end program image_index_test
diff --git a/flang/test/Semantics/image_index02.f90 b/flang/test/Semantics/image_index02.f90
new file mode 100644
index 00000000000000..4a927e39c630dc
--- /dev/null
+++ b/flang/test/Semantics/image_index02.f90
@@ -0,0 +1,109 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+! Check for semantic errors in image_index() function references
+! based on the 16.9.107 section of the Fortran 2023 standard
+
+program image_index_test
+  use iso_c_binding, only: c_int32_t
+  use iso_fortran_env, only: team_type
+  implicit none
+
+  integer n, array(1), non_coarray, scalar, team_num
+  integer scalar_coarray[*], array_coarray(1)[*], coarray_corank3[10, 0:9, 0:*], repeated_coarray[*]
+  integer subscripts_corank1(1), subscripts_corank3(3), repeated_sub(1), multi_rank_array(3,3)
+  integer, parameter :: const_subscripts_corank1(1) = [1]
+  logical non_integer_array(1)
+  type(team_type) :: home, league(2), wrong_result_type
+
+  !___ non-conforming statements ___
+
+  !ERROR: missing mandatory 'coarray=' argument
+  n = image_index()
+
+  !ERROR: missing mandatory 'sub=' argument
+  n = image_index(scalar_coarray)
+
+  !ERROR: 'sub=' argument has unacceptable rank 2
+  n = image_index(scalar_coarray, multi_rank_array)
+
+  !ERROR: The size of the 'sub=' argument for intrinsic 'image_index' must be equal to the corank of the 'coarray=' argument
+  n = image_index(coarray_corank3, subscripts_corank1, league(1))
+
+  !ERROR: The size of the 'sub=' argument for intrinsic 'image_index' must be equal to the corank of the 'coarray=' argument
+  n = image_index(coarray_corank3, const_subscripts_corank1, league(1))
+
+  !ERROR: The size of the 'sub=' argument for intrinsic 'image_index' must be equal to the corank of the 'coarray=' argument
+  n = image_index(coarray_corank3, [1], league(1))
+
+  !ERROR: The size of the 'sub=' argument for intrinsic 'image_index' must be equal to the corank of the 'coarray=' argument
+  n = image_index(coarray_corank3, [1,2,3,4,5,6])
+
+  !ERROR: missing mandatory 'coarray=' argument
+  n = image_index(sub=[1])
+
+  !ERROR: unknown keyword argument to intrinsic 'image_index'
+  n = image_index(team=home)
+
+  !ERROR: 'coarray=' argument must have corank > 0 for intrinsic 'image_index'
+  n = image_index(non_coarray, [1])
+
+  !ERROR: Actual argument for 'sub=' has bad type 'LOGICAL(4)'
+  n = image_index(array_coarray, [.true.])
+
+  !ERROR: Actual argument for 'sub=' has bad type 'LOGICAL(4)'
+  n = image_index(array_coarray, non_integer_array)
+
+  !ERROR: 'sub=' argument has unacceptable rank 0
+  n = image_index(array_coarray, scalar)
+
+  !ERROR: unknown keyword argument to intrinsic 'image_index'
+  n = image_index(scalar_coarray, subscripts_corank1, team=league)
+
+  !ERROR: unknown keyword argument to intrinsic 'image_index'
+  n = image_index(scalar_coarray, [1], team=team_num)
+
+  !ERROR: too many actual arguments for intrinsic 'image_index'
+  n = image_index(array_coarray, [1], home, team_num)
+
+  !ERROR: too many actual arguments for intrinsic 'image_index'
+  n = image_index(array_coarray, [1], home, team_num)
+
+  !ERROR: unknown keyword argument to intrinsic 'image_index'
+  n = image_index(array_coarray, [1], team=home, team=league(1))
+
+  !ERROR: repeated keyword argument to intrinsic 'image_index'
+  n = image_index(coarray=scalar_coarray, sub=[1], coarray=repeated_coarray)
+
+  !ERROR: keyword argument to intrinsic 'image_index' was supplied positionally by an earlier actual argument
+  n = image_index(scalar_coarray, [1], coarray=repeated_coarray)
+
+  !ERROR: repeated keyword argument to intrinsic 'image_index'
+  n = image_index(scalar_coarray, sub=subscripts_corank1, sub=repeated_sub)
+
+  !ERROR: keyword argument to intrinsic 'image_index' was supplied positionally by an earlier actual argument
+  n = image_index(scalar_coarray, subscripts_corank1, sub=repeated_sub)
+
+  !ERROR: unknown keyword argument to intrinsic 'image_index'
+  n = image_index(scalar_coarray, [1], team_number=array)
+
+  !ERROR: unknown keyword argument to intrinsic 'image_index'
+  n = image_index(scalar_coarray, [1], team_number=home)
+
+  !ERROR: unknown keyword argument to intrinsic 'image_index'
+  n = image_index(array_coarray, [1], team=home, team_number=team_num)
+
+  !ERROR: unknown keyword argument to intrinsic 'image_index'
+  n = image_index(c=scalar_coarray, [1])
+
+  !ERROR: unknown keyword argument to intrinsic 'image_index'
+  n = image_index(scalar_coarray, subscripts=[1])
+
+  !ERROR: unknown keyword argument to intrinsic 'image_index'
+  n = image_index(scalar_coarray, [1], team_num=team_num)
+
+  !ERROR: unknown keyword argument to intrinsic 'image_index'
+  n = image_index(scalar_coarray, [1], teams=home)
+
+  !ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches operand types TYPE(team_type) and INTEGER(4)
+  wrong_result_type = image_index(scalar_coarray, subscripts_corank1)
+
+end program image_index_test

``````````

</details>


https://github.com/llvm/llvm-project/pull/79519


More information about the flang-commits mailing list