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