================
Comment at: include/clang/AST/DataRecursiveASTVisitor.h:268-269
@@ -267,1 +267,4 @@
 
+  /// \brief Traverses OMPExecutableDirective class.
+  bool TraverseOMPExecutableDirective(OMPExecutableDirective *S);
+
----------------
Richard Smith wrote:
> This shouldn't be at this point in the class, it should be below with 
> `TraverseOMPClause`.
Fixed.

================
Comment at: include/clang/AST/DataRecursiveASTVisitor.h:2337-2342
@@ -2333,8 +2336,8 @@
 // OpenMP directives.
-DEF_TRAVERSE_STMT(OMPParallelDirective, {
+DEF_TRAVERSE_STMT(OMPExecutableDirective, {
   ArrayRef<OMPClause *> Clauses = S->clauses();
   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
        I != E; ++I)
     if (!TraverseOMPClause(*I)) return false;
 })
 
----------------
Richard Smith wrote:
> This is wrong. You don't want to use `DEF_TRAVERSE_STMT` here, because the 
> `WalkUpFrom*` call will have already been done by the concrete type.
Fixed.

================
Comment at: lib/AST/Stmt.cpp:1243-1248
@@ +1242,8 @@
+                                                EmptyShell) {
+  void *Mem = C.Allocate(llvm::RoundUpToAlignment(
+                           sizeof(OMPSimdDirective),
+                           llvm::alignOf<OMPClause *>()) +
+                         sizeof(OMPClause *) * NumClauses + sizeof(Stmt *),
+                         llvm::alignOf<OMPSimdDirective>());
+  return new (Mem) OMPSimdDirective(CollapsedNum, NumClauses);
+}
----------------
Richard Smith wrote:
> There's no matching rounding up for alignment in `OMPExecutableDirective`'s 
> constructor, so the padding for alignment here is really weird. You're also 
> being inconsistent in when you pad out to alignment and when you don't, and 
> not including the alignment in the second argument to `C.Allocate`.
> 
> I'd suggest just dropping the no-op `RoundUpToAlignment` call here, since it 
> just provides a false sense of security and doesn't actually fix any 
> alignment problems. If you're worried about this, maybe add an assert to 
> `OMPExecutableDirective`'s constructor that the pointer is suitably-aligned.
Fixed.
Alexey committed alignment fixes for OMPExecutableDirective (and other 
directives) recently (http://llvm-reviews.chandlerc.com/D2713), and now 
OMPExecutableDirective's constructor does rounding up. I changed these lines to 
be consistent with OMPParallelDirective here (at least to do the same no-op at 
all places).

================
Comment at: lib/AST/StmtPrinter.cpp:105
@@ -104,2 +104,3 @@
 #include "clang/AST/StmtNodes.inc"
+    void VisitOMPExecutableDirective(OMPExecutableDirective *Node);
   };
----------------
Richard Smith wrote:
> This is a weird place to add this; maybe rename it 
> `PrintOMPExecutableDirective` and put it with the other `Print*` helpers 
> above?
I agree, fixed.

================
Comment at: lib/Serialization/ASTWriterStmt.cpp:1730-1731
@@ -1731,3 +1729,4 @@
   }
-  Writer.AddStmt(E->getAssociatedStmt());
+  if (E->getAssociatedStmt())
+    Writer.AddStmt(E->getAssociatedStmt());
 }
----------------
Richard Smith wrote:
> This doesn't look right: the reader reads this field unconditionally, so it 
> needs to be present unconditionally.
Yes, both parallel and simd directives should have associated stmt. Fixed.

================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:6821
@@ -6820,1 +6820,3 @@
+def err_omp_not_for : Error <
+  "only for-loops are allowed for '#pragma omp %0'">;
 } // end of OpenMP category
----------------
Richard Smith wrote:
> In all other diagnostics, we use "for loop" not "for-loop". Also, how about
> 
>   "statement after '#pragma omp %0' must be a for loop"
> 
> ?
I'm fine with that.

================
Comment at: lib/Sema/TreeTransform.h:1304-1326
@@ -1289,12 +1303,25 @@
+
   /// \brief Build a new OpenMP parallel directive.
   ///
   /// By default, performs semantic analysis to build the new statement.
   /// Subclasses may override this routine to provide different behavior.
   StmtResult RebuildOMPParallelDirective(ArrayRef<OMPClause *> Clauses,
                                          Stmt *AStmt,
                                          SourceLocation StartLoc,
                                          SourceLocation EndLoc) {
     return getSema().ActOnOpenMPParallelDirective(Clauses, AStmt,
                                                   StartLoc, EndLoc);
   }
 
+  /// \brief Build a new OpenMP simd directive.
+  ///
+  /// By default, performs semantic analysis to build the new statement.
+  /// Subclasses may override this routine to provide different behavior.
+  StmtResult RebuildOMPSimdDirective(ArrayRef<OMPClause *> Clauses,
+                                     Stmt *AStmt,
+                                     SourceLocation StartLoc,
+                                     SourceLocation EndLoc) {
+    return getSema().ActOnOpenMPSimdDirective(Clauses, AStmt,
+                                              StartLoc, EndLoc);
+  }
+
----------------
Richard Smith wrote:
> These seem to be unused, since the `Transform*` functions call 
> `RebuildOMPExecutableDirective` instead?
I've removed these guys.

================
Comment at: lib/Serialization/ASTReaderStmt.cpp:1757
@@ +1756,3 @@
+  VisitStmt(D);
+  ++Idx;
+  VisitOMPExecutableDirective(D);
----------------
Richard Smith wrote:
> Please add a comment here indicating that the `NumClauses` field was read in 
> `ReadStmtFromStream`.
Done.


http://llvm-reviews.chandlerc.com/D2815
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to