I suggest pulling out the "structured block" checking, which is untested and 
looks very incomplete. Otherwise, very minor changes requested this time 
around, then this can go in.


================
Comment at: include/clang/AST/StmtOpenMP.h:80
@@ +79,3 @@
+  /// \brief Fetches list of variables associated with this clause.
+  llvm::MutableArrayRef<Expr *> getVars() {
+    return llvm::MutableArrayRef<Expr *>(
----------------
getVars() is slightly misleading. getVarRefs(), perhaps?

================
Comment at: include/clang/AST/StmtOpenMP.h:169
@@ +168,3 @@
+  ///
+  explicit OMPDefaultClause()
+    : OMPClause(OMPC_default, SourceLocation(), SourceLocation()),
----------------
This doesn't need to be 'explicit'.

================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:6408
@@ +6407,3 @@
+def err_omp_private_incomplete_type : Error<
+  "a private variable with incomplete type %0">;
+def err_omp_directive_nonblock : Error<
----------------
Please drop the leading "a " from the diagnostic.

================
Comment at: include/clang/Basic/DiagnosticSemaKinds.td:6418
@@ -6407,1 +6417,3 @@
+def err_omp_clause_ref_type_arg : Error<
+  "arguments of OpenMP clause '%0' cannot be of reference type">;
 def err_omp_threadprivate_incomplete_type : Error<
----------------
How about adding the actual type (via %1) at the end of this? It can be 
important when dealing with template instantiations.

================
Comment at: lib/Sema/SemaOpenMP.cpp:210
@@ +209,3 @@
+    //return false;
+    return true;
+  }
----------------
Why is this always returning true?

================
Comment at: lib/Sema/SemaOpenMP.cpp:202
@@ +201,3 @@
+namespace {
+class StructuredStmtChecker : public StmtVisitor<StructuredStmtChecker, bool> {
+public:
----------------
I gather that this is trying to check whether the given statement is a 
structured block, but it's not clear exactly what rules are being followed. 
(The OpenMP Specification is ridiculously vague in its definition). Note that 
the checking for "goto" rules are elsewhere (as they should be), and we aren't 
trying to check the rules for "throw" (which we can't figure out statically 
anyway), or "setjmp" (which could be here).

================
Comment at: lib/Sema/SemaOpenMP.cpp:255
@@ +254,3 @@
+    if (!Checker.Visit(AStmt)) {
+      Diag(StartLoc, diag::err_omp_directive_nonblock)
+        << getOpenMPDirectiveName(Kind) << AStmt;
----------------
This isn't a very helpful diagnostic, because it doesn't show which part of the 
statement makes it not a structured block. Also, there don't seem to be any 
tests for this diagnostic.

I suggest removing the structured-block checking from this patch, because it's 
not nearly as baked as the rest of the patch and I don't want it holding up the 
rest.

================
Comment at: lib/Sema/SemaOpenMP.cpp:422
@@ +421,3 @@
+      if (!CD ||
+          CheckConstructorAccess(ELoc, CD,
+                                 InitializedEntity::InitializeTemporary(Type),
----------------
Should also check that CD is not deleted and somewhere check for 
unavailable/deprecated (e.g., via DiagnoseUseOfDecl). I suspect you'll end up 
building a call to the default constructor to stash in the AST, but that 
doesn't need to be part of this patch.



================
Comment at: lib/Sema/SemaOpenMP.cpp:436
@@ +435,3 @@
+      CXXDestructorDecl *DD = RD->getDestructor();
+      if (DD && !DD->isTrivial()) {
+        if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible) {
----------------
Why the trivial check?

================
Comment at: lib/Sema/SemaOpenMP.cpp:380
@@ +379,3 @@
+    //  structure element) cannot appear in a private clause.
+    DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(*I);
+    if (!DE || !isa<VarDecl>(DE->getDecl())) {
----------------
It doesn't have to be handled as part of this patch, but within templates 
you'll also need to handle DependentScopeDeclRefExprs, as well have 
VD->getType() being type-dependent.

================
Comment at: lib/Serialization/ASTWriterStmt.cpp:1713
@@ +1712,3 @@
+void ASTStmtWriter::VisitOMPParallelDirective(OMPParallelDirective *D) {
+  VisitOMPExecutableDirective(D);
+  Code = serialization::STMT_OMP_PARALLEL_DIRECTIVE;
----------------
There are no tests for this code?


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

Reply via email to