1c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev//===--- SemaOpenMP.cpp - Semantic Analysis for OpenMP constructs ----------===//
2c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev//
3c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev//                     The LLVM Compiler Infrastructure
4c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev//
5c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev// This file is distributed under the University of Illinois Open Source
6c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev// License. See LICENSE.TXT for details.
7c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev//
8c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev//===----------------------------------------------------------------------===//
9c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev/// \file
10c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev/// \brief This file implements semantic analysis for OpenMP directives and
116af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev/// clauses.
12c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev///
13c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev//===----------------------------------------------------------------------===//
14c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
15c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev#include "clang/Basic/OpenMPKinds.h"
16c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev#include "clang/AST/Decl.h"
174fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/AST/DeclCXX.h"
18c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev#include "clang/AST/DeclOpenMP.h"
194fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/AST/StmtCXX.h"
204fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/AST/StmtOpenMP.h"
214fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/AST/StmtVisitor.h"
22c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev#include "clang/Lex/Preprocessor.h"
234fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/Sema/Initialization.h"
24c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev#include "clang/Sema/SemaInternal.h"
25c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev#include "clang/Sema/Lookup.h"
264fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/Sema/Scope.h"
274fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev#include "clang/Sema/ScopeInfo.h"
28c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataevusing namespace clang;
29c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
30c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataevnamespace {
31c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
326af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataevclass VarDeclFilterCCC : public CorrectionCandidateCallback {
336af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataevprivate:
346af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  Sema &Actions;
356af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataevpublic:
366af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  VarDeclFilterCCC(Sema &S) : Actions(S) { }
376af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  virtual bool ValidateCandidate(const TypoCorrection &Candidate) {
386af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    NamedDecl *ND = Candidate.getCorrectionDecl();
396af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    if (VarDecl *VD = dyn_cast_or_null<VarDecl>(ND)) {
406af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev      return VD->hasGlobalStorage() &&
416af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev             Actions.isDeclInScope(ND, Actions.getCurLexicalContext(),
426af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                                   Actions.getCurScope());
436af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    }
446af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    return false;
456af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  }
466af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev};
47c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev}
48c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
496af701f29be43e49a25ab098c79940ae4cbb69c7Alexey BataevExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope,
506af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                                         CXXScopeSpec &ScopeSpec,
516af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                                         const DeclarationNameInfo &Id) {
526af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  LookupResult Lookup(*this, Id, LookupOrdinaryName);
536af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  LookupParsedName(Lookup, CurScope, &ScopeSpec, true);
54c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
556af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  if (Lookup.isAmbiguous())
566af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    return ExprError();
576af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev
586af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  VarDecl *VD;
596af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  if (!Lookup.isSingleResult()) {
606af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    VarDeclFilterCCC Validator(*this);
616af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    TypoCorrection Corrected = CorrectTypo(Id, LookupOrdinaryName, CurScope,
626af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                                           0, Validator);
636af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    std::string CorrectedStr = Corrected.getAsString(getLangOpts());
646af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    std::string CorrectedQuotedStr = Corrected.getQuoted(getLangOpts());
656af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    if (Lookup.empty()) {
666af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev      if (Corrected.isResolved()) {
676af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev        Diag(Id.getLoc(), diag::err_undeclared_var_use_suggest)
686af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev          << Id.getName() << CorrectedQuotedStr
696af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev          << FixItHint::CreateReplacement(Id.getLoc(), CorrectedStr);
70c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev      } else {
716af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev        Diag(Id.getLoc(), diag::err_undeclared_var_use)
726af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev          << Id.getName();
73c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev      }
74c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    } else {
756af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev      Diag(Id.getLoc(), diag::err_omp_expected_var_arg_suggest)
766af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev        << Id.getName() << Corrected.isResolved() << CorrectedQuotedStr
776af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev        << FixItHint::CreateReplacement(Id.getLoc(), CorrectedStr);
78c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    }
796af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    if (!Corrected.isResolved()) return ExprError();
806af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    VD = Corrected.getCorrectionDeclAs<VarDecl>();
816af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  } else {
826af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    if (!(VD = Lookup.getAsSingle<VarDecl>())) {
836af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev      Diag(Id.getLoc(), diag::err_omp_expected_var_arg_suggest)
846af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev        << Id.getName() << 0;
856af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev      Diag(Lookup.getFoundDecl()->getLocation(), diag::note_declared_at);
866af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev      return ExprError();
87c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    }
886af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  }
896af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  Lookup.suppressDiagnostics();
90c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
916af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  // OpenMP [2.9.2, Syntax, C/C++]
926af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  //   Variables must be file-scope, namespace-scope, or static block-scope.
936af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  if (!VD->hasGlobalStorage()) {
946af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    Diag(Id.getLoc(), diag::err_omp_global_var_arg)
956af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev      << getOpenMPDirectiveName(OMPD_threadprivate)
966af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev      << !VD->isStaticLocal();
976af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
986af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                  VarDecl::DeclarationOnly;
996af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    Diag(VD->getLocation(),
1006af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev         IsDecl ? diag::note_previous_decl : diag::note_defined_here) << VD;
1016af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    return ExprError();
1026af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  }
103c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
1046af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  // OpenMP [2.9.2, Restrictions, C/C++, p.2]
1056af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  //   A threadprivate directive for file-scope variables must appear outside
1066af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  //   any definition or declaration.
1076af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  // OpenMP [2.9.2, Restrictions, C/C++, p.3]
1086af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  //   A threadprivate directive for static class member variables must appear
1096af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  //   in the class definition, in the same scope in which the member
1106af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  //   variables are declared.
1116af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  // OpenMP [2.9.2, Restrictions, C/C++, p.4]
1126af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  //   A threadprivate directive for namespace-scope variables must appear
1136af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  //   outside any definition or declaration other than the namespace
1146af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  //   definition itself.
1156af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  // OpenMP [2.9.2, Restrictions, C/C++, p.6]
1166af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  //   A threadprivate directive for static block-scope variables must appear
1176af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  //   in the scope of the variable and not in a nested scope.
1186af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  NamedDecl *ND = cast<NamedDecl>(VD);
1196af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  if (!isDeclInScope(ND, getCurLexicalContext(), CurScope)) {
1206af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    Diag(Id.getLoc(), diag::err_omp_var_scope)
1216af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev      << getOpenMPDirectiveName(OMPD_threadprivate) << VD;
1226af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
1236af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                  VarDecl::DeclarationOnly;
1246af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl :
1256af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                                     diag::note_defined_here) << VD;
1266af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    return ExprError();
1276af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  }
128c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
1296af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  // OpenMP [2.9.2, Restrictions, C/C++, p.2-6]
1306af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  //   A threadprivate directive must lexically precede all references to any
1316af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  //   of the variables in its list.
1326af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  if (VD->isUsed()) {
1336af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    Diag(Id.getLoc(), diag::err_omp_var_used)
1346af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev      << getOpenMPDirectiveName(OMPD_threadprivate) << VD;
1356af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    return ExprError();
136c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev  }
1376af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev
1386af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  QualType ExprType = VD->getType().getNonReferenceType();
1396af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  ExprResult DE = BuildDeclRefExpr(VD, ExprType, VK_RValue, Id.getLoc());
1406af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  return DE;
1416af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev}
1426af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev
1436af701f29be43e49a25ab098c79940ae4cbb69c7Alexey BataevSema::DeclGroupPtrTy Sema::ActOnOpenMPThreadprivateDirective(
1446af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                                SourceLocation Loc,
1456af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                                ArrayRef<Expr *> VarList) {
1466af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  if (OMPThreadPrivateDecl *D = CheckOMPThreadPrivateDecl(Loc, VarList)) {
147c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    CurContext->addDecl(D);
148c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    return DeclGroupPtrTy::make(DeclGroupRef(D));
149c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev  }
150c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev  return DeclGroupPtrTy();
151c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev}
152c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
153c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey BataevOMPThreadPrivateDecl *Sema::CheckOMPThreadPrivateDecl(
154c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev                                 SourceLocation Loc,
1556af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                                 ArrayRef<Expr *> VarList) {
1566af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  SmallVector<Expr *, 8> Vars;
1576af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev  for (ArrayRef<Expr *>::iterator I = VarList.begin(),
158c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev                                         E = VarList.end();
159c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev       I != E; ++I) {
1606af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    DeclRefExpr *DE = cast<DeclRefExpr>(*I);
1616af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    VarDecl *VD = cast<VarDecl>(DE->getDecl());
1626af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev    SourceLocation ILoc = DE->getExprLoc();
163c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
164c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    // OpenMP [2.9.2, Restrictions, C/C++, p.10]
165c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    //   A threadprivate variable must not have an incomplete type.
166c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    if (RequireCompleteType(ILoc, VD->getType(),
1676af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                            diag::err_omp_threadprivate_incomplete_type)) {
168c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev      continue;
169c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    }
170c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
171c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    // OpenMP [2.9.2, Restrictions, C/C++, p.10]
172c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    //   A threadprivate variable must not have a reference type.
173c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    if (VD->getType()->isReferenceType()) {
174c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev      Diag(ILoc, diag::err_omp_ref_type_arg)
1754fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        << getOpenMPDirectiveName(OMPD_threadprivate)
1764fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        << VD->getType();
1776af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev      bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
1786af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                    VarDecl::DeclarationOnly;
1796af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev      Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl :
1806af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                                       diag::note_defined_here) << VD;
181c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev      continue;
182c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    }
183c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
18438afbc7361d861968232defaeaf8e302af75b5eeRichard Smith    // Check if this is a TLS variable.
18538afbc7361d861968232defaeaf8e302af75b5eeRichard Smith    if (VD->getTLSKind()) {
186c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev      Diag(ILoc, diag::err_omp_var_thread_local) << VD;
1876af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev      bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
1886af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                    VarDecl::DeclarationOnly;
1896af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev      Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl :
1906af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev                                       diag::note_defined_here) << VD;
191c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev      continue;
192c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    }
193c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev
194c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev    Vars.push_back(*I);
195c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev  }
196c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev  return Vars.empty() ?
197c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev              0 : OMPThreadPrivateDecl::Create(Context,
198c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev                                               getCurLexicalContext(),
199c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev                                               Loc, Vars);
200c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev}
2016af701f29be43e49a25ab098c79940ae4cbb69c7Alexey Bataev
2024fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey BataevStmtResult Sema::ActOnOpenMPExecutableDirective(OpenMPDirectiveKind Kind,
2034fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                                ArrayRef<OMPClause *> Clauses,
2044fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                                Stmt *AStmt,
2054fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                                SourceLocation StartLoc,
2064fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                                SourceLocation EndLoc) {
2074fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  StmtResult Res = StmtError();
2084fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  switch (Kind) {
2094fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case OMPD_parallel:
2104fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    Res = ActOnOpenMPParallelDirective(Clauses, AStmt, StartLoc, EndLoc);
2114fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    break;
2124fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case OMPD_threadprivate:
2134fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case OMPD_task:
2144fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    llvm_unreachable("OpenMP Directive is not allowed");
2154fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case OMPD_unknown:
2164fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case NUM_OPENMP_DIRECTIVES:
2174fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    llvm_unreachable("Unknown OpenMP directive");
2184fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  }
2194fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  return Res;
2204fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
2214fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
2224fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey BataevStmtResult Sema::ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses,
2234fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                              Stmt *AStmt,
2244fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                              SourceLocation StartLoc,
2254fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                              SourceLocation EndLoc) {
2264fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  getCurFunction()->setHasBranchProtectedScope();
2274fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
2284fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  return Owned(OMPParallelDirective::Create(Context, StartLoc, EndLoc,
2294fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                            Clauses, AStmt));
2304fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
2314fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
2324fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey BataevOMPClause *Sema::ActOnOpenMPSimpleClause(OpenMPClauseKind Kind,
2334fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                         unsigned Argument,
2344fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                         SourceLocation ArgumentLoc,
2354fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                         SourceLocation StartLoc,
2364fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                         SourceLocation LParenLoc,
2374fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                         SourceLocation EndLoc) {
2384fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  OMPClause *Res = 0;
2394fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  switch (Kind) {
2404fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case OMPC_default:
2414fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    Res = ActOnOpenMPDefaultClause(
2424fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                             static_cast<OpenMPDefaultClauseKind>(Argument),
2434fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                             ArgumentLoc, StartLoc, LParenLoc, EndLoc);
2444fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    break;
2454fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case OMPC_private:
2464fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case OMPC_threadprivate:
2474fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case OMPC_unknown:
2484fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case NUM_OPENMP_CLAUSES:
2494fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    llvm_unreachable("Clause is not allowed.");
2504fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  }
2514fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  return Res;
2524fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
2534fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
2544fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey BataevOMPClause *Sema::ActOnOpenMPDefaultClause(OpenMPDefaultClauseKind Kind,
2554fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                          SourceLocation KindKwLoc,
2564fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                          SourceLocation StartLoc,
2574fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                          SourceLocation LParenLoc,
2584fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                          SourceLocation EndLoc) {
2594fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  if (Kind == OMPC_DEFAULT_unknown) {
2604fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    std::string Values;
2614fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    std::string Sep(NUM_OPENMP_DEFAULT_KINDS > 1 ? ", " : "");
2624fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    for (unsigned i = OMPC_DEFAULT_unknown + 1;
2634fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev         i < NUM_OPENMP_DEFAULT_KINDS; ++i) {
2644fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      Values += "'";
2654fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      Values += getOpenMPSimpleClauseTypeName(OMPC_default, i);
2664fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      Values += "'";
2674fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      switch (i) {
2684fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      case NUM_OPENMP_DEFAULT_KINDS - 2:
2694fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        Values += " or ";
2704fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        break;
2714fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      case NUM_OPENMP_DEFAULT_KINDS - 1:
2724fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        break;
2734fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      default:
2744fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        Values += Sep;
2754fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        break;
2764fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      }
2774fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    }
2784fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    Diag(KindKwLoc, diag::err_omp_unexpected_clause_value)
2794fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      << Values << getOpenMPClauseName(OMPC_default);
2804fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    return 0;
2814fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  }
2824fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  return new (Context) OMPDefaultClause(Kind, KindKwLoc, StartLoc, LParenLoc,
2834fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                        EndLoc);
2844fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
2854fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
2864fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey BataevOMPClause *Sema::ActOnOpenMPVarListClause(OpenMPClauseKind Kind,
2874fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                          ArrayRef<Expr *> VarList,
2884fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                          SourceLocation StartLoc,
2894fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                          SourceLocation LParenLoc,
2904fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                          SourceLocation EndLoc) {
2914fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  OMPClause *Res = 0;
2924fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  switch (Kind) {
2934fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case OMPC_private:
2944fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    Res = ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, EndLoc);
2954fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    break;
2964fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case OMPC_default:
2974fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case OMPC_threadprivate:
2984fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case OMPC_unknown:
2994fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  case NUM_OPENMP_CLAUSES:
3004fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    llvm_unreachable("Clause is not allowed.");
3014fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  }
3024fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  return Res;
3034fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
3044fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
3054fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey BataevOMPClause *Sema::ActOnOpenMPPrivateClause(ArrayRef<Expr *> VarList,
3064fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                          SourceLocation StartLoc,
3074fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                          SourceLocation LParenLoc,
3084fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                          SourceLocation EndLoc) {
3094fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  SmallVector<Expr *, 8> Vars;
3104fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  for (ArrayRef<Expr *>::iterator I = VarList.begin(), E = VarList.end();
3114fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev       I != E; ++I) {
3124fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    if (*I && isa<DependentScopeDeclRefExpr>(*I)) {
3134fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      // It will be analyzed later.
3144fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      Vars.push_back(*I);
3154fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      continue;
3164fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    }
3174fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
3184fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    SourceLocation ELoc = (*I)->getExprLoc();
3194fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    // OpenMP [2.1, C/C++]
3204fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    //  A list item is a variable name.
3214fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    // OpenMP  [2.9.3.3, Restrictions, p.1]
3224fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    //  A variable that is part of another variable (as an array or
3234fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    //  structure element) cannot appear in a private clause.
3244fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(*I);
3254fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    if (!DE || !isa<VarDecl>(DE->getDecl())) {
3264fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      Diag(ELoc, diag::err_omp_expected_var_name)
3274fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        << (*I)->getSourceRange();
3284fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      continue;
3294fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    }
3304fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    Decl *D = DE->getDecl();
3314fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    VarDecl *VD = cast<VarDecl>(D);
3324fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
3334fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    QualType Type = VD->getType();
3344fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    if (Type->isDependentType() || Type->isInstantiationDependentType()) {
3354fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      // It will be analyzed later.
3364fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      Vars.push_back(DE);
3374fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      continue;
3384fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    }
3394fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
3404fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    // OpenMP [2.9.3.3, Restrictions, C/C++, p.3]
3414fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    //  A variable that appears in a private clause must not have an incomplete
3424fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    //  type or a reference type.
3434fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    if (RequireCompleteType(ELoc, Type,
3444fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                            diag::err_omp_private_incomplete_type)) {
3454fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      continue;
3464fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    }
3474fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    if (Type->isReferenceType()) {
3484fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      Diag(ELoc, diag::err_omp_clause_ref_type_arg)
3494fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        << getOpenMPClauseName(OMPC_private) << Type;
3504fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
3514fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                    VarDecl::DeclarationOnly;
3524fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl :
3534fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                       diag::note_defined_here) << VD;
3544fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      continue;
3554fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    }
3564fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
3574fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    // OpenMP [2.9.3.3, Restrictions, C/C++, p.1]
3584fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    //  A variable of class type (or array thereof) that appears in a private
3594fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    //  clause requires an accesible, unambiguous default constructor for the
3604fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    //  class type.
3614fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    while (Type.getNonReferenceType()->isArrayType()) {
3624fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      Type = cast<ArrayType>(
3634fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                 Type.getNonReferenceType().getTypePtr())->getElementType();
3644fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    }
3654fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    CXXRecordDecl *RD = getLangOpts().CPlusPlus ?
3664fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                          Type.getNonReferenceType()->getAsCXXRecordDecl() : 0;
3674fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    if (RD) {
3684fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      CXXConstructorDecl *CD = LookupDefaultConstructor(RD);
3694fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      PartialDiagnostic PD =
3704fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        PartialDiagnostic(PartialDiagnostic::NullDiagnostic());
3714fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      if (!CD ||
3724fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev          CheckConstructorAccess(ELoc, CD,
3734fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                 InitializedEntity::InitializeTemporary(Type),
3744fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                 CD->getAccess(), PD) == AR_inaccessible ||
3754fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev          CD->isDeleted()) {
3764fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        Diag(ELoc, diag::err_omp_required_method)
3774fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev             << getOpenMPClauseName(OMPC_private) << 0;
3784fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
3794fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                      VarDecl::DeclarationOnly;
3804fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl :
3814fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                         diag::note_defined_here) << VD;
3824fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        Diag(RD->getLocation(), diag::note_previous_decl) << RD;
3834fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        continue;
3844fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      }
3854fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      MarkFunctionReferenced(ELoc, CD);
3864fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      DiagnoseUseOfDecl(CD, ELoc);
3874fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
3884fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      CXXDestructorDecl *DD = RD->getDestructor();
3894fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      if (DD) {
3904fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible ||
3914fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev            DD->isDeleted()) {
3924fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev          Diag(ELoc, diag::err_omp_required_method)
3934fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev               << getOpenMPClauseName(OMPC_private) << 4;
3944fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev          bool IsDecl = VD->isThisDeclarationADefinition(Context) ==
3954fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                        VarDecl::DeclarationOnly;
3964fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev          Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl :
3974fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev                                           diag::note_defined_here) << VD;
3984fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev          Diag(RD->getLocation(), diag::note_previous_decl) << RD;
3994fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev          continue;
4004fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        }
4014fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        MarkFunctionReferenced(ELoc, DD);
4024fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev        DiagnoseUseOfDecl(DD, ELoc);
4034fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev      }
4044fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    }
4054fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
4064fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev    Vars.push_back(DE);
4074fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  }
4084fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
4094fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  if (Vars.empty()) return 0;
4104fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
4114fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev  return OMPPrivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars);
4124fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev}
4134fa7eab771ab8212e1058bd1a91061ff120c8fbbAlexey Bataev
414