@@ -292,5 +292,175 @@ class OpenACCCombinedConstruct final
292
292
return const_cast <OpenACCCombinedConstruct *>(this )->getLoop ();
293
293
}
294
294
};
295
+
296
+ // This class represents a 'data' construct, which has an associated statement
297
+ // and clauses, but is otherwise pretty simple.
298
+ class OpenACCDataConstruct final
299
+ : public OpenACCAssociatedStmtConstruct,
300
+ public llvm::TrailingObjects<OpenACCCombinedConstruct,
301
+ const OpenACCClause *> {
302
+ OpenACCDataConstruct (unsigned NumClauses)
303
+ : OpenACCAssociatedStmtConstruct(
304
+ OpenACCDataConstructClass, OpenACCDirectiveKind::Data,
305
+ SourceLocation{}, SourceLocation{}, SourceLocation{},
306
+ /* AssociatedStmt=*/ nullptr ) {
307
+ std::uninitialized_value_construct (
308
+ getTrailingObjects<const OpenACCClause *>(),
309
+ getTrailingObjects<const OpenACCClause *>() + NumClauses);
310
+ setClauseList (MutableArrayRef (getTrailingObjects<const OpenACCClause *>(),
311
+ NumClauses));
312
+ }
313
+
314
+ OpenACCDataConstruct (SourceLocation Start, SourceLocation DirectiveLoc,
315
+ SourceLocation End,
316
+ ArrayRef<const OpenACCClause *> Clauses,
317
+ Stmt *StructuredBlock)
318
+ : OpenACCAssociatedStmtConstruct(OpenACCDataConstructClass,
319
+ OpenACCDirectiveKind::Data, Start,
320
+ DirectiveLoc, End, StructuredBlock) {
321
+ std::uninitialized_copy (Clauses.begin (), Clauses.end (),
322
+ getTrailingObjects<const OpenACCClause *>());
323
+ setClauseList (MutableArrayRef (getTrailingObjects<const OpenACCClause *>(),
324
+ Clauses.size ()));
325
+ }
326
+ void setStructuredBlock (Stmt *S) { setAssociatedStmt (S); }
327
+
328
+ public:
329
+ static bool classof (const Stmt *T) {
330
+ return T->getStmtClass () == OpenACCDataConstructClass;
331
+ }
332
+
333
+ static OpenACCDataConstruct *CreateEmpty (const ASTContext &C,
334
+ unsigned NumClauses);
335
+ static OpenACCDataConstruct *Create (const ASTContext &C, SourceLocation Start,
336
+ SourceLocation DirectiveLoc,
337
+ SourceLocation End,
338
+ ArrayRef<const OpenACCClause *> Clauses,
339
+ Stmt *StructuredBlock);
340
+ Stmt *getStructuredBlock () { return getAssociatedStmt (); }
341
+ const Stmt *getStructuredBlock () const {
342
+ return const_cast <OpenACCDataConstruct *>(this )->getStructuredBlock ();
343
+ }
344
+ };
345
+ // This class represents a 'enter data' construct, which JUST has clauses.
346
+ class OpenACCEnterDataConstruct final
347
+ : public OpenACCConstructStmt,
348
+ public llvm::TrailingObjects<OpenACCCombinedConstruct,
349
+ const OpenACCClause *> {
350
+ OpenACCEnterDataConstruct (unsigned NumClauses)
351
+ : OpenACCConstructStmt(OpenACCEnterDataConstructClass,
352
+ OpenACCDirectiveKind::EnterData, SourceLocation{},
353
+ SourceLocation{}, SourceLocation{}) {
354
+ std::uninitialized_value_construct (
355
+ getTrailingObjects<const OpenACCClause *>(),
356
+ getTrailingObjects<const OpenACCClause *>() + NumClauses);
357
+ setClauseList (MutableArrayRef (getTrailingObjects<const OpenACCClause *>(),
358
+ NumClauses));
359
+ }
360
+ OpenACCEnterDataConstruct (SourceLocation Start, SourceLocation DirectiveLoc,
361
+ SourceLocation End,
362
+ ArrayRef<const OpenACCClause *> Clauses)
363
+ : OpenACCConstructStmt(OpenACCEnterDataConstructClass,
364
+ OpenACCDirectiveKind::EnterData, Start,
365
+ DirectiveLoc, End) {
366
+ std::uninitialized_copy (Clauses.begin (), Clauses.end (),
367
+ getTrailingObjects<const OpenACCClause *>());
368
+ setClauseList (MutableArrayRef (getTrailingObjects<const OpenACCClause *>(),
369
+ Clauses.size ()));
370
+ }
371
+
372
+ public:
373
+ static bool classof (const Stmt *T) {
374
+ return T->getStmtClass () == OpenACCEnterDataConstructClass;
375
+ }
376
+ static OpenACCEnterDataConstruct *CreateEmpty (const ASTContext &C,
377
+ unsigned NumClauses);
378
+ static OpenACCEnterDataConstruct *
379
+ Create (const ASTContext &C, SourceLocation Start, SourceLocation DirectiveLoc,
380
+ SourceLocation End, ArrayRef<const OpenACCClause *> Clauses);
381
+ };
382
+ // This class represents a 'exit data' construct, which JUST has clauses.
383
+ class OpenACCExitDataConstruct final
384
+ : public OpenACCConstructStmt,
385
+ public llvm::TrailingObjects<OpenACCCombinedConstruct,
386
+ const OpenACCClause *> {
387
+ OpenACCExitDataConstruct (unsigned NumClauses)
388
+ : OpenACCConstructStmt(OpenACCExitDataConstructClass,
389
+ OpenACCDirectiveKind::ExitData, SourceLocation{},
390
+ SourceLocation{}, SourceLocation{}) {
391
+ std::uninitialized_value_construct (
392
+ getTrailingObjects<const OpenACCClause *>(),
393
+ getTrailingObjects<const OpenACCClause *>() + NumClauses);
394
+ setClauseList (MutableArrayRef (getTrailingObjects<const OpenACCClause *>(),
395
+ NumClauses));
396
+ }
397
+ OpenACCExitDataConstruct (SourceLocation Start, SourceLocation DirectiveLoc,
398
+ SourceLocation End,
399
+ ArrayRef<const OpenACCClause *> Clauses)
400
+ : OpenACCConstructStmt(OpenACCExitDataConstructClass,
401
+ OpenACCDirectiveKind::ExitData, Start,
402
+ DirectiveLoc, End) {
403
+ std::uninitialized_copy (Clauses.begin (), Clauses.end (),
404
+ getTrailingObjects<const OpenACCClause *>());
405
+ setClauseList (MutableArrayRef (getTrailingObjects<const OpenACCClause *>(),
406
+ Clauses.size ()));
407
+ }
408
+
409
+ public:
410
+ static bool classof (const Stmt *T) {
411
+ return T->getStmtClass () == OpenACCExitDataConstructClass;
412
+ }
413
+ static OpenACCExitDataConstruct *CreateEmpty (const ASTContext &C,
414
+ unsigned NumClauses);
415
+ static OpenACCExitDataConstruct *
416
+ Create (const ASTContext &C, SourceLocation Start, SourceLocation DirectiveLoc,
417
+ SourceLocation End, ArrayRef<const OpenACCClause *> Clauses);
418
+ };
419
+ // This class represents a 'host_data' construct, which has an associated
420
+ // statement and clauses, but is otherwise pretty simple.
421
+ class OpenACCHostDataConstruct final
422
+ : public OpenACCAssociatedStmtConstruct,
423
+ public llvm::TrailingObjects<OpenACCCombinedConstruct,
424
+ const OpenACCClause *> {
425
+ OpenACCHostDataConstruct (unsigned NumClauses)
426
+ : OpenACCAssociatedStmtConstruct(
427
+ OpenACCHostDataConstructClass, OpenACCDirectiveKind::HostData,
428
+ SourceLocation{}, SourceLocation{}, SourceLocation{},
429
+ /* AssociatedStmt=*/ nullptr ) {
430
+ std::uninitialized_value_construct (
431
+ getTrailingObjects<const OpenACCClause *>(),
432
+ getTrailingObjects<const OpenACCClause *>() + NumClauses);
433
+ setClauseList (MutableArrayRef (getTrailingObjects<const OpenACCClause *>(),
434
+ NumClauses));
435
+ }
436
+ OpenACCHostDataConstruct (SourceLocation Start, SourceLocation DirectiveLoc,
437
+ SourceLocation End,
438
+ ArrayRef<const OpenACCClause *> Clauses,
439
+ Stmt *StructuredBlock)
440
+ : OpenACCAssociatedStmtConstruct(OpenACCHostDataConstructClass,
441
+ OpenACCDirectiveKind::HostData, Start,
442
+ DirectiveLoc, End, StructuredBlock) {
443
+ std::uninitialized_copy (Clauses.begin (), Clauses.end (),
444
+ getTrailingObjects<const OpenACCClause *>());
445
+ setClauseList (MutableArrayRef (getTrailingObjects<const OpenACCClause *>(),
446
+ Clauses.size ()));
447
+ }
448
+ void setStructuredBlock (Stmt *S) { setAssociatedStmt (S); }
449
+
450
+ public:
451
+ static bool classof (const Stmt *T) {
452
+ return T->getStmtClass () == OpenACCHostDataConstructClass;
453
+ }
454
+ static OpenACCHostDataConstruct *CreateEmpty (const ASTContext &C,
455
+ unsigned NumClauses);
456
+ static OpenACCHostDataConstruct *
457
+ Create (const ASTContext &C, SourceLocation Start, SourceLocation DirectiveLoc,
458
+ SourceLocation End, ArrayRef<const OpenACCClause *> Clauses,
459
+ Stmt *StructuredBlock);
460
+ Stmt *getStructuredBlock () { return getAssociatedStmt (); }
461
+ const Stmt *getStructuredBlock () const {
462
+ return const_cast <OpenACCHostDataConstruct *>(this )->getStructuredBlock ();
463
+ }
464
+ };
295
465
} // namespace clang
296
466
#endif // LLVM_CLANG_AST_STMTOPENACC_H
0 commit comments