}
}
+static void CheckTeamStat(
+ SemanticsContext &context, const parser::ImageSelectorSpec::Stat &stat) {
+ const parser::Variable &var{stat.v.thing.thing.value()};
+ if (parser::GetCoindexedNamedObject(var)) {
+ context.Say(parser::FindSourceLocation(var), // C931
+ "Image selector STAT variable must not be a coindexed "
+ "object"_err_en_US);
+ }
+}
+
void CoarrayChecker::Leave(const parser::ChangeTeamStmt &x) {
CheckNamesAreDistinct(std::get<std::list<parser::CoarrayAssociation>>(x.t));
CheckTeamType(context_, std::get<parser::TeamValue>(x.t));
CheckTeamType(context_, std::get<parser::TeamValue>(x.t));
}
-void CoarrayChecker::Leave(const parser::ImageSelectorSpec &x) {
- if (const auto *team{std::get_if<parser::TeamValue>(&x.u)}) {
- CheckTeamType(context_, *team);
+void CoarrayChecker::Leave(const parser::ImageSelector &imageSelector) {
+ haveStat_ = false;
+ haveTeam_ = false;
+ haveTeamNumber_ = false;
+ for (const auto &imageSelectorSpec :
+ std::get<std::list<parser::ImageSelectorSpec>>(imageSelector.t)) {
+ if (const auto *team{
+ std::get_if<parser::TeamValue>(&imageSelectorSpec.u)}) {
+ if (haveTeam_) {
+ context_.Say(parser::FindSourceLocation(imageSelectorSpec), // C929
+ "TEAM value can only be specified once"_err_en_US);
+ }
+ CheckTeamType(context_, *team);
+ haveTeam_ = true;
+ }
+ if (const auto *stat{std::get_if<parser::ImageSelectorSpec::Stat>(
+ &imageSelectorSpec.u)}) {
+ if (haveStat_) {
+ context_.Say(parser::FindSourceLocation(imageSelectorSpec), // C929
+ "STAT variable can only be specified once"_err_en_US);
+ }
+ CheckTeamStat(context_, *stat);
+ haveStat_ = true;
+ }
+ if (std::get_if<parser::ImageSelectorSpec::Team_Number>(
+ &imageSelectorSpec.u)) {
+ if (haveTeamNumber_) {
+ context_.Say(parser::FindSourceLocation(imageSelectorSpec), // C929
+ "TEAM_NUMBER value can only be specified once"_err_en_US);
+ }
+ haveTeamNumber_ = true;
+ }
+ }
+ if (haveTeam_ && haveTeamNumber_) {
+ context_.Say(parser::FindSourceLocation(imageSelector), // C930
+ "Cannot specify both TEAM and TEAM_NUMBER"_err_en_US);
}
}
--- /dev/null
+! RUN: %S/test_errors.sh %s %t %f18
+! C929 No specifier shall appear more than once in a given
+! image-selector-spec-list.
+! C930 TEAM and TEAM_NUMBER shall not both appear in the same
+! image-selector-spec-list.
+! C931 A stat-variable in an image-selector shall not be a coindexed object.
+subroutine s1()
+ use ISO_FORTRAN_ENV
+ type(team_type) :: team1, team2
+ real :: rCoarray[10,20,*]
+ real :: rVar1, rVar2
+ integer :: iVar1, iVar2
+ integer, dimension(4) :: intArray
+ integer :: intScalarCoarray[*]
+ integer :: intCoarray[3, 4, *]
+ intCoVar = 343
+ ! OK
+ rVar1 = rCoarray[1,2,3]
+ !ERROR: 'rcoarray' has corank 3, but coindexed reference has 2 cosubscripts
+ rVar1 = rCoarray[1,2]
+ !ERROR: Must have INTEGER type, but is REAL(4)
+ rVar1 = rCoarray[1,2,3.4]
+ !ERROR: Must be a scalar value, but is a rank-1 array
+ rVar1 = rCoarray[1,intArray,3]
+ ! OK
+ rVar1 = rCoarray[1,2,3,STAT=iVar1, TEAM=team2]
+ !ERROR: Team value must be of type TEAM_TYPE from module ISO_FORTRAN_ENV
+ rVar1 = rCoarray[1,2,3,STAT=iVar1, TEAM=2]
+ ! OK
+ rVar1 = rCoarray[1,2,3,STAT=iVar1, TEAM_NUMBER=38]
+ ! OK
+ rVar1 = rCoarray[1,2,3,STAT=iVar1]
+ ! OK
+ rVar1 = rCoarray[1,2,3,STAT=intArray(2)]
+ !ERROR: Must have INTEGER type, but is REAL(4)
+ rVar1 = rCoarray[1,2,3,STAT=rVar2]
+ !ERROR: Must be a scalar value, but is a rank-1 array
+ rVar1 = rCoarray[1,2,3,STAT=intArray]
+ ! Error on C929, no specifier can appear more than once
+ !ERROR: STAT variable can only be specified once
+ rVar1 = rCoarray[1,2,3,STAT=iVar1, STAT=iVar2]
+ ! OK
+ rVar1 = rCoarray[1,2,3,TEAM=team1]
+ ! Error on C929, no specifier can appear more than once
+ !ERROR: TEAM value can only be specified once
+ rVar1 = rCoarray[1,2,3,TEAM=team1, TEAM=team2]
+ ! OK
+ rVar1 = rCoarray[1,2,3,TEAM_NUMBER=37]
+ ! OK
+ rVar1 = rCoarray[1,2,3,TEAM_NUMBER=iVar1]
+ ! Error, team number is a scalar integer expression
+ !ERROR: Must be a scalar value, but is a rank-1 array
+ rVar1 = rCoarray[1,2,3,TEAM_NUMBER=intArray]
+ ! Error, team number is a scalar integer expression
+ !ERROR: Must have INTEGER type, but is REAL(4)
+ rVar1 = rCoarray[1,2,3,TEAM_NUMBER=3.7]
+ ! Error on C929, no specifier can appear more than once
+ !ERROR: TEAM_NUMBER value can only be specified once
+ rVar1 = rCoarray[1,2,3,TEAM_NUMBER=37, TEAM_NUMBER=37]
+ !ERROR: Cannot specify both TEAM and TEAM_NUMBER
+ rVar1 = rCoarray[1,2,3,TEAM=team1, TEAM_NUMBER=37]
+ !ERROR: Cannot specify both TEAM and TEAM_NUMBER
+ rVar1 = rCoarray[1,2,3,TEAM_number=43, TEAM=team1]
+ ! OK for a STAT variable to be a coarray integer
+ rVar1 = rCoarray[1,2,3,stat=intScalarCoarray]
+ ! Error for a STAT variable to be a coindexed object
+ !ERROR: Image selector STAT variable must not be a coindexed object
+ rVar1 = rCoarray[1,2,3,stat=intCoarray[2,3, 4]]
+end subroutine s1