write semantics tests for CHANGE TEAM statement.
authorHussain Kadhem <hmk@lbl.gov>
Mon, 20 Mar 2023 17:33:01 +0000 (10:33 -0700)
committerHussain Kadhem <hmk@berkeley.edu>
Mon, 27 Mar 2023 19:53:26 +0000 (12:53 -0700)
Added semantics tests for aspects of CHANGE TEAM statements which are not duplicates from FORM TEAM statements.

Reviewed By: ktras

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

flang/test/Semantics/change_team01.f90 [new file with mode: 0644]
flang/test/Semantics/change_team01b.f90 [new file with mode: 0644]
flang/test/Semantics/change_team01c.f90 [new file with mode: 0644]

diff --git a/flang/test/Semantics/change_team01.f90 b/flang/test/Semantics/change_team01.f90
new file mode 100644 (file)
index 0000000..43be1c1
--- /dev/null
@@ -0,0 +1,70 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+! Check for semantic errors in change team statements.
+! Only those semantics which differ from those of FORM TEAM statements are checked.
+
+subroutine test
+  use, intrinsic :: iso_fortran_env, only: team_type
+  type(team_type) :: team
+  integer, codimension[*] :: selector
+  integer, codimension[2,*] :: selector2d
+
+  ! Valid invocations which should produce no errors.
+  block
+  change team (team)
+  end team
+  construct1: change team (team)
+  end team construct1
+  change team (team, ca[*] => selector)
+  end team
+  change team (team, ca[2,*] => selector)
+  end team
+  change team (team, ca[*] => selector)
+  end team
+  change team (team, ca[*] => selector, ca2[2,*] => selector2d)
+  end team
+  end block
+
+  !A selector may appear only once in selector-list.
+  ! ERROR: Selector 'selector' was already used as a selector or coarray in this statement
+  change team (team, ca[*] => selector, ca2[*] => selector)
+  end team
+
+  ! Within a CHANGE TEAM construct, a CYCLE or EXIT statement is not allowed if it belongs to an outer construct.
+  block
+  outer1: if (.true.) then
+    change team (team)
+      if (.true.) then
+        ! ERROR: EXIT must not leave a CHANGE TEAM statement
+        exit outer1
+      end if
+    end team
+  end if outer1
+  end block
+  block
+  outer2: do
+    change team (team)
+      ! ERROR: CYCLE must not leave a CHANGE TEAM statement
+      cycle outer2
+    end team
+  end do outer2
+  end block
+
+  ! The construct name must not be the same as any other construct name in the scoping unit.
+  block
+  construct2: block
+  end block construct2
+  ! ERROR: 'construct2' is already declared in this scoping unit
+  construct2: change team (team)
+  end team construct2
+  end block
+
+  ! When the CHANGE TEAM statement is executed, the selectors must all be established coarrays.
+  ! ERROR: Selector in coarray association must name a coarray
+  change team (team, ca[*] => not_selector)
+  end team
+
+  ! The coarray name in a coarray-association must not be the same as the name as the name of another coarray or of a selector in the CHANGE TEAM statement.
+  ! ERROR: 'selector' is not an object that can appear in an expression
+  change team (team, selector[*] => selector)
+  end team
+end subroutine
diff --git a/flang/test/Semantics/change_team01b.f90 b/flang/test/Semantics/change_team01b.f90
new file mode 100644 (file)
index 0000000..6435f22
--- /dev/null
@@ -0,0 +1,28 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+! Check for semantic errors in change team statements
+! This subtest contains syntactic tests that prevent the main tests from being emitted.
+
+subroutine test
+  use, intrinsic :: iso_fortran_env, only: team_type
+  type(team_type) :: team
+
+  ! If a construct name appears on the CHANGE TEAM statement of the construct, the same name must also appear on the END TEAM construct.
+  block
+  construct: change team (team)
+  ! ERROR: CHANGE TEAM construct name required but missing
+  end team
+  end block
+  ! If a construct name appears on an END TEAM statement, the same construct name must appear on the corresponding CHANGE TEAM statement.
+  block
+  change team (team)
+  ! ERROR: CHANGE TEAM construct name unexpected
+  end team construct
+  end block
+  block
+  construct1: change team (team)
+  ! ERROR: CHANGE TEAM construct name mismatch
+  end team construct2
+  end block
+end subroutine
+
+
diff --git a/flang/test/Semantics/change_team01c.f90 b/flang/test/Semantics/change_team01c.f90
new file mode 100644 (file)
index 0000000..7ab8e85
--- /dev/null
@@ -0,0 +1,31 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+! XFAIL: *
+! Check for semantic errors in change team statements.
+! This subtest contains tests for unimplemented errors.
+
+subroutine test
+  use, intrinsic :: iso_fortran_env, only: team_type
+  type(team_type) :: team
+  integer, codimension[*] :: selector
+
+  ! A branch to an END TEAM statement is permitted only from within the corresponding CHANGE TEAM construct.
+  change team (team)
+    if (.true.) then
+      end team
+    end if
+  end team
+
+  ! A RETURN statement may not appear in a CHANGE TEAM construct.
+  change team (team)
+    ! ERROR: TBD
+    return
+  end team
+
+  ! On each image, the team variable specified in the CHANGE TEAM statement cannot become undefined or redefined during execution of the construct.
+  ! ERROR: TBD
+  change team (team)
+    team = get_team(INITIAL_TEAM)
+  end team
+end subroutine
+
+