File tree 3 files changed +22
-0
lines changed 3 files changed +22
-0
lines changed Original file line number Diff line number Diff line change @@ -335,6 +335,10 @@ void AccStructureChecker::Enter(const parser::OpenACCCacheConstruct &x) {
335
335
const auto &verbatim = std::get<parser::Verbatim>(x.t );
336
336
PushContextAndClauseSets (verbatim.source , llvm::acc::Directive::ACCD_cache);
337
337
SetContextDirectiveSource (verbatim.source );
338
+ if (loopNestLevel == 0 ) {
339
+ context_.Say (verbatim.source ,
340
+ " The CACHE directive must be inside a loop" _err_en_US);
341
+ }
338
342
}
339
343
void AccStructureChecker::Leave (const parser::OpenACCCacheConstruct &x) {
340
344
dirContext_.pop_back ();
@@ -655,6 +659,14 @@ void AccStructureChecker::Enter(const parser::SeparateModuleSubprogram &) {
655
659
declareSymbols.clear ();
656
660
}
657
661
662
+ void AccStructureChecker::Enter (const parser::DoConstruct &) {
663
+ ++loopNestLevel;
664
+ }
665
+
666
+ void AccStructureChecker::Leave (const parser::DoConstruct &) {
667
+ --loopNestLevel;
668
+ }
669
+
658
670
llvm::StringRef AccStructureChecker::getDirectiveName (
659
671
llvm::acc::Directive directive) {
660
672
return llvm::acc::getOpenACCDirectiveName (directive);
Original file line number Diff line number Diff line change @@ -71,6 +71,8 @@ class AccStructureChecker
71
71
void Enter (const parser::SubroutineSubprogram &);
72
72
void Enter (const parser::FunctionSubprogram &);
73
73
void Enter (const parser::SeparateModuleSubprogram &);
74
+ void Enter (const parser::DoConstruct &);
75
+ void Leave (const parser::DoConstruct &);
74
76
75
77
#define GEN_FLANG_CLAUSE_CHECK_ENTER
76
78
#include " llvm/Frontend/OpenACC/ACC.inc"
@@ -88,6 +90,7 @@ class AccStructureChecker
88
90
llvm::StringRef getDirectiveName (llvm::acc::Directive directive) override ;
89
91
90
92
llvm::SmallDenseSet<Symbol *> declareSymbols;
93
+ unsigned loopNestLevel = 0 ;
91
94
};
92
95
93
96
} // namespace Fortran::semantics
Original file line number Diff line number Diff line change @@ -19,6 +19,8 @@ program openacc_cache_validity
19
19
type (atype), dimension (10 ) :: ta
20
20
real (8 ), dimension (N) :: a
21
21
22
+ do i = 1 , N
23
+
22
24
! $acc cache(a(i))
23
25
! $acc cache(a(1:2,3:4))
24
26
! $acc cache(a)
@@ -40,4 +42,9 @@ program openacc_cache_validity
40
42
! ERROR: Only array element or subarray are allowed in CACHE directive
41
43
! $acc cache(/i/)
42
44
45
+ end do
46
+
47
+ ! ERROR: The CACHE directive must be inside a loop
48
+ ! $acc cache(a)
49
+
43
50
end program openacc_cache_validity
You can’t perform that action at this time.
0 commit comments