r202360 - [OPENMP] First changes for Parsing and Sema for 'omp simd' directive support

Aaron Ballman aaron at aaronballman.com
Thu Feb 27 06:21:39 PST 2014


On Thu, Feb 27, 2014 at 3:29 AM, Alexey Bataev <a.bataev at hotmail.com> wrote:
> Author: abataev
> Date: Thu Feb 27 02:29:12 2014
> New Revision: 202360
>
> URL: http://llvm.org/viewvc/llvm-project?rev=202360&view=rev
> Log:
> [OPENMP] First changes for Parsing and Sema for 'omp simd' directive support
>
> Added:
>     cfe/trunk/test/OpenMP/simd_ast_print.cpp   (with props)
>     cfe/trunk/test/OpenMP/simd_misc_messages.c   (with props)
> Modified:
>     cfe/trunk/include/clang-c/Index.h
>     cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h
>     cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>     cfe/trunk/include/clang/AST/StmtOpenMP.h
>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>     cfe/trunk/include/clang/Basic/OpenMPKinds.def
>     cfe/trunk/include/clang/Basic/StmtNodes.td
>     cfe/trunk/include/clang/Sema/Sema.h
>     cfe/trunk/include/clang/Serialization/ASTBitCodes.h
>     cfe/trunk/lib/AST/Stmt.cpp
>     cfe/trunk/lib/AST/StmtPrinter.cpp
>     cfe/trunk/lib/AST/StmtProfile.cpp
>     cfe/trunk/lib/Basic/OpenMPKinds.cpp
>     cfe/trunk/lib/CodeGen/CGStmt.cpp
>     cfe/trunk/lib/Parse/ParseOpenMP.cpp
>     cfe/trunk/lib/Sema/SemaOpenMP.cpp
>     cfe/trunk/lib/Sema/TreeTransform.h
>     cfe/trunk/lib/Serialization/ASTReaderStmt.cpp
>     cfe/trunk/lib/Serialization/ASTWriterStmt.cpp
>     cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
>     cfe/trunk/tools/libclang/CIndex.cpp
>     cfe/trunk/tools/libclang/CXCursor.cpp
>
> Modified: cfe/trunk/include/clang-c/Index.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=202360&r1=202359&r2=202360&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang-c/Index.h (original)
> +++ cfe/trunk/include/clang-c/Index.h Thu Feb 27 02:29:12 2014
> @@ -2135,7 +2135,11 @@ enum CXCursorKind {
>     */
>    CXCursor_OMPParallelDirective          = 232,
>
> -  CXCursor_LastStmt                      = CXCursor_OMPParallelDirective,
> +  /** \brief OpenMP simd directive.
> +   */
> +  CXCursor_OMPSimdDirective              = 233,
> +
> +  CXCursor_LastStmt                      = CXCursor_OMPSimdDirective,
>
>    /**
>     * \brief Cursor that represents the translation unit itself.
>
> Modified: cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h?rev=202360&r1=202359&r2=202360&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h (original)
> +++ cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h Thu Feb 27 02:29:12 2014
> @@ -424,6 +424,7 @@ private:
>    bool TraverseFunctionHelper(FunctionDecl *D);
>    bool TraverseVarHelper(VarDecl *D);
>    bool TraverseOMPClause(OMPClause *C);
> +  bool TraverseOMPExecutableDirective(OMPExecutableDirective *S);
>  #define OPENMP_CLAUSE(Name, Class)                                      \
>    bool Visit##Class(Class *C);
>  #include "clang/Basic/OpenMPKinds.def"
> @@ -2331,11 +2332,22 @@ DEF_TRAVERSE_STMT(ObjCDictionaryLiteral,
>  DEF_TRAVERSE_STMT(AsTypeExpr, { })
>
>  // OpenMP directives.
> -DEF_TRAVERSE_STMT(OMPParallelDirective, {
> +template<typename Derived>
> +bool DataRecursiveASTVisitor<Derived>::TraverseOMPExecutableDirective(
> +                                               OMPExecutableDirective *S) {
>    ArrayRef<OMPClause *> Clauses = S->clauses();
>    for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
>         I != E; ++I)
>      if (!TraverseOMPClause(*I)) return false;
> +  return true;
> +}
> +
> +DEF_TRAVERSE_STMT(OMPParallelDirective, {
> +  if (!TraverseOMPExecutableDirective(S)) return false;
> +})
> +
> +DEF_TRAVERSE_STMT(OMPSimdDirective, {
> +  if (!TraverseOMPExecutableDirective(S)) return false;
>  })
>
>  // OpenMP clauses.
>
> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=202360&r1=202359&r2=202360&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Thu Feb 27 02:29:12 2014
> @@ -441,6 +441,7 @@ private:
>    bool TraverseFunctionHelper(FunctionDecl *D);
>    bool TraverseVarHelper(VarDecl *D);
>    bool TraverseOMPClause(OMPClause *C);
> +  bool TraverseOMPExecutableDirective(OMPExecutableDirective *S);
>  #define OPENMP_CLAUSE(Name, Class)                                      \
>    bool Visit##Class(Class *C);
>  #include "clang/Basic/OpenMPKinds.def"
> @@ -2355,11 +2356,22 @@ DEF_TRAVERSE_STMT(ObjCDictionaryLiteral,
>  DEF_TRAVERSE_STMT(AsTypeExpr, { })
>
>  // OpenMP directives.
> -DEF_TRAVERSE_STMT(OMPParallelDirective, {
> +template<typename Derived>
> +bool RecursiveASTVisitor<Derived>::TraverseOMPExecutableDirective(
> +                                           OMPExecutableDirective *S) {
>    ArrayRef<OMPClause *> Clauses = S->clauses();
>    for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
>         I != E; ++I)
>      if (!TraverseOMPClause(*I)) return false;
> +  return true;
> +}
> +
> +DEF_TRAVERSE_STMT(OMPParallelDirective, {
> +  if (!TraverseOMPExecutableDirective(S)) return false;
> +})
> +
> +DEF_TRAVERSE_STMT(OMPSimdDirective, {
> +  if (!TraverseOMPExecutableDirective(S)) return false;
>  })
>
>  // OpenMP clauses.
>
> Modified: cfe/trunk/include/clang/AST/StmtOpenMP.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/StmtOpenMP.h?rev=202360&r1=202359&r2=202360&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/StmtOpenMP.h (original)
> +++ cfe/trunk/include/clang/AST/StmtOpenMP.h Thu Feb 27 02:29:12 2014
> @@ -140,17 +140,18 @@ class OMPParallelDirective : public OMPE
>    /// \param EndLoc Ending Location of the directive.
>    ///
>    OMPParallelDirective(SourceLocation StartLoc, SourceLocation EndLoc,
> -                       unsigned N)
> +                       unsigned NumClauses)
>        : OMPExecutableDirective(this, OMPParallelDirectiveClass, OMPD_parallel,
> -                               StartLoc, EndLoc, N, 1) {}
> +                               StartLoc, EndLoc, NumClauses, 1) {}
>
>    /// \brief Build an empty directive.
>    ///
> -  /// \param N Number of clauses.
> +  /// \param NumClauses Number of clauses.
>    ///
> -  explicit OMPParallelDirective(unsigned N)
> +  explicit OMPParallelDirective(unsigned NumClauses)
>        : OMPExecutableDirective(this, OMPParallelDirectiveClass, OMPD_parallel,
> -                               SourceLocation(), SourceLocation(), N, 1) {}
> +                               SourceLocation(), SourceLocation(),
> +                               NumClauses, 1) {}
>
>  public:
>    /// \brief Creates directive with a list of \a Clauses.
> @@ -168,9 +169,10 @@ public:
>    /// \brief Creates an empty directive with the place for \a N clauses.
>    ///
>    /// \param C AST context.
> -  /// \param N The number of clauses.
> +  /// \param NumClauses Number of clauses.
>    ///
> -  static OMPParallelDirective *CreateEmpty(const ASTContext &C, unsigned N,
> +  static OMPParallelDirective *CreateEmpty(const ASTContext &C,
> +                                           unsigned NumClauses,
>                                             EmptyShell);
>
>    static bool classof(const Stmt *T) {
> @@ -178,6 +180,76 @@ public:
>    }
>  };
>
> +/// \brief This represents '#pragma omp simd' directive.
> +///
> +/// \code
> +/// #pragma omp simd private(a,b) linear(i,j:s) reduction(+:c,d)
> +/// \endcode
> +/// In this example directive '#pragma omp simd' has clauses 'private'
> +/// with the variables 'a' and 'b', 'linear' with variables 'i', 'j' and
> +/// linear step 's', 'reduction' with operator '+' and variables 'c' and 'd'.
> +///
> +class OMPSimdDirective : public OMPExecutableDirective {
> +  friend class ASTStmtReader;
> +  /// \brief Number of collapsed loops as specified by 'collapse' clause.
> +  unsigned CollapsedNum;
> +  /// \brief Build directive with the given start and end location.
> +  ///
> +  /// \param StartLoc Starting location of the directive kind.
> +  /// \param EndLoc Ending location of the directive.
> +  /// \param CollapsedNum Number of collapsed nested loops.
> +  /// \param NumClauses Number of clauses.
> +  ///
> +  OMPSimdDirective(SourceLocation StartLoc, SourceLocation EndLoc,
> +                  unsigned CollapsedNum, unsigned NumClauses)
> +    : OMPExecutableDirective(this, OMPSimdDirectiveClass, OMPD_simd,
> +                             StartLoc, EndLoc, NumClauses, 1),
> +      CollapsedNum(CollapsedNum) { }
> +
> +  /// \brief Build an empty directive.
> +  ///
> +  /// \param CollapsedNum Number of collapsed nested loops.
> +  /// \param NumClauses Number of clauses.
> +  ///
> +  explicit OMPSimdDirective(unsigned CollapsedNum, unsigned NumClauses)
> +    : OMPExecutableDirective(this, OMPSimdDirectiveClass, OMPD_simd,
> +                             SourceLocation(), SourceLocation(),
> +                             NumClauses, 1),
> +                             CollapsedNum(CollapsedNum) { }
> +public:
> +  /// \brief Creates directive with a list of \a Clauses.
> +  ///
> +  /// \param C AST context.
> +  /// \param StartLoc Starting location of the directive kind.
> +  /// \param EndLoc Ending Location of the directive.
> +  /// \param Clauses List of clauses.
> +  /// \param AssociatedStmt Statement, associated with the directive.
> +  ///
> +  static OMPSimdDirective *Create(const ASTContext &C,
> +                                  SourceLocation StartLoc,
> +                                  SourceLocation EndLoc,
> +                                  ArrayRef<OMPClause *> Clauses,
> +                                  Stmt *AssociatedStmt);
> +
> +  /// \brief Creates an empty directive with the place
> +  /// for \a NumClauses clauses.
> +  ///
> +  /// \param C AST context.
> +  /// \param CollapsedNum Number of collapsed nested loops.
> +  /// \param NumClauses Number of clauses.
> +  ///
> +  static OMPSimdDirective *CreateEmpty(const ASTContext &C,
> +                                       unsigned NumClauses,
> +                                       unsigned CollapsedNum,
> +                                       EmptyShell);
> +
> +  unsigned getCollapsedNumber() const { return CollapsedNum; }
> +
> +  static bool classof(const Stmt *T) {
> +    return T->getStmtClass() == OMPSimdDirectiveClass;
> +  }
> +};
> +
>  } // end namespace clang
>
>  #endif
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=202360&r1=202359&r2=202360&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Feb 27 02:29:12 2014
> @@ -6835,24 +6835,26 @@ def err_omp_private_incomplete_type : Er
>    "a private variable with incomplete type %0">;
>  def err_omp_firstprivate_incomplete_type : Error<
>    "a firstprivate variable with incomplete type %0">;
> -def err_omp_unexpected_clause_value : Error <
> +def err_omp_unexpected_clause_value : Error<
>    "expected %0 in OpenMP clause '%1'">;
> -def err_omp_expected_var_name : Error <
> +def err_omp_expected_var_name : Error<
>    "expected variable name">;
> -def err_omp_required_method : Error <
> +def err_omp_required_method : Error<
>    "%0 variable must have an accessible, unambiguous %select{default constructor|copy constructor|copy assignment operator|'%2'|destructor}1">;
>  def err_omp_clause_ref_type_arg : Error<
>    "arguments of OpenMP clause '%0' cannot be of reference type %1">;
>  def err_omp_threadprivate_incomplete_type : Error<
>    "threadprivate variable with incomplete type %0">;
> -def err_omp_no_dsa_for_variable : Error <
> +def err_omp_no_dsa_for_variable : Error<
>    "variable %0 must have explicitly specified data sharing attributes">;
>  def err_omp_wrong_dsa : Error<
>    "%0 variable cannot be %1">;
> -def note_omp_explicit_dsa : Note <
> +def note_omp_explicit_dsa : Note<
>    "defined as %0">;
> -def note_omp_predetermined_dsa : Note <
> +def note_omp_predetermined_dsa : Note<
>    "predetermined as %0">;
> +def err_omp_not_for : Error<
> +  "statement after '#pragma omp %0' must be a for loop">;
>  } // end of OpenMP category
>
>  let CategoryName = "Related Result Type Issue" in {
>
> Modified: cfe/trunk/include/clang/Basic/OpenMPKinds.def
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/OpenMPKinds.def?rev=202360&r1=202359&r2=202360&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/OpenMPKinds.def (original)
> +++ cfe/trunk/include/clang/Basic/OpenMPKinds.def Thu Feb 27 02:29:12 2014
> @@ -21,6 +21,9 @@
>  #ifndef OPENMP_PARALLEL_CLAUSE
>  #  define OPENMP_PARALLEL_CLAUSE(Name)
>  #endif
> +#ifndef OPENMP_SIMD_CLAUSE
> +#  define OPENMP_SIMD_CLAUSE(Name)
> +#endif
>  #ifndef OPENMP_DEFAULT_KIND
>  #  define OPENMP_DEFAULT_KIND(Name)
>  #endif
> @@ -29,6 +32,7 @@
>  OPENMP_DIRECTIVE(threadprivate)
>  OPENMP_DIRECTIVE(parallel)
>  OPENMP_DIRECTIVE(task)
> +OPENMP_DIRECTIVE(simd)
>
>  // OpenMP clauses.
>  OPENMP_CLAUSE(if, OMPIfClause)
> @@ -44,6 +48,8 @@ OPENMP_PARALLEL_CLAUSE(private)
>  OPENMP_PARALLEL_CLAUSE(firstprivate)
>  OPENMP_PARALLEL_CLAUSE(shared)
>
> +// FIXME: clauses allowed for directive 'omp simd'.
> +
>  // Static attributes for 'default' clause.
>  OPENMP_DEFAULT_KIND(none)
>  OPENMP_DEFAULT_KIND(shared)
> @@ -52,3 +58,5 @@ OPENMP_DEFAULT_KIND(shared)
>  #undef OPENMP_DIRECTIVE
>  #undef OPENMP_CLAUSE
>  #undef OPENMP_PARALLEL_CLAUSE
> +#undef OPENMP_SIMD_CLAUSE
> +
>
> Modified: cfe/trunk/include/clang/Basic/StmtNodes.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/StmtNodes.td?rev=202360&r1=202359&r2=202360&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/StmtNodes.td (original)
> +++ cfe/trunk/include/clang/Basic/StmtNodes.td Thu Feb 27 02:29:12 2014
> @@ -178,3 +178,4 @@ def AsTypeExpr : DStmt<Expr>;
>  // OpenMP Directives.
>  def OMPExecutableDirective : Stmt<1>;
>  def OMPParallelDirective : DStmt<OMPExecutableDirective>;
> +def OMPSimdDirective : DStmt<OMPExecutableDirective>;
>
> Modified: cfe/trunk/include/clang/Sema/Sema.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=202360&r1=202359&r2=202360&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Sema/Sema.h (original)
> +++ cfe/trunk/include/clang/Sema/Sema.h Thu Feb 27 02:29:12 2014
> @@ -7111,6 +7111,12 @@ public:
>                                            Stmt *AStmt,
>                                            SourceLocation StartLoc,
>                                            SourceLocation EndLoc);
> +  /// \brief Called on well-formed '\#pragma omp simd' after parsing
> +  /// of the associated statement.
> +  StmtResult ActOnOpenMPSimdDirective(ArrayRef<OMPClause *> Clauses,
> +                                      Stmt *AStmt,
> +                                      SourceLocation StartLoc,
> +                                      SourceLocation EndLoc);
>
>    OMPClause *ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind,
>                                           Expr *Expr,
>
> Modified: cfe/trunk/include/clang/Serialization/ASTBitCodes.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Serialization/ASTBitCodes.h?rev=202360&r1=202359&r2=202360&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Serialization/ASTBitCodes.h (original)
> +++ cfe/trunk/include/clang/Serialization/ASTBitCodes.h Thu Feb 27 02:29:12 2014
> @@ -1333,6 +1333,7 @@ namespace clang {
>
>        // OpenMP drectives
>        STMT_OMP_PARALLEL_DIRECTIVE,
> +      STMT_OMP_SIMD_DIRECTIVE,
>
>        // ARC
>        EXPR_OBJC_BRIDGED_CAST,     // ObjCBridgedCastExpr
>
> Modified: cfe/trunk/lib/AST/Stmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Stmt.cpp?rev=202360&r1=202359&r2=202360&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/Stmt.cpp (original)
> +++ cfe/trunk/lib/AST/Stmt.cpp Thu Feb 27 02:29:12 2014
> @@ -1217,10 +1217,39 @@ OMPParallelDirective *OMPParallelDirecti
>  }
>
>  OMPParallelDirective *OMPParallelDirective::CreateEmpty(const ASTContext &C,
> -                                                        unsigned N,
> +                                                        unsigned NumClauses,
>                                                          EmptyShell) {
>    unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPParallelDirective),
>                                             llvm::alignOf<OMPClause *>());
> -  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * N + sizeof(Stmt *));
> -  return new (Mem) OMPParallelDirective(N);
> +  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
> +                         sizeof(Stmt *));
> +  return new (Mem) OMPParallelDirective(NumClauses);
>  }
> +
> +OMPSimdDirective *OMPSimdDirective::Create(const ASTContext &C,
> +                                           SourceLocation StartLoc,
> +                                           SourceLocation EndLoc,
> +                                           ArrayRef<OMPClause *> Clauses,
> +                                           Stmt *AssociatedStmt) {
> +  unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSimdDirective),
> +                                           llvm::alignOf<OMPClause *>());
> +  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * Clauses.size() +
> +                         sizeof(Stmt *));
> +  OMPSimdDirective *Dir = new (Mem) OMPSimdDirective(StartLoc, EndLoc,
> +                                                     1, Clauses.size());
> +  Dir->setClauses(Clauses);
> +  Dir->setAssociatedStmt(AssociatedStmt);
> +  return Dir;
> +}
> +
> +OMPSimdDirective *OMPSimdDirective::CreateEmpty(const ASTContext &C,
> +                                                unsigned NumClauses,
> +                                                unsigned CollapsedNum,
> +                                                EmptyShell) {
> +  unsigned Size = llvm::RoundUpToAlignment(sizeof(OMPSimdDirective),
> +                                           llvm::alignOf<OMPClause *>());
> +  void *Mem = C.Allocate(Size + sizeof(OMPClause *) * NumClauses +
> +                         sizeof(Stmt *));
> +  return new (Mem) OMPSimdDirective(CollapsedNum, NumClauses);
> +}
> +
>
> Modified: cfe/trunk/lib/AST/StmtPrinter.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtPrinter.cpp?rev=202360&r1=202359&r2=202360&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/StmtPrinter.cpp (original)
> +++ cfe/trunk/lib/AST/StmtPrinter.cpp Thu Feb 27 02:29:12 2014
> @@ -70,6 +70,7 @@ namespace  {
>      void PrintCallArgs(CallExpr *E);
>      void PrintRawSEHExceptHandler(SEHExceptStmt *S);
>      void PrintRawSEHFinallyStmt(SEHFinallyStmt *S);
> +    void PrintOMPExecutableDirective(OMPExecutableDirective *S);
>
>      void PrintExpr(Expr *E) {
>        if (E)
> @@ -89,7 +90,7 @@ namespace  {
>            return;
>        else StmtVisitor<StmtPrinter>::Visit(S);
>      }
> -
> +
>      void VisitStmt(Stmt *Node) LLVM_ATTRIBUTE_UNUSED {
>        Indent() << "<<unknown stmt type>>\n";
>      }
> @@ -656,11 +657,9 @@ void OMPClausePrinter::VisitOMPSharedCla
>  //  OpenMP directives printing methods
>  //===----------------------------------------------------------------------===//
>
> -void StmtPrinter::VisitOMPParallelDirective(OMPParallelDirective *Node) {
> -  Indent() << "#pragma omp parallel ";
> -
> +void StmtPrinter::PrintOMPExecutableDirective(OMPExecutableDirective *S) {
>    OMPClausePrinter Printer(OS, Policy);
> -  ArrayRef<OMPClause *> Clauses = Node->clauses();
> +  ArrayRef<OMPClause *> Clauses = S->clauses();
>    for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
>         I != E; ++I)
>      if (*I && !(*I)->isImplicit()) {
> @@ -668,13 +667,24 @@ void StmtPrinter::VisitOMPParallelDirect
>        OS << ' ';
>      }
>    OS << "\n";
> -  if (Node->getAssociatedStmt()) {
> -    assert(isa<CapturedStmt>(Node->getAssociatedStmt()) &&
> +  if (S->getAssociatedStmt()) {
> +    assert(isa<CapturedStmt>(S->getAssociatedStmt()) &&
>             "Expected captured statement!");
> -    Stmt *CS = cast<CapturedStmt>(Node->getAssociatedStmt())->getCapturedStmt();
> +    Stmt *CS = cast<CapturedStmt>(S->getAssociatedStmt())->getCapturedStmt();
>      PrintStmt(CS);
>    }
>  }
> +
> +void StmtPrinter::VisitOMPParallelDirective(OMPParallelDirective *Node) {
> +  Indent() << "#pragma omp parallel ";
> +  PrintOMPExecutableDirective(Node);
> +}
> +
> +void StmtPrinter::VisitOMPSimdDirective(OMPSimdDirective *Node) {
> +  Indent() << "#pragma omp simd ";
> +  PrintOMPExecutableDirective(Node);
> +}
> +
>  //===----------------------------------------------------------------------===//
>  //  Expr printing methods.
>  //===----------------------------------------------------------------------===//
>
> Modified: cfe/trunk/lib/AST/StmtProfile.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/StmtProfile.cpp?rev=202360&r1=202359&r2=202360&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/StmtProfile.cpp (original)
> +++ cfe/trunk/lib/AST/StmtProfile.cpp Thu Feb 27 02:29:12 2014
> @@ -293,7 +293,7 @@ void OMPClauseProfiler::VisitOMPSharedCl
>  }
>
>  void
> -StmtProfiler::VisitOMPParallelDirective(const OMPParallelDirective *S) {
> +StmtProfiler::VisitOMPExecutableDirective(const OMPExecutableDirective *S) {
>    VisitStmt(S);
>    OMPClauseProfiler P(this);
>    ArrayRef<OMPClause *> Clauses = S->clauses();
> @@ -303,6 +303,14 @@ StmtProfiler::VisitOMPParallelDirective(
>        P.Visit(*I);
>  }
>
> +void StmtProfiler::VisitOMPParallelDirective(const OMPParallelDirective *S) {
> +  VisitOMPExecutableDirective(S);
> +}
> +
> +void StmtProfiler::VisitOMPSimdDirective(const OMPSimdDirective *S) {
> +  VisitOMPExecutableDirective(S);
> +}
> +
>  void StmtProfiler::VisitExpr(const Expr *S) {
>    VisitStmt(S);
>  }
>
> Modified: cfe/trunk/lib/Basic/OpenMPKinds.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/OpenMPKinds.cpp?rev=202360&r1=202359&r2=202360&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Basic/OpenMPKinds.cpp (original)
> +++ cfe/trunk/lib/Basic/OpenMPKinds.cpp Thu Feb 27 02:29:12 2014
> @@ -125,6 +125,15 @@ bool clang::isAllowedClauseForDirective(
>        break;
>      }
>      break;
> +  case OMPD_simd:
> +    switch (CKind) {
> +#define OPENMP_SIMD_CLAUSE(Name) \
> +    case OMPC_##Name: return true;
> +#include "clang/Basic/OpenMPKinds.def"
> +    default:
> +      break;

This is causing a warning for me in MSVC:

Warning 1 warning C4065: switch statement contains 'default' but no
'case' labels E:\llvm\llvm\tools\clang\lib\Basic\OpenMPKinds.cpp 135

Will this switch statement gain content in the near future, or is this
something we can remove for the time being?

~Aaron



More information about the cfe-commits mailing list