Skip to content

Commit d412cea

Browse files
authored
[OpenACC] Implement 'tile' attribute AST (#110999)
The 'tile' clause shares quite a bit of the rules with 'collapse', so a followup patch will add those tests/behaviors. This patch deals with adding the AST node. The 'tile' clause takes a series of integer constant expressions, or *. The asterisk is now represented by a new OpenACCAsteriskSizeExpr node, else this clause is very similar to others.
1 parent 66227bf commit d412cea

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+724
-53
lines changed

clang/include/clang/AST/ComputeDependence.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ class ObjCSubscriptRefExpr;
107107
class ObjCIsaExpr;
108108
class ObjCIndirectCopyRestoreExpr;
109109
class ObjCMessageExpr;
110+
class OpenACCAsteriskSizeExpr;
110111

111112
// The following functions are called from constructors of `Expr`, so they
112113
// should not access anything beyond basic
@@ -203,6 +204,7 @@ ExprDependence computeDependence(ObjCSubscriptRefExpr *E);
203204
ExprDependence computeDependence(ObjCIsaExpr *E);
204205
ExprDependence computeDependence(ObjCIndirectCopyRestoreExpr *E);
205206
ExprDependence computeDependence(ObjCMessageExpr *E);
207+
ExprDependence computeDependence(OpenACCAsteriskSizeExpr *E);
206208

207209
} // namespace clang
208210
#endif

clang/include/clang/AST/Expr.h

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2072,6 +2072,41 @@ class PredefinedExpr final
20722072
}
20732073
};
20742074

2075+
/// This expression type represents an asterisk in an OpenACC Size-Expr, used in
2076+
/// the 'tile' and 'gang' clauses. It is of 'int' type, but should not be
2077+
/// evaluated.
2078+
class OpenACCAsteriskSizeExpr final : public Expr {
2079+
friend class ASTStmtReader;
2080+
SourceLocation AsteriskLoc;
2081+
2082+
OpenACCAsteriskSizeExpr(SourceLocation AsteriskLoc, QualType IntTy)
2083+
: Expr(OpenACCAsteriskSizeExprClass, IntTy, VK_PRValue, OK_Ordinary),
2084+
AsteriskLoc(AsteriskLoc) {}
2085+
2086+
void setAsteriskLocation(SourceLocation Loc) { AsteriskLoc = Loc; }
2087+
2088+
public:
2089+
static OpenACCAsteriskSizeExpr *Create(const ASTContext &C,
2090+
SourceLocation Loc);
2091+
static OpenACCAsteriskSizeExpr *CreateEmpty(const ASTContext &C);
2092+
2093+
SourceLocation getBeginLoc() const { return AsteriskLoc; }
2094+
SourceLocation getEndLoc() const { return AsteriskLoc; }
2095+
SourceLocation getLocation() const { return AsteriskLoc; }
2096+
2097+
static bool classof(const Stmt *T) {
2098+
return T->getStmtClass() == OpenACCAsteriskSizeExprClass;
2099+
}
2100+
// Iterators
2101+
child_range children() {
2102+
return child_range(child_iterator(), child_iterator());
2103+
}
2104+
2105+
const_child_range children() const {
2106+
return const_child_range(const_child_iterator(), const_child_iterator());
2107+
}
2108+
};
2109+
20752110
// This represents a use of the __builtin_sycl_unique_stable_name, which takes a
20762111
// type-id, and at CodeGen time emits a unique string representation of the
20772112
// type in a way that permits us to properly encode information about the SYCL

clang/include/clang/AST/JSONNodeDumper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ class JSONNodeDumper
283283

284284
void VisitDeclRefExpr(const DeclRefExpr *DRE);
285285
void VisitSYCLUniqueStableNameExpr(const SYCLUniqueStableNameExpr *E);
286+
void VisitOpenACCAsteriskSizeExpr(const OpenACCAsteriskSizeExpr *E);
286287
void VisitPredefinedExpr(const PredefinedExpr *PE);
287288
void VisitUnaryOperator(const UnaryOperator *UO);
288289
void VisitBinaryOperator(const BinaryOperator *BO);

clang/include/clang/AST/OpenACCClause.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,35 @@ class OpenACCNumGangsClause final
481481
}
482482
};
483483

484+
class OpenACCTileClause final
485+
: public OpenACCClauseWithExprs,
486+
public llvm::TrailingObjects<OpenACCTileClause, Expr *> {
487+
OpenACCTileClause(SourceLocation BeginLoc, SourceLocation LParenLoc,
488+
ArrayRef<Expr *> SizeExprs, SourceLocation EndLoc)
489+
: OpenACCClauseWithExprs(OpenACCClauseKind::Tile, BeginLoc, LParenLoc,
490+
EndLoc) {
491+
std::uninitialized_copy(SizeExprs.begin(), SizeExprs.end(),
492+
getTrailingObjects<Expr *>());
493+
setExprs(MutableArrayRef(getTrailingObjects<Expr *>(), SizeExprs.size()));
494+
}
495+
496+
public:
497+
static bool classof(const OpenACCClause *C) {
498+
return C->getClauseKind() == OpenACCClauseKind::Tile;
499+
}
500+
static OpenACCTileClause *Create(const ASTContext &C, SourceLocation BeginLoc,
501+
SourceLocation LParenLoc,
502+
ArrayRef<Expr *> SizeExprs,
503+
SourceLocation EndLoc);
504+
llvm::ArrayRef<Expr *> getSizeExprs() {
505+
return OpenACCClauseWithExprs::getExprs();
506+
}
507+
508+
llvm::ArrayRef<Expr *> getSizeExprs() const {
509+
return OpenACCClauseWithExprs::getExprs();
510+
}
511+
};
512+
484513
/// Represents one of a handful of clauses that have a single integer
485514
/// expression.
486515
class OpenACCClauseWithSingleIntExpr : public OpenACCClauseWithExprs {

clang/include/clang/AST/RecursiveASTVisitor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2867,6 +2867,7 @@ DEF_TRAVERSE_STMT(ParenListExpr, {})
28672867
DEF_TRAVERSE_STMT(SYCLUniqueStableNameExpr, {
28682868
TRY_TO(TraverseTypeLoc(S->getTypeSourceInfo()->getTypeLoc()));
28692869
})
2870+
DEF_TRAVERSE_STMT(OpenACCAsteriskSizeExpr, {})
28702871
DEF_TRAVERSE_STMT(PredefinedExpr, {})
28712872
DEF_TRAVERSE_STMT(ShuffleVectorExpr, {})
28722873
DEF_TRAVERSE_STMT(ConvertVectorExpr, {})

clang/include/clang/AST/TextNodeDumper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,7 @@ class TextNodeDumper
410410
void VisitHLSLOutArgExpr(const HLSLOutArgExpr *E);
411411
void VisitOpenACCConstructStmt(const OpenACCConstructStmt *S);
412412
void VisitOpenACCLoopConstruct(const OpenACCLoopConstruct *S);
413+
void VisitOpenACCAsteriskSizeExpr(const OpenACCAsteriskSizeExpr *S);
413414
void VisitEmbedExpr(const EmbedExpr *S);
414415
void VisitAtomicExpr(const AtomicExpr *AE);
415416
};

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12666,6 +12666,10 @@ def err_acc_loop_spec_conflict
1266612666
def err_acc_collapse_loop_count
1266712667
: Error<"OpenACC 'collapse' clause loop count must be a %select{constant "
1266812668
"expression|positive integer value, evaluated to %1}0">;
12669+
def err_acc_size_expr_value
12670+
: Error<
12671+
"OpenACC 'tile' clause size expression must be %select{an asterisk "
12672+
"or a constant expression|positive integer value, evaluated to %1}0">;
1266912673
def err_acc_invalid_in_collapse_loop
1267012674
: Error<"%select{OpenACC '%1' construct|while loop|do loop}0 cannot appear "
1267112675
"in intervening code of a 'loop' with a 'collapse' clause">;

clang/include/clang/Basic/OpenACCClauses.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ VISIT_CLAUSE(Private)
5252
VISIT_CLAUSE(Reduction)
5353
VISIT_CLAUSE(Self)
5454
VISIT_CLAUSE(Seq)
55+
VISIT_CLAUSE(Tile)
5556
VISIT_CLAUSE(VectorLength)
5657
VISIT_CLAUSE(Wait)
5758

clang/include/clang/Basic/StmtNodes.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,5 +308,8 @@ def OpenACCAssociatedStmtConstruct
308308
def OpenACCComputeConstruct : StmtNode<OpenACCAssociatedStmtConstruct>;
309309
def OpenACCLoopConstruct : StmtNode<OpenACCAssociatedStmtConstruct>;
310310

311+
// OpenACC Additional Expressions.
312+
def OpenACCAsteriskSizeExpr : StmtNode<Expr>;
313+
311314
// HLSL Constructs.
312315
def HLSLOutArgExpr : StmtNode<Expr>;

clang/include/clang/Parse/Parser.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3786,10 +3786,13 @@ class Parser : public CodeCompletionHandler {
37863786
OpenACCIntExprParseResult ParseOpenACCAsyncArgument(OpenACCDirectiveKind DK,
37873787
OpenACCClauseKind CK,
37883788
SourceLocation Loc);
3789+
37893790
/// Parses the 'size-expr', which is an integral value, or an asterisk.
3790-
bool ParseOpenACCSizeExpr();
3791+
/// Asterisk is represented by a OpenACCAsteriskSizeExpr
3792+
ExprResult ParseOpenACCSizeExpr(OpenACCClauseKind CK);
37913793
/// Parses a comma delimited list of 'size-expr's.
3792-
bool ParseOpenACCSizeExprList();
3794+
bool ParseOpenACCSizeExprList(OpenACCClauseKind CK,
3795+
llvm::SmallVectorImpl<Expr *> &SizeExprs);
37933796
/// Parses a 'gang-arg-list', used for the 'gang' clause.
37943797
bool ParseOpenACCGangArgList(SourceLocation GangLoc);
37953798
/// Parses a 'gang-arg', used for the 'gang' clause.

clang/include/clang/Sema/SemaOpenACC.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ class SemaOpenACC : public SemaBase {
179179
assert((ClauseKind == OpenACCClauseKind::NumGangs ||
180180
ClauseKind == OpenACCClauseKind::NumWorkers ||
181181
ClauseKind == OpenACCClauseKind::Async ||
182+
ClauseKind == OpenACCClauseKind::Tile ||
182183
ClauseKind == OpenACCClauseKind::VectorLength) &&
183184
"Parsed clause kind does not have a int exprs");
184185

@@ -224,6 +225,7 @@ class SemaOpenACC : public SemaBase {
224225
assert((ClauseKind == OpenACCClauseKind::NumGangs ||
225226
ClauseKind == OpenACCClauseKind::NumWorkers ||
226227
ClauseKind == OpenACCClauseKind::Async ||
228+
ClauseKind == OpenACCClauseKind::Tile ||
227229
ClauseKind == OpenACCClauseKind::VectorLength) &&
228230
"Parsed clause kind does not have a int exprs");
229231

@@ -335,6 +337,7 @@ class SemaOpenACC : public SemaBase {
335337
assert((ClauseKind == OpenACCClauseKind::NumGangs ||
336338
ClauseKind == OpenACCClauseKind::NumWorkers ||
337339
ClauseKind == OpenACCClauseKind::Async ||
340+
ClauseKind == OpenACCClauseKind::Tile ||
338341
ClauseKind == OpenACCClauseKind::VectorLength) &&
339342
"Parsed clause kind does not have a int exprs");
340343
Details = IntExprDetails{{IntExprs.begin(), IntExprs.end()}};
@@ -343,6 +346,7 @@ class SemaOpenACC : public SemaBase {
343346
assert((ClauseKind == OpenACCClauseKind::NumGangs ||
344347
ClauseKind == OpenACCClauseKind::NumWorkers ||
345348
ClauseKind == OpenACCClauseKind::Async ||
349+
ClauseKind == OpenACCClauseKind::Tile ||
346350
ClauseKind == OpenACCClauseKind::VectorLength) &&
347351
"Parsed clause kind does not have a int exprs");
348352
Details = IntExprDetails{std::move(IntExprs)};
@@ -522,6 +526,12 @@ class SemaOpenACC : public SemaBase {
522526
SourceLocation RBLoc);
523527
/// Checks the loop depth value for a collapse clause.
524528
ExprResult CheckCollapseLoopCount(Expr *LoopCount);
529+
/// Checks a single size expr for a tile clause. 'gang' could possibly call
530+
/// this, but has slightly stricter rules as to valid values.
531+
ExprResult CheckTileSizeExpr(Expr *SizeExpr);
532+
533+
ExprResult BuildOpenACCAsteriskSizeExpr(SourceLocation AsteriskLoc);
534+
ExprResult ActOnOpenACCAsteriskSizeExpr(SourceLocation AsteriskLoc);
525535

526536
/// Helper type to restore the state of various 'loop' constructs when we run
527537
/// into a loop (for, etc) inside the construct.

clang/include/clang/Serialization/ASTBitCodes.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2002,12 +2002,14 @@ enum StmtCode {
20022002
// SYCLUniqueStableNameExpr
20032003
EXPR_SYCL_UNIQUE_STABLE_NAME,
20042004

2005-
// OpenACC Constructs
2005+
// OpenACC Constructs/Exprs
20062006
STMT_OPENACC_COMPUTE_CONSTRUCT,
20072007
STMT_OPENACC_LOOP_CONSTRUCT,
2008+
EXPR_OPENACC_ASTERISK_SIZE,
20082009

20092010
// HLSL Constructs
20102011
EXPR_HLSL_OUT_ARG,
2012+
20112013
};
20122014

20132015
/// The kinds of designators that can occur in a

clang/lib/AST/ComputeDependence.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -958,3 +958,9 @@ ExprDependence clang::computeDependence(ObjCMessageExpr *E) {
958958
D |= A->getDependence();
959959
return D;
960960
}
961+
962+
ExprDependence clang::computeDependence(OpenACCAsteriskSizeExpr *E) {
963+
// This represents a simple asterisk as typed, so cannot be dependent in any
964+
// way.
965+
return ExprDependence::None;
966+
}

clang/lib/AST/Expr.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3640,6 +3640,7 @@ bool Expr::HasSideEffects(const ASTContext &Ctx,
36403640
case SYCLUniqueStableNameExprClass:
36413641
case PackIndexingExprClass:
36423642
case HLSLOutArgExprClass:
3643+
case OpenACCAsteriskSizeExprClass:
36433644
// These never have a side-effect.
36443645
return false;
36453646

@@ -5408,3 +5409,13 @@ HLSLOutArgExpr *HLSLOutArgExpr::Create(const ASTContext &C, QualType Ty,
54085409
HLSLOutArgExpr *HLSLOutArgExpr::CreateEmpty(const ASTContext &C) {
54095410
return new (C) HLSLOutArgExpr(EmptyShell());
54105411
}
5412+
5413+
OpenACCAsteriskSizeExpr *OpenACCAsteriskSizeExpr::Create(const ASTContext &C,
5414+
SourceLocation Loc) {
5415+
return new (C) OpenACCAsteriskSizeExpr(Loc, C.IntTy);
5416+
}
5417+
5418+
OpenACCAsteriskSizeExpr *
5419+
OpenACCAsteriskSizeExpr::CreateEmpty(const ASTContext &C) {
5420+
return new (C) OpenACCAsteriskSizeExpr({}, C.IntTy);
5421+
}

clang/lib/AST/ExprClassification.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,7 @@ static Cl::Kinds ClassifyInternal(ASTContext &Ctx, const Expr *E) {
471471
case Expr::CoyieldExprClass:
472472
return ClassifyInternal(Ctx, cast<CoroutineSuspendExpr>(E)->getResumeExpr());
473473
case Expr::SYCLUniqueStableNameExprClass:
474+
case Expr::OpenACCAsteriskSizeExprClass:
474475
return Cl::CL_PRValue;
475476
break;
476477

clang/lib/AST/ExprConstant.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11873,6 +11873,13 @@ class IntExprEvaluator
1187311873
return Success(E->getValue(), E);
1187411874
}
1187511875

11876+
bool VisitOpenACCAsteriskSizeExpr(const OpenACCAsteriskSizeExpr *E) {
11877+
// This should not be evaluated during constant expr evaluation, as it
11878+
// should always be in an unevaluated context (the args list of a 'gang' or
11879+
// 'tile' clause).
11880+
return Error(E);
11881+
}
11882+
1187611883
bool VisitUnaryReal(const UnaryOperator *E);
1187711884
bool VisitUnaryImag(const UnaryOperator *E);
1187811885

@@ -16908,6 +16915,7 @@ static ICEDiag CheckICE(const Expr* E, const ASTContext &Ctx) {
1690816915
case Expr::GNUNullExprClass:
1690916916
case Expr::SourceLocExprClass:
1691016917
case Expr::EmbedExprClass:
16918+
case Expr::OpenACCAsteriskSizeExprClass:
1691116919
return NoDiag();
1691216920

1691316921
case Expr::PackIndexingExprClass:

clang/lib/AST/ItaniumMangle.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5745,6 +5745,15 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
57455745
case Expr::HLSLOutArgExprClass:
57465746
llvm_unreachable(
57475747
"cannot mangle hlsl temporary value; mangling wrong thing?");
5748+
case Expr::OpenACCAsteriskSizeExprClass: {
5749+
// We shouldn't ever be able to get here, but diagnose anyway.
5750+
DiagnosticsEngine &Diags = Context.getDiags();
5751+
unsigned DiagID = Diags.getCustomDiagID(
5752+
DiagnosticsEngine::Error,
5753+
"cannot yet mangle OpenACC Asterisk Size expression");
5754+
Diags.Report(DiagID);
5755+
return;
5756+
}
57485757
}
57495758

57505759
if (AsTemplateArg && !IsPrimaryExpr)

clang/lib/AST/JSONNodeDumper.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1354,6 +1354,9 @@ void JSONNodeDumper::VisitSYCLUniqueStableNameExpr(
13541354
createQualType(E->getTypeSourceInfo()->getType()));
13551355
}
13561356

1357+
void JSONNodeDumper::VisitOpenACCAsteriskSizeExpr(
1358+
const OpenACCAsteriskSizeExpr *E) {}
1359+
13571360
void JSONNodeDumper::VisitPredefinedExpr(const PredefinedExpr *PE) {
13581361
JOS.attribute("name", PredefinedExpr::getIdentKindName(PE->getIdentKind()));
13591362
}

clang/lib/AST/OpenACCClause.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ bool OpenACCClauseWithParams::classof(const OpenACCClause *C) {
2424
}
2525
bool OpenACCClauseWithExprs::classof(const OpenACCClause *C) {
2626
return OpenACCWaitClause::classof(C) || OpenACCNumGangsClause::classof(C) ||
27+
OpenACCTileClause::classof(C) ||
2728
OpenACCClauseWithSingleIntExpr::classof(C) ||
2829
OpenACCClauseWithVarList::classof(C);
2930
}
@@ -221,6 +222,16 @@ OpenACCNumGangsClause *OpenACCNumGangsClause::Create(const ASTContext &C,
221222
return new (Mem) OpenACCNumGangsClause(BeginLoc, LParenLoc, IntExprs, EndLoc);
222223
}
223224

225+
OpenACCTileClause *OpenACCTileClause::Create(const ASTContext &C,
226+
SourceLocation BeginLoc,
227+
SourceLocation LParenLoc,
228+
ArrayRef<Expr *> SizeExprs,
229+
SourceLocation EndLoc) {
230+
void *Mem =
231+
C.Allocate(OpenACCTileClause::totalSizeToAlloc<Expr *>(SizeExprs.size()));
232+
return new (Mem) OpenACCTileClause(BeginLoc, LParenLoc, SizeExprs, EndLoc);
233+
}
234+
224235
OpenACCPrivateClause *OpenACCPrivateClause::Create(const ASTContext &C,
225236
SourceLocation BeginLoc,
226237
SourceLocation LParenLoc,
@@ -420,6 +431,13 @@ void OpenACCClausePrinter::VisitNumGangsClause(const OpenACCNumGangsClause &C) {
420431
OS << ")";
421432
}
422433

434+
void OpenACCClausePrinter::VisitTileClause(const OpenACCTileClause &C) {
435+
OS << "tile(";
436+
llvm::interleaveComma(C.getSizeExprs(), OS,
437+
[&](const Expr *E) { printExpr(E); });
438+
OS << ")";
439+
}
440+
423441
void OpenACCClausePrinter::VisitNumWorkersClause(
424442
const OpenACCNumWorkersClause &C) {
425443
OS << "num_workers(";

clang/lib/AST/StmtPrinter.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1309,6 +1309,10 @@ void StmtPrinter::VisitPredefinedExpr(PredefinedExpr *Node) {
13091309
OS << PredefinedExpr::getIdentKindName(Node->getIdentKind());
13101310
}
13111311

1312+
void StmtPrinter::VisitOpenACCAsteriskSizeExpr(OpenACCAsteriskSizeExpr *Node) {
1313+
OS << '*';
1314+
}
1315+
13121316
void StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) {
13131317
CharacterLiteral::print(Node->getValue(), Node->getKind(), OS);
13141318
}

clang/lib/AST/StmtProfile.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1360,6 +1360,11 @@ void StmtProfiler::VisitPredefinedExpr(const PredefinedExpr *S) {
13601360
ID.AddInteger(llvm::to_underlying(S->getIdentKind()));
13611361
}
13621362

1363+
void StmtProfiler::VisitOpenACCAsteriskSizeExpr(
1364+
const OpenACCAsteriskSizeExpr *S) {
1365+
VisitExpr(S);
1366+
}
1367+
13631368
void StmtProfiler::VisitIntegerLiteral(const IntegerLiteral *S) {
13641369
VisitExpr(S);
13651370
S->getValue().Profile(ID);
@@ -2552,6 +2557,11 @@ void OpenACCClauseProfiler::VisitNumGangsClause(
25522557
Profiler.VisitStmt(E);
25532558
}
25542559

2560+
void OpenACCClauseProfiler::VisitTileClause(const OpenACCTileClause &Clause) {
2561+
for (auto *E : Clause.getSizeExprs())
2562+
Profiler.VisitStmt(E);
2563+
}
2564+
25552565
void OpenACCClauseProfiler::VisitNumWorkersClause(
25562566
const OpenACCNumWorkersClause &Clause) {
25572567
assert(Clause.hasIntExpr() && "num_workers clause requires a valid int expr");

0 commit comments

Comments
 (0)