[OPENMP] Bug fixes and improvements.
1. Fixed constructor of shared clause.
2. Some macros for clauses processing are replaced by private template methods.
3. Additional checks in sema analysis of OpenMP clauses.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@191265 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/StmtPrinter.cpp b/lib/AST/StmtPrinter.cpp
index ee3852a..df8d2bb 100644
--- a/lib/AST/StmtPrinter.cpp
+++ b/lib/AST/StmtPrinter.cpp
@@ -586,6 +586,9 @@
namespace {
class OMPClausePrinter : public OMPClauseVisitor<OMPClausePrinter> {
raw_ostream &OS;
+ /// \brief Process clauses with list of variables.
+ template <typename T>
+ void VisitOMPClauseList(T *Node, char StartSym);
public:
OMPClausePrinter(raw_ostream &OS) : OS(OS) { }
#define OPENMP_CLAUSE(Name, Class) \
@@ -599,17 +602,19 @@
<< ")";
}
-#define PROCESS_OMP_CLAUSE_LIST(Class, Node, StartSym) \
- for (OMPVarList<Class>::varlist_iterator I = Node->varlist_begin(), \
- E = Node->varlist_end(); \
- I != E; ++I) \
- OS << (I == Node->varlist_begin() ? StartSym : ',') \
+template<typename T>
+void OMPClausePrinter::VisitOMPClauseList(T *Node, char StartSym) {
+ for (typename T::varlist_iterator I = Node->varlist_begin(),
+ E = Node->varlist_end();
+ I != E; ++I)
+ OS << (I == Node->varlist_begin() ? StartSym : ',')
<< *cast<NamedDecl>(cast<DeclRefExpr>(*I)->getDecl());
+}
void OMPClausePrinter::VisitOMPPrivateClause(OMPPrivateClause *Node) {
if (!Node->varlist_empty()) {
OS << "private";
- PROCESS_OMP_CLAUSE_LIST(OMPPrivateClause, Node, '(')
+ VisitOMPClauseList(Node, '(');
OS << ")";
}
}
@@ -617,12 +622,11 @@
void OMPClausePrinter::VisitOMPSharedClause(OMPSharedClause *Node) {
if (!Node->varlist_empty()) {
OS << "shared";
- PROCESS_OMP_CLAUSE_LIST(OMPSharedClause, Node, '(')
+ VisitOMPClauseList(Node, '(');
OS << ")";
}
}
-#undef PROCESS_OMP_CLAUSE_LIST
}
//===----------------------------------------------------------------------===//