@@ -292,5 +292,175 @@ class OpenACCCombinedConstruct final
292292 return const_cast <OpenACCCombinedConstruct *>(this )->getLoop ();
293293 }
294294};
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+ };
295465} // namespace clang
296466#endif // LLVM_CLANG_AST_STMTOPENACC_H
0 commit comments