Skip to content

Commit b096b8b

Browse files
authored
[flang][openacc] Warn only when the same variable is in the same declare (llvm#70698)
A var may appear at most once in all the clauses of declare directives for a function, subroutine, program, or module. We raise an error when a var appears in two different clauses. If it is in the same clauses, we just issue a warning.
1 parent 33b6fe1 commit b096b8b

File tree

3 files changed

+27
-11
lines changed

3 files changed

+27
-11
lines changed

flang/lib/Semantics/check-acc-structure.cpp

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -401,14 +401,27 @@ void AccStructureChecker::CheckMultipleOccurrenceInDeclare(
401401
[&](const Fortran::parser::Designator &designator) {
402402
if (const auto *name = getDesignatorNameIfDataRef(designator)) {
403403
if (declareSymbols.contains(&name->symbol->GetUltimate())) {
404-
context_.Say(GetContext().clauseSource,
405-
"'%s' in the %s clause is already present in another "
406-
"clause in this module"_err_en_US,
407-
name->symbol->name(),
408-
parser::ToUpperCaseLetters(
409-
llvm::acc::getOpenACCClauseName(clause).str()));
404+
if (declareSymbols[&name->symbol->GetUltimate()] == clause) {
405+
context_.Say(GetContext().clauseSource,
406+
"'%s' in the %s clause is already present in the same "
407+
"clause in this module"_warn_en_US,
408+
name->symbol->name(),
409+
parser::ToUpperCaseLetters(
410+
llvm::acc::getOpenACCClauseName(clause).str()));
411+
} else {
412+
context_.Say(GetContext().clauseSource,
413+
"'%s' in the %s clause is already present in another "
414+
"%s clause in this module"_err_en_US,
415+
name->symbol->name(),
416+
parser::ToUpperCaseLetters(
417+
llvm::acc::getOpenACCClauseName(clause).str()),
418+
parser::ToUpperCaseLetters(
419+
llvm::acc::getOpenACCClauseName(
420+
declareSymbols[&name->symbol->GetUltimate()])
421+
.str()));
422+
}
410423
}
411-
declareSymbols.insert(&name->symbol->GetUltimate());
424+
declareSymbols.insert({&name->symbol->GetUltimate(), clause});
412425
}
413426
},
414427
[&](const Fortran::parser::Name &name) {

flang/lib/Semantics/check-acc-structure.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
#include "flang/Common/enum-set.h"
1919
#include "flang/Parser/parse-tree.h"
2020
#include "flang/Semantics/semantics.h"
21-
#include "llvm/ADT/DenseSet.h"
21+
#include "llvm/ADT/DenseMap.h"
2222
#include "llvm/Frontend/OpenACC/ACC.h.inc"
2323

2424
using AccDirectiveSet = Fortran::common::EnumSet<llvm::acc::Directive,
@@ -91,7 +91,7 @@ class AccStructureChecker
9191
llvm::StringRef getClauseName(llvm::acc::Clause clause) override;
9292
llvm::StringRef getDirectiveName(llvm::acc::Directive directive) override;
9393

94-
llvm::SmallDenseSet<Symbol *> declareSymbols;
94+
llvm::SmallDenseMap<Symbol *, llvm::acc::Clause> declareSymbols;
9595
unsigned loopNestLevel = 0;
9696
};
9797

flang/test/Semantics/OpenACC/acc-declare-validity.f90

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ module openacc_declare_validity
1414

1515
!$acc declare create(aa, bb)
1616

17-
!ERROR: 'aa' in the CREATE clause is already present in another clause in this module
17+
!WARNING: 'aa' in the CREATE clause is already present in the same clause in this module
1818
!$acc declare create(aa)
1919

2020
!$acc declare link(ab)
@@ -36,13 +36,16 @@ module openacc_declare_validity
3636
!ERROR: The ZERO modifier is not allowed for the CREATE clause on the DECLARE directive
3737
!$acc declare create(zero: dd)
3838

39+
!ERROR: 'bb' in the COPYIN clause is already present in another CREATE clause in this module
40+
!$acc declare copyin(bb)
41+
3942
contains
4043

4144
subroutine sub1(cc, dd)
4245
real(8) :: cc(:)
4346
real(8) :: dd(:)
4447
!$acc declare present(cc, dd)
45-
!ERROR: 'cc' in the CREATE clause is already present in another clause in this module
48+
!ERROR: 'cc' in the CREATE clause is already present in another PRESENT clause in this module
4649
!$acc declare create(cc)
4750
end subroutine sub1
4851

0 commit comments

Comments
 (0)