@@ -1504,10 +1504,6 @@ OpenACCClause *SemaOpenACCClauseVisitor::VisitReductionClause(
1504
1504
1505
1505
OpenACCClause *SemaOpenACCClauseVisitor::VisitCollapseClause (
1506
1506
SemaOpenACC::OpenACCParsedClause &Clause) {
1507
- // TODO: Remove this check once we implement this for combined constructs.
1508
- if (!isOpenACCComputeDirectiveKind (Clause.getDirectiveKind ()) &&
1509
- Clause.getDirectiveKind () != OpenACCDirectiveKind::Loop)
1510
- return isNotImplemented ();
1511
1507
// Duplicates here are not really sensible. We could possible permit
1512
1508
// multiples if they all had the same value, but there isn't really a good
1513
1509
// reason to do so. Also, this simplifies the suppression of duplicates, in
@@ -1701,6 +1697,7 @@ void SemaOpenACC::AssociatedStmtRAII::SetCollapseInfoBeforeAssociatedStmt(
1701
1697
SemaRef.CollapseInfo .CollapseDepthSatisfied = false ;
1702
1698
SemaRef.CollapseInfo .CurCollapseCount =
1703
1699
cast<ConstantExpr>(LoopCount)->getResultAsAPSInt ();
1700
+ SemaRef.CollapseInfo .DirectiveKind = DirKind;
1704
1701
}
1705
1702
1706
1703
void SemaOpenACC::AssociatedStmtRAII::SetTileInfoBeforeAssociatedStmt (
@@ -2597,7 +2594,8 @@ void SemaOpenACC::ActOnWhileStmt(SourceLocation WhileLoc) {
2597
2594
2598
2595
if (CollapseInfo.CurCollapseCount && *CollapseInfo.CurCollapseCount > 0 ) {
2599
2596
Diag (WhileLoc, diag::err_acc_invalid_in_loop)
2600
- << /* while loop*/ 1 << OpenACCClauseKind::Collapse;
2597
+ << /* while loop*/ 1 << CollapseInfo.DirectiveKind
2598
+ << OpenACCClauseKind::Collapse;
2601
2599
assert (CollapseInfo.ActiveCollapse && " Collapse count without object?" );
2602
2600
Diag (CollapseInfo.ActiveCollapse ->getBeginLoc (),
2603
2601
diag::note_acc_active_clause_here)
@@ -2610,7 +2608,8 @@ void SemaOpenACC::ActOnWhileStmt(SourceLocation WhileLoc) {
2610
2608
2611
2609
if (TileInfo.CurTileCount && *TileInfo.CurTileCount > 0 ) {
2612
2610
Diag (WhileLoc, diag::err_acc_invalid_in_loop)
2613
- << /* while loop*/ 1 << OpenACCClauseKind::Tile;
2611
+ << /* while loop*/ 1 << OpenACCDirectiveKind::Loop
2612
+ << OpenACCClauseKind::Tile;
2614
2613
assert (TileInfo.ActiveTile && " tile count without object?" );
2615
2614
Diag (TileInfo.ActiveTile ->getBeginLoc (), diag::note_acc_active_clause_here)
2616
2615
<< OpenACCClauseKind::Tile;
@@ -2630,7 +2629,8 @@ void SemaOpenACC::ActOnDoStmt(SourceLocation DoLoc) {
2630
2629
2631
2630
if (CollapseInfo.CurCollapseCount && *CollapseInfo.CurCollapseCount > 0 ) {
2632
2631
Diag (DoLoc, diag::err_acc_invalid_in_loop)
2633
- << /* do loop*/ 2 << OpenACCClauseKind::Collapse;
2632
+ << /* do loop*/ 2 << CollapseInfo.DirectiveKind
2633
+ << OpenACCClauseKind::Collapse;
2634
2634
assert (CollapseInfo.ActiveCollapse && " Collapse count without object?" );
2635
2635
Diag (CollapseInfo.ActiveCollapse ->getBeginLoc (),
2636
2636
diag::note_acc_active_clause_here)
@@ -2643,7 +2643,8 @@ void SemaOpenACC::ActOnDoStmt(SourceLocation DoLoc) {
2643
2643
2644
2644
if (TileInfo.CurTileCount && *TileInfo.CurTileCount > 0 ) {
2645
2645
Diag (DoLoc, diag::err_acc_invalid_in_loop)
2646
- << /* do loop*/ 2 << OpenACCClauseKind::Tile;
2646
+ << /* do loop*/ 2 << OpenACCDirectiveKind::Loop
2647
+ << OpenACCClauseKind::Tile;
2647
2648
assert (TileInfo.ActiveTile && " tile count without object?" );
2648
2649
Diag (TileInfo.ActiveTile ->getBeginLoc (), diag::note_acc_active_clause_here)
2649
2650
<< OpenACCClauseKind::Tile;
@@ -2670,7 +2671,8 @@ void SemaOpenACC::ForStmtBeginHelper(SourceLocation ForLoc,
2670
2671
// This checks for more than 1 loop at the current level, the
2671
2672
// 'depth'-satisifed checking manages the 'not zero' case.
2672
2673
if (LoopInfo.CurLevelHasLoopAlready ) {
2673
- Diag (ForLoc, diag::err_acc_clause_multiple_loops) << /* Collapse*/ 0 ;
2674
+ Diag (ForLoc, diag::err_acc_clause_multiple_loops)
2675
+ << CollapseInfo.DirectiveKind << OpenACCClauseKind::Collapse;
2674
2676
assert (CollapseInfo.ActiveCollapse && " No collapse object?" );
2675
2677
Diag (CollapseInfo.ActiveCollapse ->getBeginLoc (),
2676
2678
diag::note_acc_active_clause_here)
@@ -2689,7 +2691,8 @@ void SemaOpenACC::ForStmtBeginHelper(SourceLocation ForLoc,
2689
2691
C.check ();
2690
2692
2691
2693
if (LoopInfo.CurLevelHasLoopAlready ) {
2692
- Diag (ForLoc, diag::err_acc_clause_multiple_loops) << /* Tile*/ 1 ;
2694
+ Diag (ForLoc, diag::err_acc_clause_multiple_loops)
2695
+ << OpenACCDirectiveKind::Loop << OpenACCClauseKind::Tile;
2693
2696
assert (TileInfo.ActiveTile && " No tile object?" );
2694
2697
Diag (TileInfo.ActiveTile ->getBeginLoc (),
2695
2698
diag::note_acc_active_clause_here)
@@ -3192,15 +3195,15 @@ void SemaOpenACC::ActOnForStmtEnd(SourceLocation ForLoc, StmtResult Body) {
3192
3195
3193
3196
if (OtherStmtLoc.isValid () && IsActiveCollapse) {
3194
3197
Diag (OtherStmtLoc, diag::err_acc_intervening_code)
3195
- << OpenACCClauseKind::Collapse;
3198
+ << OpenACCClauseKind::Collapse << CollapseInfo. DirectiveKind ;
3196
3199
Diag (CollapseInfo.ActiveCollapse ->getBeginLoc (),
3197
3200
diag::note_acc_active_clause_here)
3198
3201
<< OpenACCClauseKind::Collapse;
3199
3202
}
3200
3203
3201
3204
if (OtherStmtLoc.isValid () && IsActiveTile) {
3202
3205
Diag (OtherStmtLoc, diag::err_acc_intervening_code)
3203
- << OpenACCClauseKind::Tile;
3206
+ << OpenACCClauseKind::Tile << OpenACCDirectiveKind::Loop ;
3204
3207
Diag (TileInfo.ActiveTile ->getBeginLoc (),
3205
3208
diag::note_acc_active_clause_here)
3206
3209
<< OpenACCClauseKind::Tile;
@@ -3220,15 +3223,17 @@ bool SemaOpenACC::ActOnStartStmtDirective(OpenACCDirectiveKind K,
3220
3223
// ALL constructs are ill-formed if there is an active 'collapse'
3221
3224
if (CollapseInfo.CurCollapseCount && *CollapseInfo.CurCollapseCount > 0 ) {
3222
3225
Diag (StartLoc, diag::err_acc_invalid_in_loop)
3223
- << /* OpenACC Construct*/ 0 << OpenACCClauseKind::Collapse << K;
3226
+ << /* OpenACC Construct*/ 0 << CollapseInfo.DirectiveKind
3227
+ << OpenACCClauseKind::Collapse << K;
3224
3228
assert (CollapseInfo.ActiveCollapse && " Collapse count without object?" );
3225
3229
Diag (CollapseInfo.ActiveCollapse ->getBeginLoc (),
3226
3230
diag::note_acc_active_clause_here)
3227
3231
<< OpenACCClauseKind::Collapse;
3228
3232
}
3229
3233
if (TileInfo.CurTileCount && *TileInfo.CurTileCount > 0 ) {
3230
3234
Diag (StartLoc, diag::err_acc_invalid_in_loop)
3231
- << /* OpenACC Construct*/ 0 << OpenACCClauseKind::Tile << K;
3235
+ << /* OpenACC Construct*/ 0 << OpenACCDirectiveKind::Loop
3236
+ << OpenACCClauseKind::Tile << K;
3232
3237
assert (TileInfo.ActiveTile && " Tile count without object?" );
3233
3238
Diag (TileInfo.ActiveTile ->getBeginLoc (), diag::note_acc_active_clause_here)
3234
3239
<< OpenACCClauseKind::Tile;
0 commit comments