Skip to content

[flang] Complete semantic checks for FORM TEAM #131022

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 19, 2025
Merged

Conversation

klausler
Copy link
Contributor

Add remaining checking for the FORM TEAM statement, complete and enable a test.

Add remaining checking for the FORM TEAM statement, complete
and enable a test.
@llvmbot llvmbot added flang Flang issues not falling into any other category flang:semantics labels Mar 12, 2025
@llvmbot
Copy link
Member

llvmbot commented Mar 12, 2025

@llvm/pr-subscribers-flang-semantics

Author: Peter Klausler (klausler)

Changes

Add remaining checking for the FORM TEAM statement, complete and enable a test.


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

3 Files Affected:

  • (modified) flang/lib/Semantics/check-coarray.cpp (+14-2)
  • (modified) flang/test/Semantics/form_team01a.f90 (+1-1)
  • (modified) flang/test/Semantics/form_team01b.f90 (+7-10)
diff --git a/flang/lib/Semantics/check-coarray.cpp b/flang/lib/Semantics/check-coarray.cpp
index 833a08899308a..6548e262468c9 100644
--- a/flang/lib/Semantics/check-coarray.cpp
+++ b/flang/lib/Semantics/check-coarray.cpp
@@ -64,11 +64,15 @@ class CriticalBodyEnforce {
 };
 
 template <typename T>
-static void CheckTeamType(SemanticsContext &context, const T &x) {
+static void CheckTeamType(
+    SemanticsContext &context, const T &x, bool mustBeVariable = false) {
   if (const auto *expr{GetExpr(context, x)}) {
     if (!IsTeamType(evaluate::GetDerivedTypeSpec(expr->GetType()))) {
       context.Say(parser::FindSourceLocation(x), // C1114
           "Team value must be of type TEAM_TYPE from module ISO_FORTRAN_ENV"_err_en_US);
+    } else if (mustBeVariable && !IsVariable(*expr)) {
+      context.Say(parser::FindSourceLocation(x),
+          "Team must be a variable in this context"_err_en_US);
     }
   }
 }
@@ -356,7 +360,15 @@ void CoarrayChecker::Leave(const parser::ImageSelector &imageSelector) {
 }
 
 void CoarrayChecker::Leave(const parser::FormTeamStmt &x) {
-  CheckTeamType(context_, std::get<parser::TeamVariable>(x.t));
+  CheckTeamType(
+      context_, std::get<parser::TeamVariable>(x.t), /*mustBeVariable=*/true);
+  for (const auto &spec :
+      std::get<std::list<parser::FormTeamStmt::FormTeamSpec>>(x.t)) {
+    if (const auto *statOrErrmsg{std::get_if<parser::StatOrErrmsg>(&spec.u)}) {
+      CheckCoindexedStatOrErrmsg(
+          context_, *statOrErrmsg, "form-team-spec-list");
+    }
+  }
 }
 
 void CoarrayChecker::Enter(const parser::CriticalConstruct &x) {
diff --git a/flang/test/Semantics/form_team01a.f90 b/flang/test/Semantics/form_team01a.f90
index 4dd60305305a9..2593dc999d05a 100644
--- a/flang/test/Semantics/form_team01a.f90
+++ b/flang/test/Semantics/form_team01a.f90
@@ -1,5 +1,5 @@
 ! RUN: %python %S/test_errors.py %s %flang_fc1
-! Check for semantic errors in form team statements
+! Check for parsing errors in form team statements
 ! This subtest contains syntactic tests that prevent the main tests from being emitted.
 
 subroutine test
diff --git a/flang/test/Semantics/form_team01b.f90 b/flang/test/Semantics/form_team01b.f90
index ba14240c64e69..fd0443ac27165 100644
--- a/flang/test/Semantics/form_team01b.f90
+++ b/flang/test/Semantics/form_team01b.f90
@@ -1,5 +1,4 @@
 ! RUN: %python %S/test_errors.py %s %flang_fc1
-! XFAIL: *
 ! Check for semantic errors in form team statements
 ! This subtest contains tests for unimplemented errors.
 
@@ -7,15 +6,13 @@ subroutine test
   use, intrinsic :: iso_fortran_env, only: team_type
   type(team_type) :: team
   integer :: team_number
-  integer, codimension[*] :: co_statvar
-  character(len=50), codimension[*] :: co_errvar
-
-  ! Semantically invalid invocations.
-  ! argument 'stat' shall not be a coindexed object
-  !ERROR: to be determined
+  integer, save, codimension[*] :: co_statvar
+  character(len=50), save, codimension[*] :: co_errvar
+  procedure(type(team_type)) teamfunc
+  !ERROR: The stat-variable or errmsg-variable in a form-team-spec-list may not be a coindexed object
   FORM TEAM (team_number, team, STAT=co_statvar[this_image()])
-  ! argument 'errmsg' shall not be a coindexed object
-  !ERROR: to be determined
+  !ERROR: The stat-variable or errmsg-variable in a form-team-spec-list may not be a coindexed object
   FORM TEAM (team_number, team, ERRMSG=co_errvar[this_image()])
-
+  !ERROR: Team must be a variable in this context
+  form team (team_number, teamfunc())
 end subroutine

@klausler klausler merged commit 3f04fb4 into llvm:main Mar 19, 2025
14 checks passed
@klausler klausler deleted the fix488 branch March 19, 2025 19:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
flang:semantics flang Flang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants