1 //===--- SemaOpenMP.cpp - Semantic Analysis for OpenMP constructs ---------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 /// \file 10 /// \brief This file implements semantic analysis for OpenMP directives and 11 /// clauses. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #include "clang/AST/ASTContext.h" 16 #include "clang/AST/Decl.h" 17 #include "clang/AST/DeclCXX.h" 18 #include "clang/AST/DeclOpenMP.h" 19 #include "clang/AST/StmtCXX.h" 20 #include "clang/AST/StmtOpenMP.h" 21 #include "clang/AST/StmtVisitor.h" 22 #include "clang/Basic/OpenMPKinds.h" 23 #include "clang/Lex/Preprocessor.h" 24 #include "clang/Sema/Initialization.h" 25 #include "clang/Sema/Lookup.h" 26 #include "clang/Sema/Scope.h" 27 #include "clang/Sema/ScopeInfo.h" 28 #include "clang/Sema/SemaInternal.h" 29 using namespace clang; 30 31 //===----------------------------------------------------------------------===// 32 // Stack of data-sharing attributes for variables 33 //===----------------------------------------------------------------------===// 34 35 namespace { 36 /// \brief Default data sharing attributes, which can be applied to directive. 37 enum DefaultDataSharingAttributes { 38 DSA_unspecified = 0, /// \brief Data sharing attribute not specified. 39 DSA_none = 1 << 0, /// \brief Default data sharing attribute 'none'. 40 DSA_shared = 1 << 1 /// \brief Default data sharing attribute 'shared'. 41 }; 42 43 template <class T> struct MatchesAny { 44 explicit MatchesAny(ArrayRef<T> Arr) : Arr(std::move(Arr)) {} 45 bool operator()(T Kind) { 46 for (auto KindEl : Arr) 47 if (KindEl == Kind) 48 return true; 49 return false; 50 } 51 52 private: 53 ArrayRef<T> Arr; 54 }; 55 struct MatchesAlways { 56 MatchesAlways() {} 57 template <class T> bool operator()(T) { return true; } 58 }; 59 60 typedef MatchesAny<OpenMPClauseKind> MatchesAnyClause; 61 typedef MatchesAny<OpenMPDirectiveKind> MatchesAnyDirective; 62 63 /// \brief Stack for tracking declarations used in OpenMP directives and 64 /// clauses and their data-sharing attributes. 65 class DSAStackTy { 66 public: 67 struct DSAVarData { 68 OpenMPDirectiveKind DKind; 69 OpenMPClauseKind CKind; 70 DeclRefExpr *RefExpr; 71 SourceLocation ImplicitDSALoc; 72 DSAVarData() 73 : DKind(OMPD_unknown), CKind(OMPC_unknown), RefExpr(nullptr), 74 ImplicitDSALoc() {} 75 }; 76 77 private: 78 struct DSAInfo { 79 OpenMPClauseKind Attributes; 80 DeclRefExpr *RefExpr; 81 }; 82 typedef llvm::SmallDenseMap<VarDecl *, DSAInfo, 64> DeclSAMapTy; 83 typedef llvm::SmallDenseMap<VarDecl *, DeclRefExpr *, 64> AlignedMapTy; 84 85 struct SharingMapTy { 86 DeclSAMapTy SharingMap; 87 AlignedMapTy AlignedMap; 88 DefaultDataSharingAttributes DefaultAttr; 89 SourceLocation DefaultAttrLoc; 90 OpenMPDirectiveKind Directive; 91 DeclarationNameInfo DirectiveName; 92 Scope *CurScope; 93 SourceLocation ConstructLoc; 94 bool OrderedRegion; 95 SharingMapTy(OpenMPDirectiveKind DKind, DeclarationNameInfo Name, 96 Scope *CurScope, SourceLocation Loc) 97 : SharingMap(), AlignedMap(), DefaultAttr(DSA_unspecified), 98 Directive(DKind), DirectiveName(std::move(Name)), CurScope(CurScope), 99 ConstructLoc(Loc), OrderedRegion(false) {} 100 SharingMapTy() 101 : SharingMap(), AlignedMap(), DefaultAttr(DSA_unspecified), 102 Directive(OMPD_unknown), DirectiveName(), CurScope(nullptr), 103 ConstructLoc(), OrderedRegion(false) {} 104 }; 105 106 typedef SmallVector<SharingMapTy, 64> StackTy; 107 108 /// \brief Stack of used declaration and their data-sharing attributes. 109 StackTy Stack; 110 Sema &SemaRef; 111 112 typedef SmallVector<SharingMapTy, 8>::reverse_iterator reverse_iterator; 113 114 DSAVarData getDSA(StackTy::reverse_iterator Iter, VarDecl *D); 115 116 /// \brief Checks if the variable is a local for OpenMP region. 117 bool isOpenMPLocal(VarDecl *D, StackTy::reverse_iterator Iter); 118 119 public: 120 explicit DSAStackTy(Sema &S) : Stack(1), SemaRef(S) {} 121 122 void push(OpenMPDirectiveKind DKind, const DeclarationNameInfo &DirName, 123 Scope *CurScope, SourceLocation Loc) { 124 Stack.push_back(SharingMapTy(DKind, DirName, CurScope, Loc)); 125 Stack.back().DefaultAttrLoc = Loc; 126 } 127 128 void pop() { 129 assert(Stack.size() > 1 && "Data-sharing attributes stack is empty!"); 130 Stack.pop_back(); 131 } 132 133 /// \brief If 'aligned' declaration for given variable \a D was not seen yet, 134 /// add it and return NULL; otherwise return previous occurrence's expression 135 /// for diagnostics. 136 DeclRefExpr *addUniqueAligned(VarDecl *D, DeclRefExpr *NewDE); 137 138 /// \brief Adds explicit data sharing attribute to the specified declaration. 139 void addDSA(VarDecl *D, DeclRefExpr *E, OpenMPClauseKind A); 140 141 /// \brief Returns data sharing attributes from top of the stack for the 142 /// specified declaration. 143 DSAVarData getTopDSA(VarDecl *D, bool FromParent); 144 /// \brief Returns data-sharing attributes for the specified declaration. 145 DSAVarData getImplicitDSA(VarDecl *D, bool FromParent); 146 /// \brief Checks if the specified variables has data-sharing attributes which 147 /// match specified \a CPred predicate in any directive which matches \a DPred 148 /// predicate. 149 template <class ClausesPredicate, class DirectivesPredicate> 150 DSAVarData hasDSA(VarDecl *D, ClausesPredicate CPred, 151 DirectivesPredicate DPred, bool FromParent); 152 /// \brief Checks if the specified variables has data-sharing attributes which 153 /// match specified \a CPred predicate in any innermost directive which 154 /// matches \a DPred predicate. 155 template <class ClausesPredicate, class DirectivesPredicate> 156 DSAVarData hasInnermostDSA(VarDecl *D, ClausesPredicate CPred, 157 DirectivesPredicate DPred, 158 bool FromParent); 159 /// \brief Finds a directive which matches specified \a DPred predicate. 160 template <class NamedDirectivesPredicate> 161 bool hasDirective(NamedDirectivesPredicate DPred, bool FromParent); 162 163 /// \brief Returns currently analyzed directive. 164 OpenMPDirectiveKind getCurrentDirective() const { 165 return Stack.back().Directive; 166 } 167 /// \brief Returns parent directive. 168 OpenMPDirectiveKind getParentDirective() const { 169 if (Stack.size() > 2) 170 return Stack[Stack.size() - 2].Directive; 171 return OMPD_unknown; 172 } 173 174 /// \brief Set default data sharing attribute to none. 175 void setDefaultDSANone(SourceLocation Loc) { 176 Stack.back().DefaultAttr = DSA_none; 177 Stack.back().DefaultAttrLoc = Loc; 178 } 179 /// \brief Set default data sharing attribute to shared. 180 void setDefaultDSAShared(SourceLocation Loc) { 181 Stack.back().DefaultAttr = DSA_shared; 182 Stack.back().DefaultAttrLoc = Loc; 183 } 184 185 DefaultDataSharingAttributes getDefaultDSA() const { 186 return Stack.back().DefaultAttr; 187 } 188 SourceLocation getDefaultDSALocation() const { 189 return Stack.back().DefaultAttrLoc; 190 } 191 192 /// \brief Checks if the specified variable is a threadprivate. 193 bool isThreadPrivate(VarDecl *D) { 194 DSAVarData DVar = getTopDSA(D, false); 195 return isOpenMPThreadPrivate(DVar.CKind); 196 } 197 198 /// \brief Marks current region as ordered (it has an 'ordered' clause). 199 void setOrderedRegion(bool IsOrdered = true) { 200 Stack.back().OrderedRegion = IsOrdered; 201 } 202 /// \brief Returns true, if parent region is ordered (has associated 203 /// 'ordered' clause), false - otherwise. 204 bool isParentOrderedRegion() const { 205 if (Stack.size() > 2) 206 return Stack[Stack.size() - 2].OrderedRegion; 207 return false; 208 } 209 210 Scope *getCurScope() const { return Stack.back().CurScope; } 211 Scope *getCurScope() { return Stack.back().CurScope; } 212 SourceLocation getConstructLoc() { return Stack.back().ConstructLoc; } 213 }; 214 bool isParallelOrTaskRegion(OpenMPDirectiveKind DKind) { 215 return isOpenMPParallelDirective(DKind) || DKind == OMPD_task || 216 DKind == OMPD_unknown; 217 } 218 } // namespace 219 220 DSAStackTy::DSAVarData DSAStackTy::getDSA(StackTy::reverse_iterator Iter, 221 VarDecl *D) { 222 DSAVarData DVar; 223 if (Iter == std::prev(Stack.rend())) { 224 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 225 // in a region but not in construct] 226 // File-scope or namespace-scope variables referenced in called routines 227 // in the region are shared unless they appear in a threadprivate 228 // directive. 229 if (!D->isFunctionOrMethodVarDecl() && !isa<ParmVarDecl>(D)) 230 DVar.CKind = OMPC_shared; 231 232 // OpenMP [2.9.1.2, Data-sharing Attribute Rules for Variables Referenced 233 // in a region but not in construct] 234 // Variables with static storage duration that are declared in called 235 // routines in the region are shared. 236 if (D->hasGlobalStorage()) 237 DVar.CKind = OMPC_shared; 238 239 return DVar; 240 } 241 242 DVar.DKind = Iter->Directive; 243 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 244 // in a Construct, C/C++, predetermined, p.1] 245 // Variables with automatic storage duration that are declared in a scope 246 // inside the construct are private. 247 if (isOpenMPLocal(D, Iter) && D->isLocalVarDecl() && 248 (D->getStorageClass() == SC_Auto || D->getStorageClass() == SC_None)) { 249 DVar.CKind = OMPC_private; 250 return DVar; 251 } 252 253 // Explicitly specified attributes and local variables with predetermined 254 // attributes. 255 if (Iter->SharingMap.count(D)) { 256 DVar.RefExpr = Iter->SharingMap[D].RefExpr; 257 DVar.CKind = Iter->SharingMap[D].Attributes; 258 DVar.ImplicitDSALoc = Iter->DefaultAttrLoc; 259 return DVar; 260 } 261 262 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 263 // in a Construct, C/C++, implicitly determined, p.1] 264 // In a parallel or task construct, the data-sharing attributes of these 265 // variables are determined by the default clause, if present. 266 switch (Iter->DefaultAttr) { 267 case DSA_shared: 268 DVar.CKind = OMPC_shared; 269 DVar.ImplicitDSALoc = Iter->DefaultAttrLoc; 270 return DVar; 271 case DSA_none: 272 return DVar; 273 case DSA_unspecified: 274 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 275 // in a Construct, implicitly determined, p.2] 276 // In a parallel construct, if no default clause is present, these 277 // variables are shared. 278 DVar.ImplicitDSALoc = Iter->DefaultAttrLoc; 279 if (isOpenMPParallelDirective(DVar.DKind)) { 280 DVar.CKind = OMPC_shared; 281 return DVar; 282 } 283 284 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 285 // in a Construct, implicitly determined, p.4] 286 // In a task construct, if no default clause is present, a variable that in 287 // the enclosing context is determined to be shared by all implicit tasks 288 // bound to the current team is shared. 289 if (DVar.DKind == OMPD_task) { 290 DSAVarData DVarTemp; 291 for (StackTy::reverse_iterator I = std::next(Iter), 292 EE = std::prev(Stack.rend()); 293 I != EE; ++I) { 294 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables 295 // Referenced 296 // in a Construct, implicitly determined, p.6] 297 // In a task construct, if no default clause is present, a variable 298 // whose data-sharing attribute is not determined by the rules above is 299 // firstprivate. 300 DVarTemp = getDSA(I, D); 301 if (DVarTemp.CKind != OMPC_shared) { 302 DVar.RefExpr = nullptr; 303 DVar.DKind = OMPD_task; 304 DVar.CKind = OMPC_firstprivate; 305 return DVar; 306 } 307 if (isParallelOrTaskRegion(I->Directive)) 308 break; 309 } 310 DVar.DKind = OMPD_task; 311 DVar.CKind = 312 (DVarTemp.CKind == OMPC_unknown) ? OMPC_firstprivate : OMPC_shared; 313 return DVar; 314 } 315 } 316 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 317 // in a Construct, implicitly determined, p.3] 318 // For constructs other than task, if no default clause is present, these 319 // variables inherit their data-sharing attributes from the enclosing 320 // context. 321 return getDSA(std::next(Iter), D); 322 } 323 324 DeclRefExpr *DSAStackTy::addUniqueAligned(VarDecl *D, DeclRefExpr *NewDE) { 325 assert(Stack.size() > 1 && "Data sharing attributes stack is empty"); 326 auto It = Stack.back().AlignedMap.find(D); 327 if (It == Stack.back().AlignedMap.end()) { 328 assert(NewDE && "Unexpected nullptr expr to be added into aligned map"); 329 Stack.back().AlignedMap[D] = NewDE; 330 return nullptr; 331 } else { 332 assert(It->second && "Unexpected nullptr expr in the aligned map"); 333 return It->second; 334 } 335 return nullptr; 336 } 337 338 void DSAStackTy::addDSA(VarDecl *D, DeclRefExpr *E, OpenMPClauseKind A) { 339 if (A == OMPC_threadprivate) { 340 Stack[0].SharingMap[D].Attributes = A; 341 Stack[0].SharingMap[D].RefExpr = E; 342 } else { 343 assert(Stack.size() > 1 && "Data-sharing attributes stack is empty"); 344 Stack.back().SharingMap[D].Attributes = A; 345 Stack.back().SharingMap[D].RefExpr = E; 346 } 347 } 348 349 bool DSAStackTy::isOpenMPLocal(VarDecl *D, StackTy::reverse_iterator Iter) { 350 if (Stack.size() > 2) { 351 reverse_iterator I = Iter, E = std::prev(Stack.rend()); 352 Scope *TopScope = nullptr; 353 while (I != E && !isParallelOrTaskRegion(I->Directive)) { 354 ++I; 355 } 356 if (I == E) 357 return false; 358 TopScope = I->CurScope ? I->CurScope->getParent() : nullptr; 359 Scope *CurScope = getCurScope(); 360 while (CurScope != TopScope && !CurScope->isDeclScope(D)) { 361 CurScope = CurScope->getParent(); 362 } 363 return CurScope != TopScope; 364 } 365 return false; 366 } 367 368 DSAStackTy::DSAVarData DSAStackTy::getTopDSA(VarDecl *D, bool FromParent) { 369 DSAVarData DVar; 370 371 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 372 // in a Construct, C/C++, predetermined, p.1] 373 // Variables appearing in threadprivate directives are threadprivate. 374 if (D->getTLSKind() != VarDecl::TLS_None) { 375 DVar.CKind = OMPC_threadprivate; 376 return DVar; 377 } 378 if (Stack[0].SharingMap.count(D)) { 379 DVar.RefExpr = Stack[0].SharingMap[D].RefExpr; 380 DVar.CKind = OMPC_threadprivate; 381 return DVar; 382 } 383 384 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 385 // in a Construct, C/C++, predetermined, p.1] 386 // Variables with automatic storage duration that are declared in a scope 387 // inside the construct are private. 388 OpenMPDirectiveKind Kind = 389 FromParent ? getParentDirective() : getCurrentDirective(); 390 auto StartI = std::next(Stack.rbegin()); 391 auto EndI = std::prev(Stack.rend()); 392 if (FromParent && StartI != EndI) { 393 StartI = std::next(StartI); 394 } 395 if (!isParallelOrTaskRegion(Kind)) { 396 if (isOpenMPLocal(D, StartI) && 397 ((D->isLocalVarDecl() && (D->getStorageClass() == SC_Auto || 398 D->getStorageClass() == SC_None)) || 399 isa<ParmVarDecl>(D))) { 400 DVar.CKind = OMPC_private; 401 return DVar; 402 } 403 } 404 405 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 406 // in a Construct, C/C++, predetermined, p.4] 407 // Static data members are shared. 408 if (D->isStaticDataMember()) { 409 // Variables with const-qualified type having no mutable member may be 410 // listed in a firstprivate clause, even if they are static data members. 411 DSAVarData DVarTemp = hasDSA(D, MatchesAnyClause(OMPC_firstprivate), 412 MatchesAlways(), FromParent); 413 if (DVarTemp.CKind == OMPC_firstprivate && DVarTemp.RefExpr) 414 return DVar; 415 416 DVar.CKind = OMPC_shared; 417 return DVar; 418 } 419 420 QualType Type = D->getType().getNonReferenceType().getCanonicalType(); 421 bool IsConstant = Type.isConstant(SemaRef.getASTContext()); 422 while (Type->isArrayType()) { 423 QualType ElemType = cast<ArrayType>(Type.getTypePtr())->getElementType(); 424 Type = ElemType.getNonReferenceType().getCanonicalType(); 425 } 426 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 427 // in a Construct, C/C++, predetermined, p.6] 428 // Variables with const qualified type having no mutable member are 429 // shared. 430 CXXRecordDecl *RD = 431 SemaRef.getLangOpts().CPlusPlus ? Type->getAsCXXRecordDecl() : nullptr; 432 if (IsConstant && 433 !(SemaRef.getLangOpts().CPlusPlus && RD && RD->hasMutableFields())) { 434 // Variables with const-qualified type having no mutable member may be 435 // listed in a firstprivate clause, even if they are static data members. 436 DSAVarData DVarTemp = hasDSA(D, MatchesAnyClause(OMPC_firstprivate), 437 MatchesAlways(), FromParent); 438 if (DVarTemp.CKind == OMPC_firstprivate && DVarTemp.RefExpr) 439 return DVar; 440 441 DVar.CKind = OMPC_shared; 442 return DVar; 443 } 444 445 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 446 // in a Construct, C/C++, predetermined, p.7] 447 // Variables with static storage duration that are declared in a scope 448 // inside the construct are shared. 449 if (D->isStaticLocal()) { 450 DVar.CKind = OMPC_shared; 451 return DVar; 452 } 453 454 // Explicitly specified attributes and local variables with predetermined 455 // attributes. 456 auto I = std::prev(StartI); 457 if (I->SharingMap.count(D)) { 458 DVar.RefExpr = I->SharingMap[D].RefExpr; 459 DVar.CKind = I->SharingMap[D].Attributes; 460 DVar.ImplicitDSALoc = I->DefaultAttrLoc; 461 } 462 463 return DVar; 464 } 465 466 DSAStackTy::DSAVarData DSAStackTy::getImplicitDSA(VarDecl *D, bool FromParent) { 467 auto StartI = Stack.rbegin(); 468 auto EndI = std::prev(Stack.rend()); 469 if (FromParent && StartI != EndI) { 470 StartI = std::next(StartI); 471 } 472 return getDSA(StartI, D); 473 } 474 475 template <class ClausesPredicate, class DirectivesPredicate> 476 DSAStackTy::DSAVarData DSAStackTy::hasDSA(VarDecl *D, ClausesPredicate CPred, 477 DirectivesPredicate DPred, 478 bool FromParent) { 479 auto StartI = std::next(Stack.rbegin()); 480 auto EndI = std::prev(Stack.rend()); 481 if (FromParent && StartI != EndI) { 482 StartI = std::next(StartI); 483 } 484 for (auto I = StartI, EE = EndI; I != EE; ++I) { 485 if (!DPred(I->Directive) && !isParallelOrTaskRegion(I->Directive)) 486 continue; 487 DSAVarData DVar = getDSA(I, D); 488 if (CPred(DVar.CKind)) 489 return DVar; 490 } 491 return DSAVarData(); 492 } 493 494 template <class ClausesPredicate, class DirectivesPredicate> 495 DSAStackTy::DSAVarData 496 DSAStackTy::hasInnermostDSA(VarDecl *D, ClausesPredicate CPred, 497 DirectivesPredicate DPred, bool FromParent) { 498 auto StartI = std::next(Stack.rbegin()); 499 auto EndI = std::prev(Stack.rend()); 500 if (FromParent && StartI != EndI) { 501 StartI = std::next(StartI); 502 } 503 for (auto I = StartI, EE = EndI; I != EE; ++I) { 504 if (!DPred(I->Directive)) 505 break; 506 DSAVarData DVar = getDSA(I, D); 507 if (CPred(DVar.CKind)) 508 return DVar; 509 return DSAVarData(); 510 } 511 return DSAVarData(); 512 } 513 514 template <class NamedDirectivesPredicate> 515 bool DSAStackTy::hasDirective(NamedDirectivesPredicate DPred, bool FromParent) { 516 auto StartI = std::next(Stack.rbegin()); 517 auto EndI = std::prev(Stack.rend()); 518 if (FromParent && StartI != EndI) { 519 StartI = std::next(StartI); 520 } 521 for (auto I = StartI, EE = EndI; I != EE; ++I) { 522 if (DPred(I->Directive, I->DirectiveName, I->ConstructLoc)) 523 return true; 524 } 525 return false; 526 } 527 528 void Sema::InitDataSharingAttributesStack() { 529 VarDataSharingAttributesStack = new DSAStackTy(*this); 530 } 531 532 #define DSAStack static_cast<DSAStackTy *>(VarDataSharingAttributesStack) 533 534 void Sema::DestroyDataSharingAttributesStack() { delete DSAStack; } 535 536 void Sema::StartOpenMPDSABlock(OpenMPDirectiveKind DKind, 537 const DeclarationNameInfo &DirName, 538 Scope *CurScope, SourceLocation Loc) { 539 DSAStack->push(DKind, DirName, CurScope, Loc); 540 PushExpressionEvaluationContext(PotentiallyEvaluated); 541 } 542 543 void Sema::EndOpenMPDSABlock(Stmt *CurDirective) { 544 // OpenMP [2.14.3.5, Restrictions, C/C++, p.1] 545 // A variable of class type (or array thereof) that appears in a lastprivate 546 // clause requires an accessible, unambiguous default constructor for the 547 // class type, unless the list item is also specified in a firstprivate 548 // clause. 549 if (auto D = dyn_cast_or_null<OMPExecutableDirective>(CurDirective)) { 550 for (auto C : D->clauses()) { 551 if (auto Clause = dyn_cast<OMPLastprivateClause>(C)) { 552 for (auto VarRef : Clause->varlists()) { 553 if (VarRef->isValueDependent() || VarRef->isTypeDependent()) 554 continue; 555 auto VD = cast<VarDecl>(cast<DeclRefExpr>(VarRef)->getDecl()); 556 auto DVar = DSAStack->getTopDSA(VD, false); 557 if (DVar.CKind == OMPC_lastprivate) { 558 SourceLocation ELoc = VarRef->getExprLoc(); 559 auto Type = VarRef->getType(); 560 if (Type->isArrayType()) 561 Type = QualType(Type->getArrayElementTypeNoTypeQual(), 0); 562 CXXRecordDecl *RD = 563 getLangOpts().CPlusPlus ? Type->getAsCXXRecordDecl() : nullptr; 564 // FIXME This code must be replaced by actual constructing of the 565 // lastprivate variable. 566 if (RD) { 567 CXXConstructorDecl *CD = LookupDefaultConstructor(RD); 568 PartialDiagnostic PD = 569 PartialDiagnostic(PartialDiagnostic::NullDiagnostic()); 570 if (!CD || 571 CheckConstructorAccess( 572 ELoc, CD, InitializedEntity::InitializeTemporary(Type), 573 CD->getAccess(), PD) == AR_inaccessible || 574 CD->isDeleted()) { 575 Diag(ELoc, diag::err_omp_required_method) 576 << getOpenMPClauseName(OMPC_lastprivate) << 0; 577 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 578 VarDecl::DeclarationOnly; 579 Diag(VD->getLocation(), IsDecl ? diag::note_previous_decl 580 : diag::note_defined_here) 581 << VD; 582 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 583 continue; 584 } 585 MarkFunctionReferenced(ELoc, CD); 586 DiagnoseUseOfDecl(CD, ELoc); 587 } 588 } 589 } 590 } 591 } 592 } 593 594 DSAStack->pop(); 595 DiscardCleanupsInEvaluationContext(); 596 PopExpressionEvaluationContext(); 597 } 598 599 namespace { 600 601 class VarDeclFilterCCC : public CorrectionCandidateCallback { 602 private: 603 Sema &SemaRef; 604 605 public: 606 explicit VarDeclFilterCCC(Sema &S) : SemaRef(S) {} 607 bool ValidateCandidate(const TypoCorrection &Candidate) override { 608 NamedDecl *ND = Candidate.getCorrectionDecl(); 609 if (VarDecl *VD = dyn_cast_or_null<VarDecl>(ND)) { 610 return VD->hasGlobalStorage() && 611 SemaRef.isDeclInScope(ND, SemaRef.getCurLexicalContext(), 612 SemaRef.getCurScope()); 613 } 614 return false; 615 } 616 }; 617 } // namespace 618 619 ExprResult Sema::ActOnOpenMPIdExpression(Scope *CurScope, 620 CXXScopeSpec &ScopeSpec, 621 const DeclarationNameInfo &Id) { 622 LookupResult Lookup(*this, Id, LookupOrdinaryName); 623 LookupParsedName(Lookup, CurScope, &ScopeSpec, true); 624 625 if (Lookup.isAmbiguous()) 626 return ExprError(); 627 628 VarDecl *VD; 629 if (!Lookup.isSingleResult()) { 630 VarDeclFilterCCC Validator(*this); 631 if (TypoCorrection Corrected = 632 CorrectTypo(Id, LookupOrdinaryName, CurScope, nullptr, Validator, 633 CTK_ErrorRecovery)) { 634 diagnoseTypo(Corrected, 635 PDiag(Lookup.empty() 636 ? diag::err_undeclared_var_use_suggest 637 : diag::err_omp_expected_var_arg_suggest) 638 << Id.getName()); 639 VD = Corrected.getCorrectionDeclAs<VarDecl>(); 640 } else { 641 Diag(Id.getLoc(), Lookup.empty() ? diag::err_undeclared_var_use 642 : diag::err_omp_expected_var_arg) 643 << Id.getName(); 644 return ExprError(); 645 } 646 } else { 647 if (!(VD = Lookup.getAsSingle<VarDecl>())) { 648 Diag(Id.getLoc(), diag::err_omp_expected_var_arg) << Id.getName(); 649 Diag(Lookup.getFoundDecl()->getLocation(), diag::note_declared_at); 650 return ExprError(); 651 } 652 } 653 Lookup.suppressDiagnostics(); 654 655 // OpenMP [2.9.2, Syntax, C/C++] 656 // Variables must be file-scope, namespace-scope, or static block-scope. 657 if (!VD->hasGlobalStorage()) { 658 Diag(Id.getLoc(), diag::err_omp_global_var_arg) 659 << getOpenMPDirectiveName(OMPD_threadprivate) << !VD->isStaticLocal(); 660 bool IsDecl = 661 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 662 Diag(VD->getLocation(), 663 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 664 << VD; 665 return ExprError(); 666 } 667 668 VarDecl *CanonicalVD = VD->getCanonicalDecl(); 669 NamedDecl *ND = cast<NamedDecl>(CanonicalVD); 670 // OpenMP [2.9.2, Restrictions, C/C++, p.2] 671 // A threadprivate directive for file-scope variables must appear outside 672 // any definition or declaration. 673 if (CanonicalVD->getDeclContext()->isTranslationUnit() && 674 !getCurLexicalContext()->isTranslationUnit()) { 675 Diag(Id.getLoc(), diag::err_omp_var_scope) 676 << getOpenMPDirectiveName(OMPD_threadprivate) << VD; 677 bool IsDecl = 678 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 679 Diag(VD->getLocation(), 680 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 681 << VD; 682 return ExprError(); 683 } 684 // OpenMP [2.9.2, Restrictions, C/C++, p.3] 685 // A threadprivate directive for static class member variables must appear 686 // in the class definition, in the same scope in which the member 687 // variables are declared. 688 if (CanonicalVD->isStaticDataMember() && 689 !CanonicalVD->getDeclContext()->Equals(getCurLexicalContext())) { 690 Diag(Id.getLoc(), diag::err_omp_var_scope) 691 << getOpenMPDirectiveName(OMPD_threadprivate) << VD; 692 bool IsDecl = 693 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 694 Diag(VD->getLocation(), 695 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 696 << VD; 697 return ExprError(); 698 } 699 // OpenMP [2.9.2, Restrictions, C/C++, p.4] 700 // A threadprivate directive for namespace-scope variables must appear 701 // outside any definition or declaration other than the namespace 702 // definition itself. 703 if (CanonicalVD->getDeclContext()->isNamespace() && 704 (!getCurLexicalContext()->isFileContext() || 705 !getCurLexicalContext()->Encloses(CanonicalVD->getDeclContext()))) { 706 Diag(Id.getLoc(), diag::err_omp_var_scope) 707 << getOpenMPDirectiveName(OMPD_threadprivate) << VD; 708 bool IsDecl = 709 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 710 Diag(VD->getLocation(), 711 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 712 << VD; 713 return ExprError(); 714 } 715 // OpenMP [2.9.2, Restrictions, C/C++, p.6] 716 // A threadprivate directive for static block-scope variables must appear 717 // in the scope of the variable and not in a nested scope. 718 if (CanonicalVD->isStaticLocal() && CurScope && 719 !isDeclInScope(ND, getCurLexicalContext(), CurScope)) { 720 Diag(Id.getLoc(), diag::err_omp_var_scope) 721 << getOpenMPDirectiveName(OMPD_threadprivate) << VD; 722 bool IsDecl = 723 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 724 Diag(VD->getLocation(), 725 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 726 << VD; 727 return ExprError(); 728 } 729 730 // OpenMP [2.9.2, Restrictions, C/C++, p.2-6] 731 // A threadprivate directive must lexically precede all references to any 732 // of the variables in its list. 733 if (VD->isUsed()) { 734 Diag(Id.getLoc(), diag::err_omp_var_used) 735 << getOpenMPDirectiveName(OMPD_threadprivate) << VD; 736 return ExprError(); 737 } 738 739 QualType ExprType = VD->getType().getNonReferenceType(); 740 ExprResult DE = BuildDeclRefExpr(VD, ExprType, VK_LValue, Id.getLoc()); 741 return DE; 742 } 743 744 Sema::DeclGroupPtrTy 745 Sema::ActOnOpenMPThreadprivateDirective(SourceLocation Loc, 746 ArrayRef<Expr *> VarList) { 747 if (OMPThreadPrivateDecl *D = CheckOMPThreadPrivateDecl(Loc, VarList)) { 748 CurContext->addDecl(D); 749 return DeclGroupPtrTy::make(DeclGroupRef(D)); 750 } 751 return DeclGroupPtrTy(); 752 } 753 754 namespace { 755 class LocalVarRefChecker : public ConstStmtVisitor<LocalVarRefChecker, bool> { 756 Sema &SemaRef; 757 758 public: 759 bool VisitDeclRefExpr(const DeclRefExpr *E) { 760 if (auto VD = dyn_cast<VarDecl>(E->getDecl())) { 761 if (VD->hasLocalStorage()) { 762 SemaRef.Diag(E->getLocStart(), 763 diag::err_omp_local_var_in_threadprivate_init) 764 << E->getSourceRange(); 765 SemaRef.Diag(VD->getLocation(), diag::note_defined_here) 766 << VD << VD->getSourceRange(); 767 return true; 768 } 769 } 770 return false; 771 } 772 bool VisitStmt(const Stmt *S) { 773 for (auto Child : S->children()) { 774 if (Child && Visit(Child)) 775 return true; 776 } 777 return false; 778 } 779 explicit LocalVarRefChecker(Sema &SemaRef) : SemaRef(SemaRef) {} 780 }; 781 } // namespace 782 783 OMPThreadPrivateDecl * 784 Sema::CheckOMPThreadPrivateDecl(SourceLocation Loc, ArrayRef<Expr *> VarList) { 785 SmallVector<Expr *, 8> Vars; 786 for (auto &RefExpr : VarList) { 787 DeclRefExpr *DE = cast<DeclRefExpr>(RefExpr); 788 VarDecl *VD = cast<VarDecl>(DE->getDecl()); 789 SourceLocation ILoc = DE->getExprLoc(); 790 791 // OpenMP [2.9.2, Restrictions, C/C++, p.10] 792 // A threadprivate variable must not have an incomplete type. 793 if (RequireCompleteType(ILoc, VD->getType(), 794 diag::err_omp_threadprivate_incomplete_type)) { 795 continue; 796 } 797 798 // OpenMP [2.9.2, Restrictions, C/C++, p.10] 799 // A threadprivate variable must not have a reference type. 800 if (VD->getType()->isReferenceType()) { 801 Diag(ILoc, diag::err_omp_ref_type_arg) 802 << getOpenMPDirectiveName(OMPD_threadprivate) << VD->getType(); 803 bool IsDecl = 804 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 805 Diag(VD->getLocation(), 806 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 807 << VD; 808 continue; 809 } 810 811 // Check if this is a TLS variable. 812 if (VD->getTLSKind()) { 813 Diag(ILoc, diag::err_omp_var_thread_local) << VD; 814 bool IsDecl = 815 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 816 Diag(VD->getLocation(), 817 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 818 << VD; 819 continue; 820 } 821 822 // Check if initial value of threadprivate variable reference variable with 823 // local storage (it is not supported by runtime). 824 if (auto Init = VD->getAnyInitializer()) { 825 LocalVarRefChecker Checker(*this); 826 if (Checker.Visit(Init)) 827 continue; 828 } 829 830 Vars.push_back(RefExpr); 831 DSAStack->addDSA(VD, DE, OMPC_threadprivate); 832 } 833 OMPThreadPrivateDecl *D = nullptr; 834 if (!Vars.empty()) { 835 D = OMPThreadPrivateDecl::Create(Context, getCurLexicalContext(), Loc, 836 Vars); 837 D->setAccess(AS_public); 838 } 839 return D; 840 } 841 842 static void ReportOriginalDSA(Sema &SemaRef, DSAStackTy *Stack, 843 const VarDecl *VD, DSAStackTy::DSAVarData DVar, 844 bool IsLoopIterVar = false) { 845 if (DVar.RefExpr) { 846 SemaRef.Diag(DVar.RefExpr->getExprLoc(), diag::note_omp_explicit_dsa) 847 << getOpenMPClauseName(DVar.CKind); 848 return; 849 } 850 enum { 851 PDSA_StaticMemberShared, 852 PDSA_StaticLocalVarShared, 853 PDSA_LoopIterVarPrivate, 854 PDSA_LoopIterVarLinear, 855 PDSA_LoopIterVarLastprivate, 856 PDSA_ConstVarShared, 857 PDSA_GlobalVarShared, 858 PDSA_TaskVarFirstprivate, 859 PDSA_LocalVarPrivate, 860 PDSA_Implicit 861 } Reason = PDSA_Implicit; 862 bool ReportHint = false; 863 auto ReportLoc = VD->getLocation(); 864 if (IsLoopIterVar) { 865 if (DVar.CKind == OMPC_private) 866 Reason = PDSA_LoopIterVarPrivate; 867 else if (DVar.CKind == OMPC_lastprivate) 868 Reason = PDSA_LoopIterVarLastprivate; 869 else 870 Reason = PDSA_LoopIterVarLinear; 871 } else if (DVar.DKind == OMPD_task && DVar.CKind == OMPC_firstprivate) { 872 Reason = PDSA_TaskVarFirstprivate; 873 ReportLoc = DVar.ImplicitDSALoc; 874 } else if (VD->isStaticLocal()) 875 Reason = PDSA_StaticLocalVarShared; 876 else if (VD->isStaticDataMember()) 877 Reason = PDSA_StaticMemberShared; 878 else if (VD->isFileVarDecl()) 879 Reason = PDSA_GlobalVarShared; 880 else if (VD->getType().isConstant(SemaRef.getASTContext())) 881 Reason = PDSA_ConstVarShared; 882 else if (VD->isLocalVarDecl() && DVar.CKind == OMPC_private) { 883 ReportHint = true; 884 Reason = PDSA_LocalVarPrivate; 885 } 886 if (Reason != PDSA_Implicit) { 887 SemaRef.Diag(ReportLoc, diag::note_omp_predetermined_dsa) 888 << Reason << ReportHint 889 << getOpenMPDirectiveName(Stack->getCurrentDirective()); 890 } else if (DVar.ImplicitDSALoc.isValid()) { 891 SemaRef.Diag(DVar.ImplicitDSALoc, diag::note_omp_implicit_dsa) 892 << getOpenMPClauseName(DVar.CKind); 893 } 894 } 895 896 namespace { 897 class DSAAttrChecker : public StmtVisitor<DSAAttrChecker, void> { 898 DSAStackTy *Stack; 899 Sema &SemaRef; 900 bool ErrorFound; 901 CapturedStmt *CS; 902 llvm::SmallVector<Expr *, 8> ImplicitFirstprivate; 903 llvm::DenseMap<VarDecl *, Expr *> VarsWithInheritedDSA; 904 905 public: 906 void VisitDeclRefExpr(DeclRefExpr *E) { 907 if (auto *VD = dyn_cast<VarDecl>(E->getDecl())) { 908 // Skip internally declared variables. 909 if (VD->isLocalVarDecl() && !CS->capturesVariable(VD)) 910 return; 911 912 auto DVar = Stack->getTopDSA(VD, false); 913 // Check if the variable has explicit DSA set and stop analysis if it so. 914 if (DVar.RefExpr) return; 915 916 auto ELoc = E->getExprLoc(); 917 auto DKind = Stack->getCurrentDirective(); 918 // The default(none) clause requires that each variable that is referenced 919 // in the construct, and does not have a predetermined data-sharing 920 // attribute, must have its data-sharing attribute explicitly determined 921 // by being listed in a data-sharing attribute clause. 922 if (DVar.CKind == OMPC_unknown && Stack->getDefaultDSA() == DSA_none && 923 isParallelOrTaskRegion(DKind) && 924 VarsWithInheritedDSA.count(VD) == 0) { 925 VarsWithInheritedDSA[VD] = E; 926 return; 927 } 928 929 // OpenMP [2.9.3.6, Restrictions, p.2] 930 // A list item that appears in a reduction clause of the innermost 931 // enclosing worksharing or parallel construct may not be accessed in an 932 // explicit task. 933 DVar = Stack->hasInnermostDSA(VD, MatchesAnyClause(OMPC_reduction), 934 [](OpenMPDirectiveKind K) -> bool { 935 return isOpenMPParallelDirective(K) || 936 isOpenMPWorksharingDirective(K); 937 }, 938 false); 939 if (DKind == OMPD_task && DVar.CKind == OMPC_reduction) { 940 ErrorFound = true; 941 SemaRef.Diag(ELoc, diag::err_omp_reduction_in_task); 942 ReportOriginalDSA(SemaRef, Stack, VD, DVar); 943 return; 944 } 945 946 // Define implicit data-sharing attributes for task. 947 DVar = Stack->getImplicitDSA(VD, false); 948 if (DKind == OMPD_task && DVar.CKind != OMPC_shared) 949 ImplicitFirstprivate.push_back(E); 950 } 951 } 952 void VisitOMPExecutableDirective(OMPExecutableDirective *S) { 953 for (auto *C : S->clauses()) { 954 // Skip analysis of arguments of implicitly defined firstprivate clause 955 // for task directives. 956 if (C && (!isa<OMPFirstprivateClause>(C) || C->getLocStart().isValid())) 957 for (auto *CC : C->children()) { 958 if (CC) 959 Visit(CC); 960 } 961 } 962 } 963 void VisitStmt(Stmt *S) { 964 for (auto *C : S->children()) { 965 if (C && !isa<OMPExecutableDirective>(C)) 966 Visit(C); 967 } 968 } 969 970 bool isErrorFound() { return ErrorFound; } 971 ArrayRef<Expr *> getImplicitFirstprivate() { return ImplicitFirstprivate; } 972 llvm::DenseMap<VarDecl *, Expr *> &getVarsWithInheritedDSA() { 973 return VarsWithInheritedDSA; 974 } 975 976 DSAAttrChecker(DSAStackTy *S, Sema &SemaRef, CapturedStmt *CS) 977 : Stack(S), SemaRef(SemaRef), ErrorFound(false), CS(CS) {} 978 }; 979 } // namespace 980 981 void Sema::ActOnOpenMPRegionStart(OpenMPDirectiveKind DKind, Scope *CurScope) { 982 switch (DKind) { 983 case OMPD_parallel: { 984 QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1); 985 QualType KmpInt32PtrTy = Context.getPointerType(KmpInt32Ty); 986 Sema::CapturedParamNameType Params[] = { 987 std::make_pair(".global_tid.", KmpInt32PtrTy), 988 std::make_pair(".bound_tid.", KmpInt32PtrTy), 989 std::make_pair(StringRef(), QualType()) // __context with shared vars 990 }; 991 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 992 Params); 993 break; 994 } 995 case OMPD_simd: { 996 Sema::CapturedParamNameType Params[] = { 997 std::make_pair(StringRef(), QualType()) // __context with shared vars 998 }; 999 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1000 Params); 1001 break; 1002 } 1003 case OMPD_for: { 1004 Sema::CapturedParamNameType Params[] = { 1005 std::make_pair(StringRef(), QualType()) // __context with shared vars 1006 }; 1007 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1008 Params); 1009 break; 1010 } 1011 case OMPD_for_simd: { 1012 Sema::CapturedParamNameType Params[] = { 1013 std::make_pair(StringRef(), QualType()) // __context with shared vars 1014 }; 1015 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1016 Params); 1017 break; 1018 } 1019 case OMPD_sections: { 1020 Sema::CapturedParamNameType Params[] = { 1021 std::make_pair(StringRef(), QualType()) // __context with shared vars 1022 }; 1023 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1024 Params); 1025 break; 1026 } 1027 case OMPD_section: { 1028 Sema::CapturedParamNameType Params[] = { 1029 std::make_pair(StringRef(), QualType()) // __context with shared vars 1030 }; 1031 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1032 Params); 1033 break; 1034 } 1035 case OMPD_single: { 1036 Sema::CapturedParamNameType Params[] = { 1037 std::make_pair(StringRef(), QualType()) // __context with shared vars 1038 }; 1039 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1040 Params); 1041 break; 1042 } 1043 case OMPD_master: { 1044 Sema::CapturedParamNameType Params[] = { 1045 std::make_pair(StringRef(), QualType()) // __context with shared vars 1046 }; 1047 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1048 Params); 1049 break; 1050 } 1051 case OMPD_critical: { 1052 Sema::CapturedParamNameType Params[] = { 1053 std::make_pair(StringRef(), QualType()) // __context with shared vars 1054 }; 1055 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1056 Params); 1057 break; 1058 } 1059 case OMPD_parallel_for: { 1060 QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1); 1061 QualType KmpInt32PtrTy = Context.getPointerType(KmpInt32Ty); 1062 Sema::CapturedParamNameType Params[] = { 1063 std::make_pair(".global_tid.", KmpInt32PtrTy), 1064 std::make_pair(".bound_tid.", KmpInt32PtrTy), 1065 std::make_pair(StringRef(), QualType()) // __context with shared vars 1066 }; 1067 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1068 Params); 1069 break; 1070 } 1071 case OMPD_parallel_for_simd: { 1072 QualType KmpInt32Ty = Context.getIntTypeForBitwidth(32, 1); 1073 QualType KmpInt32PtrTy = Context.getPointerType(KmpInt32Ty); 1074 Sema::CapturedParamNameType Params[] = { 1075 std::make_pair(".global_tid.", KmpInt32PtrTy), 1076 std::make_pair(".bound_tid.", KmpInt32PtrTy), 1077 std::make_pair(StringRef(), QualType()) // __context with shared vars 1078 }; 1079 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1080 Params); 1081 break; 1082 } 1083 case OMPD_parallel_sections: { 1084 Sema::CapturedParamNameType Params[] = { 1085 std::make_pair(StringRef(), QualType()) // __context with shared vars 1086 }; 1087 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1088 Params); 1089 break; 1090 } 1091 case OMPD_task: { 1092 Sema::CapturedParamNameType Params[] = { 1093 std::make_pair(StringRef(), QualType()) // __context with shared vars 1094 }; 1095 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1096 Params); 1097 break; 1098 } 1099 case OMPD_taskyield: { 1100 Sema::CapturedParamNameType Params[] = { 1101 std::make_pair(StringRef(), QualType()) // __context with shared vars 1102 }; 1103 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1104 Params); 1105 break; 1106 } 1107 case OMPD_barrier: { 1108 Sema::CapturedParamNameType Params[] = { 1109 std::make_pair(StringRef(), QualType()) // __context with shared vars 1110 }; 1111 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1112 Params); 1113 break; 1114 } 1115 case OMPD_taskwait: { 1116 Sema::CapturedParamNameType Params[] = { 1117 std::make_pair(StringRef(), QualType()) // __context with shared vars 1118 }; 1119 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1120 Params); 1121 break; 1122 } 1123 case OMPD_flush: { 1124 Sema::CapturedParamNameType Params[] = { 1125 std::make_pair(StringRef(), QualType()) // __context with shared vars 1126 }; 1127 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1128 Params); 1129 break; 1130 } 1131 case OMPD_ordered: { 1132 Sema::CapturedParamNameType Params[] = { 1133 std::make_pair(StringRef(), QualType()) // __context with shared vars 1134 }; 1135 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1136 Params); 1137 break; 1138 } 1139 case OMPD_atomic: { 1140 Sema::CapturedParamNameType Params[] = { 1141 std::make_pair(StringRef(), QualType()) // __context with shared vars 1142 }; 1143 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1144 Params); 1145 break; 1146 } 1147 case OMPD_target: { 1148 Sema::CapturedParamNameType Params[] = { 1149 std::make_pair(StringRef(), QualType()) // __context with shared vars 1150 }; 1151 ActOnCapturedRegionStart(DSAStack->getConstructLoc(), CurScope, CR_OpenMP, 1152 Params); 1153 break; 1154 } 1155 case OMPD_threadprivate: 1156 llvm_unreachable("OpenMP Directive is not allowed"); 1157 case OMPD_unknown: 1158 llvm_unreachable("Unknown OpenMP directive"); 1159 } 1160 } 1161 1162 static bool CheckNestingOfRegions(Sema &SemaRef, DSAStackTy *Stack, 1163 OpenMPDirectiveKind CurrentRegion, 1164 const DeclarationNameInfo &CurrentName, 1165 SourceLocation StartLoc) { 1166 // Allowed nesting of constructs 1167 // +------------------+-----------------+------------------------------------+ 1168 // | Parent directive | Child directive | Closely (!), No-Closely(+), Both(*)| 1169 // +------------------+-----------------+------------------------------------+ 1170 // | parallel | parallel | * | 1171 // | parallel | for | * | 1172 // | parallel | for simd | * | 1173 // | parallel | master | * | 1174 // | parallel | critical | * | 1175 // | parallel | simd | * | 1176 // | parallel | sections | * | 1177 // | parallel | section | + | 1178 // | parallel | single | * | 1179 // | parallel | parallel for | * | 1180 // | parallel |parallel for simd| * | 1181 // | parallel |parallel sections| * | 1182 // | parallel | task | * | 1183 // | parallel | taskyield | * | 1184 // | parallel | barrier | * | 1185 // | parallel | taskwait | * | 1186 // | parallel | flush | * | 1187 // | parallel | ordered | + | 1188 // | parallel | atomic | * | 1189 // | parallel | target | * | 1190 // +------------------+-----------------+------------------------------------+ 1191 // | for | parallel | * | 1192 // | for | for | + | 1193 // | for | for simd | + | 1194 // | for | master | + | 1195 // | for | critical | * | 1196 // | for | simd | * | 1197 // | for | sections | + | 1198 // | for | section | + | 1199 // | for | single | + | 1200 // | for | parallel for | * | 1201 // | for |parallel for simd| * | 1202 // | for |parallel sections| * | 1203 // | for | task | * | 1204 // | for | taskyield | * | 1205 // | for | barrier | + | 1206 // | for | taskwait | * | 1207 // | for | flush | * | 1208 // | for | ordered | * (if construct is ordered) | 1209 // | for | atomic | * | 1210 // | for | target | * | 1211 // +------------------+-----------------+------------------------------------+ 1212 // | master | parallel | * | 1213 // | master | for | + | 1214 // | master | for simd | + | 1215 // | master | master | * | 1216 // | master | critical | * | 1217 // | master | simd | * | 1218 // | master | sections | + | 1219 // | master | section | + | 1220 // | master | single | + | 1221 // | master | parallel for | * | 1222 // | master |parallel for simd| * | 1223 // | master |parallel sections| * | 1224 // | master | task | * | 1225 // | master | taskyield | * | 1226 // | master | barrier | + | 1227 // | master | taskwait | * | 1228 // | master | flush | * | 1229 // | master | ordered | + | 1230 // | master | atomic | * | 1231 // | master | target | * | 1232 // +------------------+-----------------+------------------------------------+ 1233 // | critical | parallel | * | 1234 // | critical | for | + | 1235 // | critical | for simd | + | 1236 // | critical | master | * | 1237 // | critical | critical | * (should have different names) | 1238 // | critical | simd | * | 1239 // | critical | sections | + | 1240 // | critical | section | + | 1241 // | critical | single | + | 1242 // | critical | parallel for | * | 1243 // | critical |parallel for simd| * | 1244 // | critical |parallel sections| * | 1245 // | critical | task | * | 1246 // | critical | taskyield | * | 1247 // | critical | barrier | + | 1248 // | critical | taskwait | * | 1249 // | critical | ordered | + | 1250 // | critical | atomic | * | 1251 // | critical | target | * | 1252 // +------------------+-----------------+------------------------------------+ 1253 // | simd | parallel | | 1254 // | simd | for | | 1255 // | simd | for simd | | 1256 // | simd | master | | 1257 // | simd | critical | | 1258 // | simd | simd | | 1259 // | simd | sections | | 1260 // | simd | section | | 1261 // | simd | single | | 1262 // | simd | parallel for | | 1263 // | simd |parallel for simd| | 1264 // | simd |parallel sections| | 1265 // | simd | task | | 1266 // | simd | taskyield | | 1267 // | simd | barrier | | 1268 // | simd | taskwait | | 1269 // | simd | flush | | 1270 // | simd | ordered | | 1271 // | simd | atomic | | 1272 // | simd | target | | 1273 // +------------------+-----------------+------------------------------------+ 1274 // | for simd | parallel | | 1275 // | for simd | for | | 1276 // | for simd | for simd | | 1277 // | for simd | master | | 1278 // | for simd | critical | | 1279 // | for simd | simd | | 1280 // | for simd | sections | | 1281 // | for simd | section | | 1282 // | for simd | single | | 1283 // | for simd | parallel for | | 1284 // | for simd |parallel for simd| | 1285 // | for simd |parallel sections| | 1286 // | for simd | task | | 1287 // | for simd | taskyield | | 1288 // | for simd | barrier | | 1289 // | for simd | taskwait | | 1290 // | for simd | flush | | 1291 // | for simd | ordered | | 1292 // | for simd | atomic | | 1293 // | for simd | target | | 1294 // +------------------+-----------------+------------------------------------+ 1295 // | parallel for simd| parallel | | 1296 // | parallel for simd| for | | 1297 // | parallel for simd| for simd | | 1298 // | parallel for simd| master | | 1299 // | parallel for simd| critical | | 1300 // | parallel for simd| simd | | 1301 // | parallel for simd| sections | | 1302 // | parallel for simd| section | | 1303 // | parallel for simd| single | | 1304 // | parallel for simd| parallel for | | 1305 // | parallel for simd|parallel for simd| | 1306 // | parallel for simd|parallel sections| | 1307 // | parallel for simd| task | | 1308 // | parallel for simd| taskyield | | 1309 // | parallel for simd| barrier | | 1310 // | parallel for simd| taskwait | | 1311 // | parallel for simd| flush | | 1312 // | parallel for simd| ordered | | 1313 // | parallel for simd| atomic | | 1314 // | parallel for simd| target | | 1315 // +------------------+-----------------+------------------------------------+ 1316 // | sections | parallel | * | 1317 // | sections | for | + | 1318 // | sections | for simd | + | 1319 // | sections | master | + | 1320 // | sections | critical | * | 1321 // | sections | simd | * | 1322 // | sections | sections | + | 1323 // | sections | section | * | 1324 // | sections | single | + | 1325 // | sections | parallel for | * | 1326 // | sections |parallel for simd| * | 1327 // | sections |parallel sections| * | 1328 // | sections | task | * | 1329 // | sections | taskyield | * | 1330 // | sections | barrier | + | 1331 // | sections | taskwait | * | 1332 // | sections | flush | * | 1333 // | sections | ordered | + | 1334 // | sections | atomic | * | 1335 // | sections | target | * | 1336 // +------------------+-----------------+------------------------------------+ 1337 // | section | parallel | * | 1338 // | section | for | + | 1339 // | section | for simd | + | 1340 // | section | master | + | 1341 // | section | critical | * | 1342 // | section | simd | * | 1343 // | section | sections | + | 1344 // | section | section | + | 1345 // | section | single | + | 1346 // | section | parallel for | * | 1347 // | section |parallel for simd| * | 1348 // | section |parallel sections| * | 1349 // | section | task | * | 1350 // | section | taskyield | * | 1351 // | section | barrier | + | 1352 // | section | taskwait | * | 1353 // | section | flush | * | 1354 // | section | ordered | + | 1355 // | section | atomic | * | 1356 // | section | target | * | 1357 // +------------------+-----------------+------------------------------------+ 1358 // | single | parallel | * | 1359 // | single | for | + | 1360 // | single | for simd | + | 1361 // | single | master | + | 1362 // | single | critical | * | 1363 // | single | simd | * | 1364 // | single | sections | + | 1365 // | single | section | + | 1366 // | single | single | + | 1367 // | single | parallel for | * | 1368 // | single |parallel for simd| * | 1369 // | single |parallel sections| * | 1370 // | single | task | * | 1371 // | single | taskyield | * | 1372 // | single | barrier | + | 1373 // | single | taskwait | * | 1374 // | single | flush | * | 1375 // | single | ordered | + | 1376 // | single | atomic | * | 1377 // | single | target | * | 1378 // +------------------+-----------------+------------------------------------+ 1379 // | parallel for | parallel | * | 1380 // | parallel for | for | + | 1381 // | parallel for | for simd | + | 1382 // | parallel for | master | + | 1383 // | parallel for | critical | * | 1384 // | parallel for | simd | * | 1385 // | parallel for | sections | + | 1386 // | parallel for | section | + | 1387 // | parallel for | single | + | 1388 // | parallel for | parallel for | * | 1389 // | parallel for |parallel for simd| * | 1390 // | parallel for |parallel sections| * | 1391 // | parallel for | task | * | 1392 // | parallel for | taskyield | * | 1393 // | parallel for | barrier | + | 1394 // | parallel for | taskwait | * | 1395 // | parallel for | flush | * | 1396 // | parallel for | ordered | * (if construct is ordered) | 1397 // | parallel for | atomic | * | 1398 // | parallel for | target | * | 1399 // +------------------+-----------------+------------------------------------+ 1400 // | parallel sections| parallel | * | 1401 // | parallel sections| for | + | 1402 // | parallel sections| for simd | + | 1403 // | parallel sections| master | + | 1404 // | parallel sections| critical | + | 1405 // | parallel sections| simd | * | 1406 // | parallel sections| sections | + | 1407 // | parallel sections| section | * | 1408 // | parallel sections| single | + | 1409 // | parallel sections| parallel for | * | 1410 // | parallel sections|parallel for simd| * | 1411 // | parallel sections|parallel sections| * | 1412 // | parallel sections| task | * | 1413 // | parallel sections| taskyield | * | 1414 // | parallel sections| barrier | + | 1415 // | parallel sections| taskwait | * | 1416 // | parallel sections| flush | * | 1417 // | parallel sections| ordered | + | 1418 // | parallel sections| atomic | * | 1419 // | parallel sections| target | * | 1420 // +------------------+-----------------+------------------------------------+ 1421 // | task | parallel | * | 1422 // | task | for | + | 1423 // | task | for simd | + | 1424 // | task | master | + | 1425 // | task | critical | * | 1426 // | task | simd | * | 1427 // | task | sections | + | 1428 // | task | section | + | 1429 // | task | single | + | 1430 // | task | parallel for | * | 1431 // | task |parallel for simd| * | 1432 // | task |parallel sections| * | 1433 // | task | task | * | 1434 // | task | taskyield | * | 1435 // | task | barrier | + | 1436 // | task | taskwait | * | 1437 // | task | flush | * | 1438 // | task | ordered | + | 1439 // | task | atomic | * | 1440 // | task | target | * | 1441 // +------------------+-----------------+------------------------------------+ 1442 // | ordered | parallel | * | 1443 // | ordered | for | + | 1444 // | ordered | for simd | + | 1445 // | ordered | master | * | 1446 // | ordered | critical | * | 1447 // | ordered | simd | * | 1448 // | ordered | sections | + | 1449 // | ordered | section | + | 1450 // | ordered | single | + | 1451 // | ordered | parallel for | * | 1452 // | ordered |parallel for simd| * | 1453 // | ordered |parallel sections| * | 1454 // | ordered | task | * | 1455 // | ordered | taskyield | * | 1456 // | ordered | barrier | + | 1457 // | ordered | taskwait | * | 1458 // | ordered | flush | * | 1459 // | ordered | ordered | + | 1460 // | ordered | atomic | * | 1461 // | ordered | target | * | 1462 // +------------------+-----------------+------------------------------------+ 1463 // | atomic | parallel | | 1464 // | atomic | for | | 1465 // | atomic | for simd | | 1466 // | atomic | master | | 1467 // | atomic | critical | | 1468 // | atomic | simd | | 1469 // | atomic | sections | | 1470 // | atomic | section | | 1471 // | atomic | single | | 1472 // | atomic | parallel for | | 1473 // | atomic |parallel for simd| | 1474 // | atomic |parallel sections| | 1475 // | atomic | task | | 1476 // | atomic | taskyield | | 1477 // | atomic | barrier | | 1478 // | atomic | taskwait | | 1479 // | atomic | flush | | 1480 // | atomic | ordered | | 1481 // | atomic | atomic | | 1482 // | atomic | target | | 1483 // +------------------+-----------------+------------------------------------+ 1484 // | target | parallel | * | 1485 // | target | for | * | 1486 // | target | for simd | * | 1487 // | target | master | * | 1488 // | target | critical | * | 1489 // | target | simd | * | 1490 // | target | sections | * | 1491 // | target | section | * | 1492 // | target | single | * | 1493 // | target | parallel for | * | 1494 // | target |parallel for simd| * | 1495 // | target |parallel sections| * | 1496 // | target | task | * | 1497 // | target | taskyield | * | 1498 // | target | barrier | * | 1499 // | target | taskwait | * | 1500 // | target | flush | * | 1501 // | target | ordered | * | 1502 // | target | atomic | * | 1503 // | target | target | * | 1504 // +------------------+-----------------+------------------------------------+ 1505 if (Stack->getCurScope()) { 1506 auto ParentRegion = Stack->getParentDirective(); 1507 bool NestingProhibited = false; 1508 bool CloseNesting = true; 1509 enum { 1510 NoRecommend, 1511 ShouldBeInParallelRegion, 1512 ShouldBeInOrderedRegion 1513 } Recommend = NoRecommend; 1514 if (isOpenMPSimdDirective(ParentRegion)) { 1515 // OpenMP [2.16, Nesting of Regions] 1516 // OpenMP constructs may not be nested inside a simd region. 1517 SemaRef.Diag(StartLoc, diag::err_omp_prohibited_region_simd); 1518 return true; 1519 } 1520 if (ParentRegion == OMPD_atomic) { 1521 // OpenMP [2.16, Nesting of Regions] 1522 // OpenMP constructs may not be nested inside an atomic region. 1523 SemaRef.Diag(StartLoc, diag::err_omp_prohibited_region_atomic); 1524 return true; 1525 } 1526 if (CurrentRegion == OMPD_section) { 1527 // OpenMP [2.7.2, sections Construct, Restrictions] 1528 // Orphaned section directives are prohibited. That is, the section 1529 // directives must appear within the sections construct and must not be 1530 // encountered elsewhere in the sections region. 1531 if (ParentRegion != OMPD_sections && 1532 ParentRegion != OMPD_parallel_sections) { 1533 SemaRef.Diag(StartLoc, diag::err_omp_orphaned_section_directive) 1534 << (ParentRegion != OMPD_unknown) 1535 << getOpenMPDirectiveName(ParentRegion); 1536 return true; 1537 } 1538 return false; 1539 } 1540 // Allow some constructs to be orphaned (they could be used in functions, 1541 // called from OpenMP regions with the required preconditions). 1542 if (ParentRegion == OMPD_unknown) 1543 return false; 1544 if (CurrentRegion == OMPD_master) { 1545 // OpenMP [2.16, Nesting of Regions] 1546 // A master region may not be closely nested inside a worksharing, 1547 // atomic, or explicit task region. 1548 NestingProhibited = isOpenMPWorksharingDirective(ParentRegion) || 1549 ParentRegion == OMPD_task; 1550 } else if (CurrentRegion == OMPD_critical && CurrentName.getName()) { 1551 // OpenMP [2.16, Nesting of Regions] 1552 // A critical region may not be nested (closely or otherwise) inside a 1553 // critical region with the same name. Note that this restriction is not 1554 // sufficient to prevent deadlock. 1555 SourceLocation PreviousCriticalLoc; 1556 bool DeadLock = 1557 Stack->hasDirective([CurrentName, &PreviousCriticalLoc]( 1558 OpenMPDirectiveKind K, 1559 const DeclarationNameInfo &DNI, 1560 SourceLocation Loc) 1561 ->bool { 1562 if (K == OMPD_critical && 1563 DNI.getName() == CurrentName.getName()) { 1564 PreviousCriticalLoc = Loc; 1565 return true; 1566 } else 1567 return false; 1568 }, 1569 false /* skip top directive */); 1570 if (DeadLock) { 1571 SemaRef.Diag(StartLoc, 1572 diag::err_omp_prohibited_region_critical_same_name) 1573 << CurrentName.getName(); 1574 if (PreviousCriticalLoc.isValid()) 1575 SemaRef.Diag(PreviousCriticalLoc, 1576 diag::note_omp_previous_critical_region); 1577 return true; 1578 } 1579 } else if (CurrentRegion == OMPD_barrier) { 1580 // OpenMP [2.16, Nesting of Regions] 1581 // A barrier region may not be closely nested inside a worksharing, 1582 // explicit task, critical, ordered, atomic, or master region. 1583 NestingProhibited = 1584 isOpenMPWorksharingDirective(ParentRegion) || 1585 ParentRegion == OMPD_task || ParentRegion == OMPD_master || 1586 ParentRegion == OMPD_critical || ParentRegion == OMPD_ordered; 1587 } else if (isOpenMPWorksharingDirective(CurrentRegion) && 1588 !isOpenMPParallelDirective(CurrentRegion)) { 1589 // OpenMP [2.16, Nesting of Regions] 1590 // A worksharing region may not be closely nested inside a worksharing, 1591 // explicit task, critical, ordered, atomic, or master region. 1592 NestingProhibited = 1593 isOpenMPWorksharingDirective(ParentRegion) || 1594 ParentRegion == OMPD_task || ParentRegion == OMPD_master || 1595 ParentRegion == OMPD_critical || ParentRegion == OMPD_ordered; 1596 Recommend = ShouldBeInParallelRegion; 1597 } else if (CurrentRegion == OMPD_ordered) { 1598 // OpenMP [2.16, Nesting of Regions] 1599 // An ordered region may not be closely nested inside a critical, 1600 // atomic, or explicit task region. 1601 // An ordered region must be closely nested inside a loop region (or 1602 // parallel loop region) with an ordered clause. 1603 NestingProhibited = ParentRegion == OMPD_critical || 1604 ParentRegion == OMPD_task || 1605 !Stack->isParentOrderedRegion(); 1606 Recommend = ShouldBeInOrderedRegion; 1607 } 1608 if (NestingProhibited) { 1609 SemaRef.Diag(StartLoc, diag::err_omp_prohibited_region) 1610 << CloseNesting << getOpenMPDirectiveName(ParentRegion) << Recommend 1611 << getOpenMPDirectiveName(CurrentRegion); 1612 return true; 1613 } 1614 } 1615 return false; 1616 } 1617 1618 StmtResult Sema::ActOnOpenMPExecutableDirective(OpenMPDirectiveKind Kind, 1619 const DeclarationNameInfo &DirName, 1620 ArrayRef<OMPClause *> Clauses, 1621 Stmt *AStmt, 1622 SourceLocation StartLoc, 1623 SourceLocation EndLoc) { 1624 StmtResult Res = StmtError(); 1625 if (CheckNestingOfRegions(*this, DSAStack, Kind, DirName, StartLoc)) 1626 return StmtError(); 1627 1628 llvm::SmallVector<OMPClause *, 8> ClausesWithImplicit; 1629 llvm::DenseMap<VarDecl *, Expr *> VarsWithInheritedDSA; 1630 bool ErrorFound = false; 1631 ClausesWithImplicit.append(Clauses.begin(), Clauses.end()); 1632 if (AStmt) { 1633 assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); 1634 1635 // Check default data sharing attributes for referenced variables. 1636 DSAAttrChecker DSAChecker(DSAStack, *this, cast<CapturedStmt>(AStmt)); 1637 DSAChecker.Visit(cast<CapturedStmt>(AStmt)->getCapturedStmt()); 1638 if (DSAChecker.isErrorFound()) 1639 return StmtError(); 1640 // Generate list of implicitly defined firstprivate variables. 1641 VarsWithInheritedDSA = DSAChecker.getVarsWithInheritedDSA(); 1642 1643 if (!DSAChecker.getImplicitFirstprivate().empty()) { 1644 if (OMPClause *Implicit = ActOnOpenMPFirstprivateClause( 1645 DSAChecker.getImplicitFirstprivate(), SourceLocation(), 1646 SourceLocation(), SourceLocation())) { 1647 ClausesWithImplicit.push_back(Implicit); 1648 ErrorFound = cast<OMPFirstprivateClause>(Implicit)->varlist_size() != 1649 DSAChecker.getImplicitFirstprivate().size(); 1650 } else 1651 ErrorFound = true; 1652 } 1653 } 1654 1655 switch (Kind) { 1656 case OMPD_parallel: 1657 Res = ActOnOpenMPParallelDirective(ClausesWithImplicit, AStmt, StartLoc, 1658 EndLoc); 1659 break; 1660 case OMPD_simd: 1661 Res = ActOnOpenMPSimdDirective(ClausesWithImplicit, AStmt, StartLoc, EndLoc, 1662 VarsWithInheritedDSA); 1663 break; 1664 case OMPD_for: 1665 Res = ActOnOpenMPForDirective(ClausesWithImplicit, AStmt, StartLoc, EndLoc, 1666 VarsWithInheritedDSA); 1667 break; 1668 case OMPD_for_simd: 1669 Res = ActOnOpenMPForSimdDirective(ClausesWithImplicit, AStmt, StartLoc, 1670 EndLoc, VarsWithInheritedDSA); 1671 break; 1672 case OMPD_sections: 1673 Res = ActOnOpenMPSectionsDirective(ClausesWithImplicit, AStmt, StartLoc, 1674 EndLoc); 1675 break; 1676 case OMPD_section: 1677 assert(ClausesWithImplicit.empty() && 1678 "No clauses are allowed for 'omp section' directive"); 1679 Res = ActOnOpenMPSectionDirective(AStmt, StartLoc, EndLoc); 1680 break; 1681 case OMPD_single: 1682 Res = ActOnOpenMPSingleDirective(ClausesWithImplicit, AStmt, StartLoc, 1683 EndLoc); 1684 break; 1685 case OMPD_master: 1686 assert(ClausesWithImplicit.empty() && 1687 "No clauses are allowed for 'omp master' directive"); 1688 Res = ActOnOpenMPMasterDirective(AStmt, StartLoc, EndLoc); 1689 break; 1690 case OMPD_critical: 1691 assert(ClausesWithImplicit.empty() && 1692 "No clauses are allowed for 'omp critical' directive"); 1693 Res = ActOnOpenMPCriticalDirective(DirName, AStmt, StartLoc, EndLoc); 1694 break; 1695 case OMPD_parallel_for: 1696 Res = ActOnOpenMPParallelForDirective(ClausesWithImplicit, AStmt, StartLoc, 1697 EndLoc, VarsWithInheritedDSA); 1698 break; 1699 case OMPD_parallel_for_simd: 1700 Res = ActOnOpenMPParallelForSimdDirective( 1701 ClausesWithImplicit, AStmt, StartLoc, EndLoc, VarsWithInheritedDSA); 1702 break; 1703 case OMPD_parallel_sections: 1704 Res = ActOnOpenMPParallelSectionsDirective(ClausesWithImplicit, AStmt, 1705 StartLoc, EndLoc); 1706 break; 1707 case OMPD_task: 1708 Res = 1709 ActOnOpenMPTaskDirective(ClausesWithImplicit, AStmt, StartLoc, EndLoc); 1710 break; 1711 case OMPD_taskyield: 1712 assert(ClausesWithImplicit.empty() && 1713 "No clauses are allowed for 'omp taskyield' directive"); 1714 assert(AStmt == nullptr && 1715 "No associated statement allowed for 'omp taskyield' directive"); 1716 Res = ActOnOpenMPTaskyieldDirective(StartLoc, EndLoc); 1717 break; 1718 case OMPD_barrier: 1719 assert(ClausesWithImplicit.empty() && 1720 "No clauses are allowed for 'omp barrier' directive"); 1721 assert(AStmt == nullptr && 1722 "No associated statement allowed for 'omp barrier' directive"); 1723 Res = ActOnOpenMPBarrierDirective(StartLoc, EndLoc); 1724 break; 1725 case OMPD_taskwait: 1726 assert(ClausesWithImplicit.empty() && 1727 "No clauses are allowed for 'omp taskwait' directive"); 1728 assert(AStmt == nullptr && 1729 "No associated statement allowed for 'omp taskwait' directive"); 1730 Res = ActOnOpenMPTaskwaitDirective(StartLoc, EndLoc); 1731 break; 1732 case OMPD_flush: 1733 assert(AStmt == nullptr && 1734 "No associated statement allowed for 'omp flush' directive"); 1735 Res = ActOnOpenMPFlushDirective(ClausesWithImplicit, StartLoc, EndLoc); 1736 break; 1737 case OMPD_ordered: 1738 assert(ClausesWithImplicit.empty() && 1739 "No clauses are allowed for 'omp ordered' directive"); 1740 Res = ActOnOpenMPOrderedDirective(AStmt, StartLoc, EndLoc); 1741 break; 1742 case OMPD_atomic: 1743 Res = ActOnOpenMPAtomicDirective(ClausesWithImplicit, AStmt, StartLoc, 1744 EndLoc); 1745 break; 1746 case OMPD_target: 1747 Res = ActOnOpenMPTargetDirective(ClausesWithImplicit, AStmt, StartLoc, 1748 EndLoc); 1749 break; 1750 case OMPD_threadprivate: 1751 llvm_unreachable("OpenMP Directive is not allowed"); 1752 case OMPD_unknown: 1753 llvm_unreachable("Unknown OpenMP directive"); 1754 } 1755 1756 for (auto P : VarsWithInheritedDSA) { 1757 Diag(P.second->getExprLoc(), diag::err_omp_no_dsa_for_variable) 1758 << P.first << P.second->getSourceRange(); 1759 } 1760 if (!VarsWithInheritedDSA.empty()) 1761 return StmtError(); 1762 1763 if (ErrorFound) 1764 return StmtError(); 1765 return Res; 1766 } 1767 1768 StmtResult Sema::ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses, 1769 Stmt *AStmt, 1770 SourceLocation StartLoc, 1771 SourceLocation EndLoc) { 1772 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 1773 CapturedStmt *CS = cast<CapturedStmt>(AStmt); 1774 // 1.2.2 OpenMP Language Terminology 1775 // Structured block - An executable statement with a single entry at the 1776 // top and a single exit at the bottom. 1777 // The point of exit cannot be a branch out of the structured block. 1778 // longjmp() and throw() must not violate the entry/exit criteria. 1779 CS->getCapturedDecl()->setNothrow(); 1780 1781 getCurFunction()->setHasBranchProtectedScope(); 1782 1783 return OMPParallelDirective::Create(Context, StartLoc, EndLoc, Clauses, 1784 AStmt); 1785 } 1786 1787 namespace { 1788 /// \brief Helper class for checking canonical form of the OpenMP loops and 1789 /// extracting iteration space of each loop in the loop nest, that will be used 1790 /// for IR generation. 1791 class OpenMPIterationSpaceChecker { 1792 /// \brief Reference to Sema. 1793 Sema &SemaRef; 1794 /// \brief A location for diagnostics (when there is no some better location). 1795 SourceLocation DefaultLoc; 1796 /// \brief A location for diagnostics (when increment is not compatible). 1797 SourceLocation ConditionLoc; 1798 /// \brief A source location for referring to loop init later. 1799 SourceRange InitSrcRange; 1800 /// \brief A source location for referring to condition later. 1801 SourceRange ConditionSrcRange; 1802 /// \brief A source location for referring to increment later. 1803 SourceRange IncrementSrcRange; 1804 /// \brief Loop variable. 1805 VarDecl *Var; 1806 /// \brief Reference to loop variable. 1807 DeclRefExpr *VarRef; 1808 /// \brief Lower bound (initializer for the var). 1809 Expr *LB; 1810 /// \brief Upper bound. 1811 Expr *UB; 1812 /// \brief Loop step (increment). 1813 Expr *Step; 1814 /// \brief This flag is true when condition is one of: 1815 /// Var < UB 1816 /// Var <= UB 1817 /// UB > Var 1818 /// UB >= Var 1819 bool TestIsLessOp; 1820 /// \brief This flag is true when condition is strict ( < or > ). 1821 bool TestIsStrictOp; 1822 /// \brief This flag is true when step is subtracted on each iteration. 1823 bool SubtractStep; 1824 1825 public: 1826 OpenMPIterationSpaceChecker(Sema &SemaRef, SourceLocation DefaultLoc) 1827 : SemaRef(SemaRef), DefaultLoc(DefaultLoc), ConditionLoc(DefaultLoc), 1828 InitSrcRange(SourceRange()), ConditionSrcRange(SourceRange()), 1829 IncrementSrcRange(SourceRange()), Var(nullptr), VarRef(nullptr), 1830 LB(nullptr), UB(nullptr), Step(nullptr), TestIsLessOp(false), 1831 TestIsStrictOp(false), SubtractStep(false) {} 1832 /// \brief Check init-expr for canonical loop form and save loop counter 1833 /// variable - #Var and its initialization value - #LB. 1834 bool CheckInit(Stmt *S); 1835 /// \brief Check test-expr for canonical form, save upper-bound (#UB), flags 1836 /// for less/greater and for strict/non-strict comparison. 1837 bool CheckCond(Expr *S); 1838 /// \brief Check incr-expr for canonical loop form and return true if it 1839 /// does not conform, otherwise save loop step (#Step). 1840 bool CheckInc(Expr *S); 1841 /// \brief Return the loop counter variable. 1842 VarDecl *GetLoopVar() const { return Var; } 1843 /// \brief Return the reference expression to loop counter variable. 1844 DeclRefExpr *GetLoopVarRefExpr() const { return VarRef; } 1845 /// \brief Source range of the loop init. 1846 SourceRange GetInitSrcRange() const { return InitSrcRange; } 1847 /// \brief Source range of the loop condition. 1848 SourceRange GetConditionSrcRange() const { return ConditionSrcRange; } 1849 /// \brief Source range of the loop increment. 1850 SourceRange GetIncrementSrcRange() const { return IncrementSrcRange; } 1851 /// \brief True if the step should be subtracted. 1852 bool ShouldSubtractStep() const { return SubtractStep; } 1853 /// \brief Build the expression to calculate the number of iterations. 1854 Expr *BuildNumIterations(Scope *S) const; 1855 /// \brief Build reference expression to the counter be used for codegen. 1856 Expr *BuildCounterVar() const; 1857 /// \brief Build initization of the counter be used for codegen. 1858 Expr *BuildCounterInit() const; 1859 /// \brief Build step of the counter be used for codegen. 1860 Expr *BuildCounterStep() const; 1861 /// \brief Return true if any expression is dependent. 1862 bool Dependent() const; 1863 1864 private: 1865 /// \brief Check the right-hand side of an assignment in the increment 1866 /// expression. 1867 bool CheckIncRHS(Expr *RHS); 1868 /// \brief Helper to set loop counter variable and its initializer. 1869 bool SetVarAndLB(VarDecl *NewVar, DeclRefExpr *NewVarRefExpr, Expr *NewLB); 1870 /// \brief Helper to set upper bound. 1871 bool SetUB(Expr *NewUB, bool LessOp, bool StrictOp, const SourceRange &SR, 1872 const SourceLocation &SL); 1873 /// \brief Helper to set loop increment. 1874 bool SetStep(Expr *NewStep, bool Subtract); 1875 }; 1876 1877 bool OpenMPIterationSpaceChecker::Dependent() const { 1878 if (!Var) { 1879 assert(!LB && !UB && !Step); 1880 return false; 1881 } 1882 return Var->getType()->isDependentType() || (LB && LB->isValueDependent()) || 1883 (UB && UB->isValueDependent()) || (Step && Step->isValueDependent()); 1884 } 1885 1886 bool OpenMPIterationSpaceChecker::SetVarAndLB(VarDecl *NewVar, 1887 DeclRefExpr *NewVarRefExpr, 1888 Expr *NewLB) { 1889 // State consistency checking to ensure correct usage. 1890 assert(Var == nullptr && LB == nullptr && VarRef == nullptr && 1891 UB == nullptr && Step == nullptr && !TestIsLessOp && !TestIsStrictOp); 1892 if (!NewVar || !NewLB) 1893 return true; 1894 Var = NewVar; 1895 VarRef = NewVarRefExpr; 1896 LB = NewLB; 1897 return false; 1898 } 1899 1900 bool OpenMPIterationSpaceChecker::SetUB(Expr *NewUB, bool LessOp, bool StrictOp, 1901 const SourceRange &SR, 1902 const SourceLocation &SL) { 1903 // State consistency checking to ensure correct usage. 1904 assert(Var != nullptr && LB != nullptr && UB == nullptr && Step == nullptr && 1905 !TestIsLessOp && !TestIsStrictOp); 1906 if (!NewUB) 1907 return true; 1908 UB = NewUB; 1909 TestIsLessOp = LessOp; 1910 TestIsStrictOp = StrictOp; 1911 ConditionSrcRange = SR; 1912 ConditionLoc = SL; 1913 return false; 1914 } 1915 1916 bool OpenMPIterationSpaceChecker::SetStep(Expr *NewStep, bool Subtract) { 1917 // State consistency checking to ensure correct usage. 1918 assert(Var != nullptr && LB != nullptr && Step == nullptr); 1919 if (!NewStep) 1920 return true; 1921 if (!NewStep->isValueDependent()) { 1922 // Check that the step is integer expression. 1923 SourceLocation StepLoc = NewStep->getLocStart(); 1924 ExprResult Val = 1925 SemaRef.PerformOpenMPImplicitIntegerConversion(StepLoc, NewStep); 1926 if (Val.isInvalid()) 1927 return true; 1928 NewStep = Val.get(); 1929 1930 // OpenMP [2.6, Canonical Loop Form, Restrictions] 1931 // If test-expr is of form var relational-op b and relational-op is < or 1932 // <= then incr-expr must cause var to increase on each iteration of the 1933 // loop. If test-expr is of form var relational-op b and relational-op is 1934 // > or >= then incr-expr must cause var to decrease on each iteration of 1935 // the loop. 1936 // If test-expr is of form b relational-op var and relational-op is < or 1937 // <= then incr-expr must cause var to decrease on each iteration of the 1938 // loop. If test-expr is of form b relational-op var and relational-op is 1939 // > or >= then incr-expr must cause var to increase on each iteration of 1940 // the loop. 1941 llvm::APSInt Result; 1942 bool IsConstant = NewStep->isIntegerConstantExpr(Result, SemaRef.Context); 1943 bool IsUnsigned = !NewStep->getType()->hasSignedIntegerRepresentation(); 1944 bool IsConstNeg = 1945 IsConstant && Result.isSigned() && (Subtract != Result.isNegative()); 1946 bool IsConstPos = 1947 IsConstant && Result.isSigned() && (Subtract == Result.isNegative()); 1948 bool IsConstZero = IsConstant && !Result.getBoolValue(); 1949 if (UB && (IsConstZero || 1950 (TestIsLessOp ? (IsConstNeg || (IsUnsigned && Subtract)) 1951 : (IsConstPos || (IsUnsigned && !Subtract))))) { 1952 SemaRef.Diag(NewStep->getExprLoc(), 1953 diag::err_omp_loop_incr_not_compatible) 1954 << Var << TestIsLessOp << NewStep->getSourceRange(); 1955 SemaRef.Diag(ConditionLoc, 1956 diag::note_omp_loop_cond_requres_compatible_incr) 1957 << TestIsLessOp << ConditionSrcRange; 1958 return true; 1959 } 1960 if (TestIsLessOp == Subtract) { 1961 NewStep = SemaRef.CreateBuiltinUnaryOp(NewStep->getExprLoc(), UO_Minus, 1962 NewStep).get(); 1963 Subtract = !Subtract; 1964 } 1965 } 1966 1967 Step = NewStep; 1968 SubtractStep = Subtract; 1969 return false; 1970 } 1971 1972 bool OpenMPIterationSpaceChecker::CheckInit(Stmt *S) { 1973 // Check init-expr for canonical loop form and save loop counter 1974 // variable - #Var and its initialization value - #LB. 1975 // OpenMP [2.6] Canonical loop form. init-expr may be one of the following: 1976 // var = lb 1977 // integer-type var = lb 1978 // random-access-iterator-type var = lb 1979 // pointer-type var = lb 1980 // 1981 if (!S) { 1982 SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_init); 1983 return true; 1984 } 1985 InitSrcRange = S->getSourceRange(); 1986 if (Expr *E = dyn_cast<Expr>(S)) 1987 S = E->IgnoreParens(); 1988 if (auto BO = dyn_cast<BinaryOperator>(S)) { 1989 if (BO->getOpcode() == BO_Assign) 1990 if (auto DRE = dyn_cast<DeclRefExpr>(BO->getLHS()->IgnoreParens())) 1991 return SetVarAndLB(dyn_cast<VarDecl>(DRE->getDecl()), DRE, 1992 BO->getRHS()); 1993 } else if (auto DS = dyn_cast<DeclStmt>(S)) { 1994 if (DS->isSingleDecl()) { 1995 if (auto Var = dyn_cast_or_null<VarDecl>(DS->getSingleDecl())) { 1996 if (Var->hasInit()) { 1997 // Accept non-canonical init form here but emit ext. warning. 1998 if (Var->getInitStyle() != VarDecl::CInit) 1999 SemaRef.Diag(S->getLocStart(), 2000 diag::ext_omp_loop_not_canonical_init) 2001 << S->getSourceRange(); 2002 return SetVarAndLB(Var, nullptr, Var->getInit()); 2003 } 2004 } 2005 } 2006 } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S)) 2007 if (CE->getOperator() == OO_Equal) 2008 if (auto DRE = dyn_cast<DeclRefExpr>(CE->getArg(0))) 2009 return SetVarAndLB(dyn_cast<VarDecl>(DRE->getDecl()), DRE, 2010 CE->getArg(1)); 2011 2012 SemaRef.Diag(S->getLocStart(), diag::err_omp_loop_not_canonical_init) 2013 << S->getSourceRange(); 2014 return true; 2015 } 2016 2017 /// \brief Ignore parenthesizes, implicit casts, copy constructor and return the 2018 /// variable (which may be the loop variable) if possible. 2019 static const VarDecl *GetInitVarDecl(const Expr *E) { 2020 if (!E) 2021 return nullptr; 2022 E = E->IgnoreParenImpCasts(); 2023 if (auto *CE = dyn_cast_or_null<CXXConstructExpr>(E)) 2024 if (const CXXConstructorDecl *Ctor = CE->getConstructor()) 2025 if (Ctor->isCopyConstructor() && CE->getNumArgs() == 1 && 2026 CE->getArg(0) != nullptr) 2027 E = CE->getArg(0)->IgnoreParenImpCasts(); 2028 auto DRE = dyn_cast_or_null<DeclRefExpr>(E); 2029 if (!DRE) 2030 return nullptr; 2031 return dyn_cast<VarDecl>(DRE->getDecl()); 2032 } 2033 2034 bool OpenMPIterationSpaceChecker::CheckCond(Expr *S) { 2035 // Check test-expr for canonical form, save upper-bound UB, flags for 2036 // less/greater and for strict/non-strict comparison. 2037 // OpenMP [2.6] Canonical loop form. Test-expr may be one of the following: 2038 // var relational-op b 2039 // b relational-op var 2040 // 2041 if (!S) { 2042 SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_cond) << Var; 2043 return true; 2044 } 2045 S = S->IgnoreParenImpCasts(); 2046 SourceLocation CondLoc = S->getLocStart(); 2047 if (auto BO = dyn_cast<BinaryOperator>(S)) { 2048 if (BO->isRelationalOp()) { 2049 if (GetInitVarDecl(BO->getLHS()) == Var) 2050 return SetUB(BO->getRHS(), 2051 (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_LE), 2052 (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_GT), 2053 BO->getSourceRange(), BO->getOperatorLoc()); 2054 if (GetInitVarDecl(BO->getRHS()) == Var) 2055 return SetUB(BO->getLHS(), 2056 (BO->getOpcode() == BO_GT || BO->getOpcode() == BO_GE), 2057 (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_GT), 2058 BO->getSourceRange(), BO->getOperatorLoc()); 2059 } 2060 } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S)) { 2061 if (CE->getNumArgs() == 2) { 2062 auto Op = CE->getOperator(); 2063 switch (Op) { 2064 case OO_Greater: 2065 case OO_GreaterEqual: 2066 case OO_Less: 2067 case OO_LessEqual: 2068 if (GetInitVarDecl(CE->getArg(0)) == Var) 2069 return SetUB(CE->getArg(1), Op == OO_Less || Op == OO_LessEqual, 2070 Op == OO_Less || Op == OO_Greater, CE->getSourceRange(), 2071 CE->getOperatorLoc()); 2072 if (GetInitVarDecl(CE->getArg(1)) == Var) 2073 return SetUB(CE->getArg(0), Op == OO_Greater || Op == OO_GreaterEqual, 2074 Op == OO_Less || Op == OO_Greater, CE->getSourceRange(), 2075 CE->getOperatorLoc()); 2076 break; 2077 default: 2078 break; 2079 } 2080 } 2081 } 2082 SemaRef.Diag(CondLoc, diag::err_omp_loop_not_canonical_cond) 2083 << S->getSourceRange() << Var; 2084 return true; 2085 } 2086 2087 bool OpenMPIterationSpaceChecker::CheckIncRHS(Expr *RHS) { 2088 // RHS of canonical loop form increment can be: 2089 // var + incr 2090 // incr + var 2091 // var - incr 2092 // 2093 RHS = RHS->IgnoreParenImpCasts(); 2094 if (auto BO = dyn_cast<BinaryOperator>(RHS)) { 2095 if (BO->isAdditiveOp()) { 2096 bool IsAdd = BO->getOpcode() == BO_Add; 2097 if (GetInitVarDecl(BO->getLHS()) == Var) 2098 return SetStep(BO->getRHS(), !IsAdd); 2099 if (IsAdd && GetInitVarDecl(BO->getRHS()) == Var) 2100 return SetStep(BO->getLHS(), false); 2101 } 2102 } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(RHS)) { 2103 bool IsAdd = CE->getOperator() == OO_Plus; 2104 if ((IsAdd || CE->getOperator() == OO_Minus) && CE->getNumArgs() == 2) { 2105 if (GetInitVarDecl(CE->getArg(0)) == Var) 2106 return SetStep(CE->getArg(1), !IsAdd); 2107 if (IsAdd && GetInitVarDecl(CE->getArg(1)) == Var) 2108 return SetStep(CE->getArg(0), false); 2109 } 2110 } 2111 SemaRef.Diag(RHS->getLocStart(), diag::err_omp_loop_not_canonical_incr) 2112 << RHS->getSourceRange() << Var; 2113 return true; 2114 } 2115 2116 bool OpenMPIterationSpaceChecker::CheckInc(Expr *S) { 2117 // Check incr-expr for canonical loop form and return true if it 2118 // does not conform. 2119 // OpenMP [2.6] Canonical loop form. Test-expr may be one of the following: 2120 // ++var 2121 // var++ 2122 // --var 2123 // var-- 2124 // var += incr 2125 // var -= incr 2126 // var = var + incr 2127 // var = incr + var 2128 // var = var - incr 2129 // 2130 if (!S) { 2131 SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_incr) << Var; 2132 return true; 2133 } 2134 IncrementSrcRange = S->getSourceRange(); 2135 S = S->IgnoreParens(); 2136 if (auto UO = dyn_cast<UnaryOperator>(S)) { 2137 if (UO->isIncrementDecrementOp() && GetInitVarDecl(UO->getSubExpr()) == Var) 2138 return SetStep( 2139 SemaRef.ActOnIntegerConstant(UO->getLocStart(), 2140 (UO->isDecrementOp() ? -1 : 1)).get(), 2141 false); 2142 } else if (auto BO = dyn_cast<BinaryOperator>(S)) { 2143 switch (BO->getOpcode()) { 2144 case BO_AddAssign: 2145 case BO_SubAssign: 2146 if (GetInitVarDecl(BO->getLHS()) == Var) 2147 return SetStep(BO->getRHS(), BO->getOpcode() == BO_SubAssign); 2148 break; 2149 case BO_Assign: 2150 if (GetInitVarDecl(BO->getLHS()) == Var) 2151 return CheckIncRHS(BO->getRHS()); 2152 break; 2153 default: 2154 break; 2155 } 2156 } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S)) { 2157 switch (CE->getOperator()) { 2158 case OO_PlusPlus: 2159 case OO_MinusMinus: 2160 if (GetInitVarDecl(CE->getArg(0)) == Var) 2161 return SetStep( 2162 SemaRef.ActOnIntegerConstant( 2163 CE->getLocStart(), 2164 ((CE->getOperator() == OO_MinusMinus) ? -1 : 1)).get(), 2165 false); 2166 break; 2167 case OO_PlusEqual: 2168 case OO_MinusEqual: 2169 if (GetInitVarDecl(CE->getArg(0)) == Var) 2170 return SetStep(CE->getArg(1), CE->getOperator() == OO_MinusEqual); 2171 break; 2172 case OO_Equal: 2173 if (GetInitVarDecl(CE->getArg(0)) == Var) 2174 return CheckIncRHS(CE->getArg(1)); 2175 break; 2176 default: 2177 break; 2178 } 2179 } 2180 SemaRef.Diag(S->getLocStart(), diag::err_omp_loop_not_canonical_incr) 2181 << S->getSourceRange() << Var; 2182 return true; 2183 } 2184 2185 /// \brief Build the expression to calculate the number of iterations. 2186 Expr *OpenMPIterationSpaceChecker::BuildNumIterations(Scope *S) const { 2187 ExprResult Diff; 2188 if (Var->getType()->isIntegerType() || Var->getType()->isPointerType() || 2189 SemaRef.getLangOpts().CPlusPlus) { 2190 // Upper - Lower 2191 Expr *Upper = TestIsLessOp ? UB : LB; 2192 Expr *Lower = TestIsLessOp ? LB : UB; 2193 2194 Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Sub, Upper, Lower); 2195 2196 if (!Diff.isUsable() && Var->getType()->getAsCXXRecordDecl()) { 2197 // BuildBinOp already emitted error, this one is to point user to upper 2198 // and lower bound, and to tell what is passed to 'operator-'. 2199 SemaRef.Diag(Upper->getLocStart(), diag::err_omp_loop_diff_cxx) 2200 << Upper->getSourceRange() << Lower->getSourceRange(); 2201 return nullptr; 2202 } 2203 } 2204 2205 if (!Diff.isUsable()) 2206 return nullptr; 2207 2208 // Upper - Lower [- 1] 2209 if (TestIsStrictOp) 2210 Diff = SemaRef.BuildBinOp( 2211 S, DefaultLoc, BO_Sub, Diff.get(), 2212 SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get()); 2213 if (!Diff.isUsable()) 2214 return nullptr; 2215 2216 // Upper - Lower [- 1] + Step 2217 Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Add, Diff.get(), 2218 Step->IgnoreImplicit()); 2219 if (!Diff.isUsable()) 2220 return nullptr; 2221 2222 // Parentheses (for dumping/debugging purposes only). 2223 Diff = SemaRef.ActOnParenExpr(DefaultLoc, DefaultLoc, Diff.get()); 2224 if (!Diff.isUsable()) 2225 return nullptr; 2226 2227 // (Upper - Lower [- 1] + Step) / Step 2228 Diff = SemaRef.BuildBinOp(S, DefaultLoc, BO_Div, Diff.get(), 2229 Step->IgnoreImplicit()); 2230 if (!Diff.isUsable()) 2231 return nullptr; 2232 2233 return Diff.get(); 2234 } 2235 2236 /// \brief Build reference expression to the counter be used for codegen. 2237 Expr *OpenMPIterationSpaceChecker::BuildCounterVar() const { 2238 return DeclRefExpr::Create(SemaRef.Context, NestedNameSpecifierLoc(), 2239 GetIncrementSrcRange().getBegin(), Var, false, 2240 DefaultLoc, Var->getType(), VK_LValue); 2241 } 2242 2243 /// \brief Build initization of the counter be used for codegen. 2244 Expr *OpenMPIterationSpaceChecker::BuildCounterInit() const { return LB; } 2245 2246 /// \brief Build step of the counter be used for codegen. 2247 Expr *OpenMPIterationSpaceChecker::BuildCounterStep() const { return Step; } 2248 2249 /// \brief Iteration space of a single for loop. 2250 struct LoopIterationSpace { 2251 /// \brief This expression calculates the number of iterations in the loop. 2252 /// It is always possible to calculate it before starting the loop. 2253 Expr *NumIterations; 2254 /// \brief The loop counter variable. 2255 Expr *CounterVar; 2256 /// \brief This is initializer for the initial value of #CounterVar. 2257 Expr *CounterInit; 2258 /// \brief This is step for the #CounterVar used to generate its update: 2259 /// #CounterVar = #CounterInit + #CounterStep * CurrentIteration. 2260 Expr *CounterStep; 2261 /// \brief Should step be subtracted? 2262 bool Subtract; 2263 /// \brief Source range of the loop init. 2264 SourceRange InitSrcRange; 2265 /// \brief Source range of the loop condition. 2266 SourceRange CondSrcRange; 2267 /// \brief Source range of the loop increment. 2268 SourceRange IncSrcRange; 2269 }; 2270 2271 /// \brief The resulting expressions built for the OpenMP loop CodeGen for the 2272 /// whole collapsed loop nest. See class OMPLoopDirective for their description. 2273 struct BuiltLoopExprs { 2274 Expr *IterationVarRef; 2275 Expr *LastIteration; 2276 Expr *CalcLastIteration; 2277 Expr *PreCond; 2278 Expr *Cond; 2279 Expr *SeparatedCond; 2280 Expr *Init; 2281 Expr *Inc; 2282 SmallVector<Expr *, 4> Counters; 2283 SmallVector<Expr *, 4> Updates; 2284 SmallVector<Expr *, 4> Finals; 2285 2286 bool builtAll() { 2287 return IterationVarRef != nullptr && LastIteration != nullptr && 2288 PreCond != nullptr && Cond != nullptr && SeparatedCond != nullptr && 2289 Init != nullptr && Inc != nullptr; 2290 } 2291 void clear(unsigned size) { 2292 IterationVarRef = nullptr; 2293 LastIteration = nullptr; 2294 CalcLastIteration = nullptr; 2295 PreCond = nullptr; 2296 Cond = nullptr; 2297 SeparatedCond = nullptr; 2298 Init = nullptr; 2299 Inc = nullptr; 2300 Counters.resize(size); 2301 Updates.resize(size); 2302 Finals.resize(size); 2303 for (unsigned i = 0; i < size; ++i) { 2304 Counters[i] = nullptr; 2305 Updates[i] = nullptr; 2306 Finals[i] = nullptr; 2307 } 2308 } 2309 }; 2310 2311 } // namespace 2312 2313 /// \brief Called on a for stmt to check and extract its iteration space 2314 /// for further processing (such as collapsing). 2315 static bool CheckOpenMPIterationSpace( 2316 OpenMPDirectiveKind DKind, Stmt *S, Sema &SemaRef, DSAStackTy &DSA, 2317 unsigned CurrentNestedLoopCount, unsigned NestedLoopCount, 2318 Expr *NestedLoopCountExpr, 2319 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA, 2320 LoopIterationSpace &ResultIterSpace) { 2321 // OpenMP [2.6, Canonical Loop Form] 2322 // for (init-expr; test-expr; incr-expr) structured-block 2323 auto For = dyn_cast_or_null<ForStmt>(S); 2324 if (!For) { 2325 SemaRef.Diag(S->getLocStart(), diag::err_omp_not_for) 2326 << (NestedLoopCountExpr != nullptr) << getOpenMPDirectiveName(DKind) 2327 << NestedLoopCount << (CurrentNestedLoopCount > 0) 2328 << CurrentNestedLoopCount; 2329 if (NestedLoopCount > 1) 2330 SemaRef.Diag(NestedLoopCountExpr->getExprLoc(), 2331 diag::note_omp_collapse_expr) 2332 << NestedLoopCountExpr->getSourceRange(); 2333 return true; 2334 } 2335 assert(For->getBody()); 2336 2337 OpenMPIterationSpaceChecker ISC(SemaRef, For->getForLoc()); 2338 2339 // Check init. 2340 auto Init = For->getInit(); 2341 if (ISC.CheckInit(Init)) { 2342 return true; 2343 } 2344 2345 bool HasErrors = false; 2346 2347 // Check loop variable's type. 2348 auto Var = ISC.GetLoopVar(); 2349 2350 // OpenMP [2.6, Canonical Loop Form] 2351 // Var is one of the following: 2352 // A variable of signed or unsigned integer type. 2353 // For C++, a variable of a random access iterator type. 2354 // For C, a variable of a pointer type. 2355 auto VarType = Var->getType(); 2356 if (!VarType->isDependentType() && !VarType->isIntegerType() && 2357 !VarType->isPointerType() && 2358 !(SemaRef.getLangOpts().CPlusPlus && VarType->isOverloadableType())) { 2359 SemaRef.Diag(Init->getLocStart(), diag::err_omp_loop_variable_type) 2360 << SemaRef.getLangOpts().CPlusPlus; 2361 HasErrors = true; 2362 } 2363 2364 // OpenMP, 2.14.1.1 Data-sharing Attribute Rules for Variables Referenced in a 2365 // Construct 2366 // The loop iteration variable(s) in the associated for-loop(s) of a for or 2367 // parallel for construct is (are) private. 2368 // The loop iteration variable in the associated for-loop of a simd construct 2369 // with just one associated for-loop is linear with a constant-linear-step 2370 // that is the increment of the associated for-loop. 2371 // Exclude loop var from the list of variables with implicitly defined data 2372 // sharing attributes. 2373 while (VarsWithImplicitDSA.count(Var) > 0) 2374 VarsWithImplicitDSA.erase(Var); 2375 2376 // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced in 2377 // a Construct, C/C++]. 2378 // The loop iteration variable in the associated for-loop of a simd construct 2379 // with just one associated for-loop may be listed in a linear clause with a 2380 // constant-linear-step that is the increment of the associated for-loop. 2381 // The loop iteration variable(s) in the associated for-loop(s) of a for or 2382 // parallel for construct may be listed in a private or lastprivate clause. 2383 DSAStackTy::DSAVarData DVar = DSA.getTopDSA(Var, false); 2384 auto LoopVarRefExpr = ISC.GetLoopVarRefExpr(); 2385 // If LoopVarRefExpr is nullptr it means the corresponding loop variable is 2386 // declared in the loop and it is predetermined as a private. 2387 auto PredeterminedCKind = 2388 isOpenMPSimdDirective(DKind) 2389 ? ((NestedLoopCount == 1) ? OMPC_linear : OMPC_lastprivate) 2390 : OMPC_private; 2391 if (((isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown && 2392 DVar.CKind != PredeterminedCKind) || 2393 (isOpenMPWorksharingDirective(DKind) && !isOpenMPSimdDirective(DKind) && 2394 DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_private && 2395 DVar.CKind != OMPC_lastprivate)) && 2396 (DVar.CKind != OMPC_private || DVar.RefExpr != nullptr)) { 2397 SemaRef.Diag(Init->getLocStart(), diag::err_omp_loop_var_dsa) 2398 << getOpenMPClauseName(DVar.CKind) << getOpenMPDirectiveName(DKind) 2399 << getOpenMPClauseName(PredeterminedCKind); 2400 ReportOriginalDSA(SemaRef, &DSA, Var, DVar, true); 2401 HasErrors = true; 2402 } else if (LoopVarRefExpr != nullptr) { 2403 // Make the loop iteration variable private (for worksharing constructs), 2404 // linear (for simd directives with the only one associated loop) or 2405 // lastprivate (for simd directives with several collapsed loops). 2406 DSA.addDSA(Var, LoopVarRefExpr, PredeterminedCKind); 2407 } 2408 2409 assert(isOpenMPLoopDirective(DKind) && "DSA for non-loop vars"); 2410 2411 // Check test-expr. 2412 HasErrors |= ISC.CheckCond(For->getCond()); 2413 2414 // Check incr-expr. 2415 HasErrors |= ISC.CheckInc(For->getInc()); 2416 2417 if (ISC.Dependent() || SemaRef.CurContext->isDependentContext() || HasErrors) 2418 return HasErrors; 2419 2420 // Build the loop's iteration space representation. 2421 ResultIterSpace.NumIterations = ISC.BuildNumIterations(DSA.getCurScope()); 2422 ResultIterSpace.CounterVar = ISC.BuildCounterVar(); 2423 ResultIterSpace.CounterInit = ISC.BuildCounterInit(); 2424 ResultIterSpace.CounterStep = ISC.BuildCounterStep(); 2425 ResultIterSpace.InitSrcRange = ISC.GetInitSrcRange(); 2426 ResultIterSpace.CondSrcRange = ISC.GetConditionSrcRange(); 2427 ResultIterSpace.IncSrcRange = ISC.GetIncrementSrcRange(); 2428 ResultIterSpace.Subtract = ISC.ShouldSubtractStep(); 2429 2430 HasErrors |= (ResultIterSpace.NumIterations == nullptr || 2431 ResultIterSpace.CounterVar == nullptr || 2432 ResultIterSpace.CounterInit == nullptr || 2433 ResultIterSpace.CounterStep == nullptr); 2434 2435 return HasErrors; 2436 } 2437 2438 /// \brief Build a variable declaration for OpenMP loop iteration variable. 2439 static VarDecl *BuildVarDecl(Sema &SemaRef, SourceLocation Loc, QualType Type, 2440 StringRef Name) { 2441 DeclContext *DC = SemaRef.CurContext; 2442 IdentifierInfo *II = &SemaRef.PP.getIdentifierTable().get(Name); 2443 TypeSourceInfo *TInfo = SemaRef.Context.getTrivialTypeSourceInfo(Type, Loc); 2444 VarDecl *Decl = 2445 VarDecl::Create(SemaRef.Context, DC, Loc, Loc, II, Type, TInfo, SC_None); 2446 Decl->setImplicit(); 2447 return Decl; 2448 } 2449 2450 /// \brief Build 'VarRef = Start + Iter * Step'. 2451 static ExprResult BuildCounterUpdate(Sema &SemaRef, Scope *S, 2452 SourceLocation Loc, ExprResult VarRef, 2453 ExprResult Start, ExprResult Iter, 2454 ExprResult Step, bool Subtract) { 2455 // Add parentheses (for debugging purposes only). 2456 Iter = SemaRef.ActOnParenExpr(Loc, Loc, Iter.get()); 2457 if (!VarRef.isUsable() || !Start.isUsable() || !Iter.isUsable() || 2458 !Step.isUsable()) 2459 return ExprError(); 2460 2461 ExprResult Update = SemaRef.BuildBinOp(S, Loc, BO_Mul, Iter.get(), 2462 Step.get()->IgnoreImplicit()); 2463 if (!Update.isUsable()) 2464 return ExprError(); 2465 2466 // Build 'VarRef = Start + Iter * Step'. 2467 Update = SemaRef.BuildBinOp(S, Loc, (Subtract ? BO_Sub : BO_Add), 2468 Start.get()->IgnoreImplicit(), Update.get()); 2469 if (!Update.isUsable()) 2470 return ExprError(); 2471 2472 Update = SemaRef.PerformImplicitConversion( 2473 Update.get(), VarRef.get()->getType(), Sema::AA_Converting, true); 2474 if (!Update.isUsable()) 2475 return ExprError(); 2476 2477 Update = SemaRef.BuildBinOp(S, Loc, BO_Assign, VarRef.get(), Update.get()); 2478 return Update; 2479 } 2480 2481 /// \brief Convert integer expression \a E to make it have at least \a Bits 2482 /// bits. 2483 static ExprResult WidenIterationCount(unsigned Bits, Expr *E, 2484 Sema &SemaRef) { 2485 if (E == nullptr) 2486 return ExprError(); 2487 auto &C = SemaRef.Context; 2488 QualType OldType = E->getType(); 2489 unsigned HasBits = C.getTypeSize(OldType); 2490 if (HasBits >= Bits) 2491 return ExprResult(E); 2492 // OK to convert to signed, because new type has more bits than old. 2493 QualType NewType = C.getIntTypeForBitwidth(Bits, /* Signed */ true); 2494 return SemaRef.PerformImplicitConversion(E, NewType, Sema::AA_Converting, 2495 true); 2496 } 2497 2498 /// \brief Check if the given expression \a E is a constant integer that fits 2499 /// into \a Bits bits. 2500 static bool FitsInto(unsigned Bits, bool Signed, Expr *E, Sema &SemaRef) { 2501 if (E == nullptr) 2502 return false; 2503 llvm::APSInt Result; 2504 if (E->isIntegerConstantExpr(Result, SemaRef.Context)) 2505 return Signed ? Result.isSignedIntN(Bits) : Result.isIntN(Bits); 2506 return false; 2507 } 2508 2509 /// \brief Called on a for stmt to check itself and nested loops (if any). 2510 /// \return Returns 0 if one of the collapsed stmts is not canonical for loop, 2511 /// number of collapsed loops otherwise. 2512 static unsigned 2513 CheckOpenMPLoop(OpenMPDirectiveKind DKind, Expr *NestedLoopCountExpr, 2514 Stmt *AStmt, Sema &SemaRef, DSAStackTy &DSA, 2515 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA, 2516 BuiltLoopExprs &Built) { 2517 unsigned NestedLoopCount = 1; 2518 if (NestedLoopCountExpr) { 2519 // Found 'collapse' clause - calculate collapse number. 2520 llvm::APSInt Result; 2521 if (NestedLoopCountExpr->EvaluateAsInt(Result, SemaRef.getASTContext())) 2522 NestedLoopCount = Result.getLimitedValue(); 2523 } 2524 // This is helper routine for loop directives (e.g., 'for', 'simd', 2525 // 'for simd', etc.). 2526 SmallVector<LoopIterationSpace, 4> IterSpaces; 2527 IterSpaces.resize(NestedLoopCount); 2528 Stmt *CurStmt = AStmt->IgnoreContainers(/* IgnoreCaptured */ true); 2529 for (unsigned Cnt = 0; Cnt < NestedLoopCount; ++Cnt) { 2530 if (CheckOpenMPIterationSpace(DKind, CurStmt, SemaRef, DSA, Cnt, 2531 NestedLoopCount, NestedLoopCountExpr, 2532 VarsWithImplicitDSA, IterSpaces[Cnt])) 2533 return 0; 2534 // Move on to the next nested for loop, or to the loop body. 2535 // OpenMP [2.8.1, simd construct, Restrictions] 2536 // All loops associated with the construct must be perfectly nested; that 2537 // is, there must be no intervening code nor any OpenMP directive between 2538 // any two loops. 2539 CurStmt = cast<ForStmt>(CurStmt)->getBody()->IgnoreContainers(); 2540 } 2541 2542 Built.clear(/* size */ NestedLoopCount); 2543 2544 if (SemaRef.CurContext->isDependentContext()) 2545 return NestedLoopCount; 2546 2547 // An example of what is generated for the following code: 2548 // 2549 // #pragma omp simd collapse(2) 2550 // for (i = 0; i < NI; ++i) 2551 // for (j = J0; j < NJ; j+=2) { 2552 // <loop body> 2553 // } 2554 // 2555 // We generate the code below. 2556 // Note: the loop body may be outlined in CodeGen. 2557 // Note: some counters may be C++ classes, operator- is used to find number of 2558 // iterations and operator+= to calculate counter value. 2559 // Note: decltype(NumIterations) must be integer type (in 'omp for', only i32 2560 // or i64 is currently supported). 2561 // 2562 // #define NumIterations (NI * ((NJ - J0 - 1 + 2) / 2)) 2563 // for (int[32|64]_t IV = 0; IV < NumIterations; ++IV ) { 2564 // .local.i = IV / ((NJ - J0 - 1 + 2) / 2); 2565 // .local.j = J0 + (IV % ((NJ - J0 - 1 + 2) / 2)) * 2; 2566 // // similar updates for vars in clauses (e.g. 'linear') 2567 // <loop body (using local i and j)> 2568 // } 2569 // i = NI; // assign final values of counters 2570 // j = NJ; 2571 // 2572 2573 // Last iteration number is (I1 * I2 * ... In) - 1, where I1, I2 ... In are 2574 // the iteration counts of the collapsed for loops. 2575 auto N0 = IterSpaces[0].NumIterations; 2576 ExprResult LastIteration32 = WidenIterationCount(32 /* Bits */, N0, SemaRef); 2577 ExprResult LastIteration64 = WidenIterationCount(64 /* Bits */, N0, SemaRef); 2578 2579 if (!LastIteration32.isUsable() || !LastIteration64.isUsable()) 2580 return NestedLoopCount; 2581 2582 auto &C = SemaRef.Context; 2583 bool AllCountsNeedLessThan32Bits = C.getTypeSize(N0->getType()) < 32; 2584 2585 Scope *CurScope = DSA.getCurScope(); 2586 for (unsigned Cnt = 1; Cnt < NestedLoopCount; ++Cnt) { 2587 auto N = IterSpaces[Cnt].NumIterations; 2588 AllCountsNeedLessThan32Bits &= C.getTypeSize(N->getType()) < 32; 2589 if (LastIteration32.isUsable()) 2590 LastIteration32 = SemaRef.BuildBinOp(CurScope, SourceLocation(), BO_Mul, 2591 LastIteration32.get(), N); 2592 if (LastIteration64.isUsable()) 2593 LastIteration64 = SemaRef.BuildBinOp(CurScope, SourceLocation(), BO_Mul, 2594 LastIteration64.get(), N); 2595 } 2596 2597 // Choose either the 32-bit or 64-bit version. 2598 ExprResult LastIteration = LastIteration64; 2599 if (LastIteration32.isUsable() && 2600 C.getTypeSize(LastIteration32.get()->getType()) == 32 && 2601 (AllCountsNeedLessThan32Bits || NestedLoopCount == 1 || 2602 FitsInto( 2603 32 /* Bits */, 2604 LastIteration32.get()->getType()->hasSignedIntegerRepresentation(), 2605 LastIteration64.get(), SemaRef))) 2606 LastIteration = LastIteration32; 2607 2608 if (!LastIteration.isUsable()) 2609 return 0; 2610 2611 // Save the number of iterations. 2612 ExprResult NumIterations = LastIteration; 2613 { 2614 LastIteration = SemaRef.BuildBinOp( 2615 CurScope, SourceLocation(), BO_Sub, LastIteration.get(), 2616 SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get()); 2617 if (!LastIteration.isUsable()) 2618 return 0; 2619 } 2620 2621 // Calculate the last iteration number beforehand instead of doing this on 2622 // each iteration. Do not do this if the number of iterations may be kfold-ed. 2623 llvm::APSInt Result; 2624 bool IsConstant = 2625 LastIteration.get()->isIntegerConstantExpr(Result, SemaRef.Context); 2626 ExprResult CalcLastIteration; 2627 if (!IsConstant) { 2628 SourceLocation SaveLoc; 2629 VarDecl *SaveVar = 2630 BuildVarDecl(SemaRef, SaveLoc, LastIteration.get()->getType(), 2631 ".omp.last.iteration"); 2632 ExprResult SaveRef = SemaRef.BuildDeclRefExpr( 2633 SaveVar, LastIteration.get()->getType(), VK_LValue, SaveLoc); 2634 CalcLastIteration = SemaRef.BuildBinOp(CurScope, SaveLoc, BO_Assign, 2635 SaveRef.get(), LastIteration.get()); 2636 LastIteration = SaveRef; 2637 2638 // Prepare SaveRef + 1. 2639 NumIterations = SemaRef.BuildBinOp( 2640 CurScope, SaveLoc, BO_Add, SaveRef.get(), 2641 SemaRef.ActOnIntegerConstant(SourceLocation(), 1).get()); 2642 if (!NumIterations.isUsable()) 2643 return 0; 2644 } 2645 2646 SourceLocation InitLoc = IterSpaces[0].InitSrcRange.getBegin(); 2647 2648 // Precondition tests if there is at least one iteration (LastIteration > 0). 2649 ExprResult PreCond = SemaRef.BuildBinOp( 2650 CurScope, InitLoc, BO_GT, LastIteration.get(), 2651 SemaRef.ActOnIntegerConstant(SourceLocation(), 0).get()); 2652 2653 // Build the iteration variable and its initialization to zero before loop. 2654 ExprResult IV; 2655 ExprResult Init; 2656 { 2657 VarDecl *IVDecl = BuildVarDecl(SemaRef, InitLoc, 2658 LastIteration.get()->getType(), ".omp.iv"); 2659 IV = SemaRef.BuildDeclRefExpr(IVDecl, LastIteration.get()->getType(), 2660 VK_LValue, InitLoc); 2661 Init = SemaRef.BuildBinOp( 2662 CurScope, InitLoc, BO_Assign, IV.get(), 2663 SemaRef.ActOnIntegerConstant(SourceLocation(), 0).get()); 2664 } 2665 2666 // Loop condition (IV < NumIterations) 2667 SourceLocation CondLoc; 2668 ExprResult Cond = SemaRef.BuildBinOp(CurScope, CondLoc, BO_LT, IV.get(), 2669 NumIterations.get()); 2670 // Loop condition with 1 iteration separated (IV < LastIteration) 2671 ExprResult SeparatedCond = SemaRef.BuildBinOp(CurScope, CondLoc, BO_LT, 2672 IV.get(), LastIteration.get()); 2673 2674 // Loop increment (IV = IV + 1) 2675 SourceLocation IncLoc; 2676 ExprResult Inc = 2677 SemaRef.BuildBinOp(CurScope, IncLoc, BO_Add, IV.get(), 2678 SemaRef.ActOnIntegerConstant(IncLoc, 1).get()); 2679 if (!Inc.isUsable()) 2680 return 0; 2681 Inc = SemaRef.BuildBinOp(CurScope, IncLoc, BO_Assign, IV.get(), Inc.get()); 2682 2683 // Build updates and final values of the loop counters. 2684 bool HasErrors = false; 2685 Built.Counters.resize(NestedLoopCount); 2686 Built.Updates.resize(NestedLoopCount); 2687 Built.Finals.resize(NestedLoopCount); 2688 { 2689 ExprResult Div; 2690 // Go from inner nested loop to outer. 2691 for (int Cnt = NestedLoopCount - 1; Cnt >= 0; --Cnt) { 2692 LoopIterationSpace &IS = IterSpaces[Cnt]; 2693 SourceLocation UpdLoc = IS.IncSrcRange.getBegin(); 2694 // Build: Iter = (IV / Div) % IS.NumIters 2695 // where Div is product of previous iterations' IS.NumIters. 2696 ExprResult Iter; 2697 if (Div.isUsable()) { 2698 Iter = 2699 SemaRef.BuildBinOp(CurScope, UpdLoc, BO_Div, IV.get(), Div.get()); 2700 } else { 2701 Iter = IV; 2702 assert((Cnt == (int)NestedLoopCount - 1) && 2703 "unusable div expected on first iteration only"); 2704 } 2705 2706 if (Cnt != 0 && Iter.isUsable()) 2707 Iter = SemaRef.BuildBinOp(CurScope, UpdLoc, BO_Rem, Iter.get(), 2708 IS.NumIterations); 2709 if (!Iter.isUsable()) { 2710 HasErrors = true; 2711 break; 2712 } 2713 2714 // Build update: IS.CounterVar = IS.Start + Iter * IS.Step 2715 ExprResult Update = 2716 BuildCounterUpdate(SemaRef, CurScope, UpdLoc, IS.CounterVar, 2717 IS.CounterInit, Iter, IS.CounterStep, IS.Subtract); 2718 if (!Update.isUsable()) { 2719 HasErrors = true; 2720 break; 2721 } 2722 2723 // Build final: IS.CounterVar = IS.Start + IS.NumIters * IS.Step 2724 ExprResult Final = BuildCounterUpdate( 2725 SemaRef, CurScope, UpdLoc, IS.CounterVar, IS.CounterInit, 2726 IS.NumIterations, IS.CounterStep, IS.Subtract); 2727 if (!Final.isUsable()) { 2728 HasErrors = true; 2729 break; 2730 } 2731 2732 // Build Div for the next iteration: Div <- Div * IS.NumIters 2733 if (Cnt != 0) { 2734 if (Div.isUnset()) 2735 Div = IS.NumIterations; 2736 else 2737 Div = SemaRef.BuildBinOp(CurScope, UpdLoc, BO_Mul, Div.get(), 2738 IS.NumIterations); 2739 2740 // Add parentheses (for debugging purposes only). 2741 if (Div.isUsable()) 2742 Div = SemaRef.ActOnParenExpr(UpdLoc, UpdLoc, Div.get()); 2743 if (!Div.isUsable()) { 2744 HasErrors = true; 2745 break; 2746 } 2747 } 2748 if (!Update.isUsable() || !Final.isUsable()) { 2749 HasErrors = true; 2750 break; 2751 } 2752 // Save results 2753 Built.Counters[Cnt] = IS.CounterVar; 2754 Built.Updates[Cnt] = Update.get(); 2755 Built.Finals[Cnt] = Final.get(); 2756 } 2757 } 2758 2759 if (HasErrors) 2760 return 0; 2761 2762 // Save results 2763 Built.IterationVarRef = IV.get(); 2764 Built.LastIteration = LastIteration.get(); 2765 Built.CalcLastIteration = CalcLastIteration.get(); 2766 Built.PreCond = PreCond.get(); 2767 Built.Cond = Cond.get(); 2768 Built.SeparatedCond = SeparatedCond.get(); 2769 Built.Init = Init.get(); 2770 Built.Inc = Inc.get(); 2771 2772 return NestedLoopCount; 2773 } 2774 2775 static Expr *GetCollapseNumberExpr(ArrayRef<OMPClause *> Clauses) { 2776 auto CollapseFilter = [](const OMPClause *C) -> bool { 2777 return C->getClauseKind() == OMPC_collapse; 2778 }; 2779 OMPExecutableDirective::filtered_clause_iterator<decltype(CollapseFilter)> I( 2780 Clauses, CollapseFilter); 2781 if (I) 2782 return cast<OMPCollapseClause>(*I)->getNumForLoops(); 2783 return nullptr; 2784 } 2785 2786 StmtResult Sema::ActOnOpenMPSimdDirective( 2787 ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, 2788 SourceLocation EndLoc, 2789 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) { 2790 BuiltLoopExprs B; 2791 // In presence of clause 'collapse', it will define the nested loops number. 2792 unsigned NestedLoopCount = 2793 CheckOpenMPLoop(OMPD_simd, GetCollapseNumberExpr(Clauses), AStmt, *this, 2794 *DSAStack, VarsWithImplicitDSA, B); 2795 if (NestedLoopCount == 0) 2796 return StmtError(); 2797 2798 assert((CurContext->isDependentContext() || B.builtAll()) && 2799 "omp simd loop exprs were not built"); 2800 2801 getCurFunction()->setHasBranchProtectedScope(); 2802 return OMPSimdDirective::Create( 2803 Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, 2804 B.IterationVarRef, B.LastIteration, B.CalcLastIteration, B.PreCond, 2805 B.Cond, B.SeparatedCond, B.Init, B.Inc, B.Counters, B.Updates, B.Finals); 2806 } 2807 2808 StmtResult Sema::ActOnOpenMPForDirective( 2809 ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, 2810 SourceLocation EndLoc, 2811 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) { 2812 BuiltLoopExprs B; 2813 // In presence of clause 'collapse', it will define the nested loops number. 2814 unsigned NestedLoopCount = 2815 CheckOpenMPLoop(OMPD_for, GetCollapseNumberExpr(Clauses), AStmt, *this, 2816 *DSAStack, VarsWithImplicitDSA, B); 2817 if (NestedLoopCount == 0) 2818 return StmtError(); 2819 2820 assert((CurContext->isDependentContext() || B.builtAll()) && 2821 "omp for loop exprs were not built"); 2822 2823 getCurFunction()->setHasBranchProtectedScope(); 2824 return OMPForDirective::Create( 2825 Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, 2826 B.IterationVarRef, B.LastIteration, B.CalcLastIteration, B.PreCond, 2827 B.Cond, B.SeparatedCond, B.Init, B.Inc, B.Counters, B.Updates, B.Finals); 2828 } 2829 2830 StmtResult Sema::ActOnOpenMPForSimdDirective( 2831 ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, 2832 SourceLocation EndLoc, 2833 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) { 2834 BuiltLoopExprs B; 2835 // In presence of clause 'collapse', it will define the nested loops number. 2836 unsigned NestedLoopCount = 2837 CheckOpenMPLoop(OMPD_for_simd, GetCollapseNumberExpr(Clauses), AStmt, 2838 *this, *DSAStack, VarsWithImplicitDSA, B); 2839 if (NestedLoopCount == 0) 2840 return StmtError(); 2841 2842 getCurFunction()->setHasBranchProtectedScope(); 2843 return OMPForSimdDirective::Create( 2844 Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, 2845 B.IterationVarRef, B.LastIteration, B.CalcLastIteration, B.PreCond, 2846 B.Cond, B.SeparatedCond, B.Init, B.Inc, B.Counters, B.Updates, B.Finals); 2847 } 2848 2849 StmtResult Sema::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses, 2850 Stmt *AStmt, 2851 SourceLocation StartLoc, 2852 SourceLocation EndLoc) { 2853 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2854 auto BaseStmt = AStmt; 2855 while (CapturedStmt *CS = dyn_cast_or_null<CapturedStmt>(BaseStmt)) 2856 BaseStmt = CS->getCapturedStmt(); 2857 if (auto C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) { 2858 auto S = C->children(); 2859 if (!S) 2860 return StmtError(); 2861 // All associated statements must be '#pragma omp section' except for 2862 // the first one. 2863 for (++S; S; ++S) { 2864 auto SectionStmt = *S; 2865 if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) { 2866 if (SectionStmt) 2867 Diag(SectionStmt->getLocStart(), 2868 diag::err_omp_sections_substmt_not_section); 2869 return StmtError(); 2870 } 2871 } 2872 } else { 2873 Diag(AStmt->getLocStart(), diag::err_omp_sections_not_compound_stmt); 2874 return StmtError(); 2875 } 2876 2877 getCurFunction()->setHasBranchProtectedScope(); 2878 2879 return OMPSectionsDirective::Create(Context, StartLoc, EndLoc, Clauses, 2880 AStmt); 2881 } 2882 2883 StmtResult Sema::ActOnOpenMPSectionDirective(Stmt *AStmt, 2884 SourceLocation StartLoc, 2885 SourceLocation EndLoc) { 2886 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2887 2888 getCurFunction()->setHasBranchProtectedScope(); 2889 2890 return OMPSectionDirective::Create(Context, StartLoc, EndLoc, AStmt); 2891 } 2892 2893 StmtResult Sema::ActOnOpenMPSingleDirective(ArrayRef<OMPClause *> Clauses, 2894 Stmt *AStmt, 2895 SourceLocation StartLoc, 2896 SourceLocation EndLoc) { 2897 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2898 2899 getCurFunction()->setHasBranchProtectedScope(); 2900 2901 return OMPSingleDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); 2902 } 2903 2904 StmtResult Sema::ActOnOpenMPMasterDirective(Stmt *AStmt, 2905 SourceLocation StartLoc, 2906 SourceLocation EndLoc) { 2907 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2908 2909 getCurFunction()->setHasBranchProtectedScope(); 2910 2911 return OMPMasterDirective::Create(Context, StartLoc, EndLoc, AStmt); 2912 } 2913 2914 StmtResult 2915 Sema::ActOnOpenMPCriticalDirective(const DeclarationNameInfo &DirName, 2916 Stmt *AStmt, SourceLocation StartLoc, 2917 SourceLocation EndLoc) { 2918 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2919 2920 getCurFunction()->setHasBranchProtectedScope(); 2921 2922 return OMPCriticalDirective::Create(Context, DirName, StartLoc, EndLoc, 2923 AStmt); 2924 } 2925 2926 StmtResult Sema::ActOnOpenMPParallelForDirective( 2927 ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, 2928 SourceLocation EndLoc, 2929 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) { 2930 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2931 CapturedStmt *CS = cast<CapturedStmt>(AStmt); 2932 // 1.2.2 OpenMP Language Terminology 2933 // Structured block - An executable statement with a single entry at the 2934 // top and a single exit at the bottom. 2935 // The point of exit cannot be a branch out of the structured block. 2936 // longjmp() and throw() must not violate the entry/exit criteria. 2937 CS->getCapturedDecl()->setNothrow(); 2938 2939 BuiltLoopExprs B; 2940 // In presence of clause 'collapse', it will define the nested loops number. 2941 unsigned NestedLoopCount = 2942 CheckOpenMPLoop(OMPD_parallel_for, GetCollapseNumberExpr(Clauses), AStmt, 2943 *this, *DSAStack, VarsWithImplicitDSA, B); 2944 if (NestedLoopCount == 0) 2945 return StmtError(); 2946 2947 assert((CurContext->isDependentContext() || B.builtAll()) && 2948 "omp parallel for loop exprs were not built"); 2949 2950 getCurFunction()->setHasBranchProtectedScope(); 2951 return OMPParallelForDirective::Create( 2952 Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, 2953 B.IterationVarRef, B.LastIteration, B.CalcLastIteration, B.PreCond, 2954 B.Cond, B.SeparatedCond, B.Init, B.Inc, B.Counters, B.Updates, B.Finals); 2955 } 2956 2957 StmtResult Sema::ActOnOpenMPParallelForSimdDirective( 2958 ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, 2959 SourceLocation EndLoc, 2960 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) { 2961 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2962 CapturedStmt *CS = cast<CapturedStmt>(AStmt); 2963 // 1.2.2 OpenMP Language Terminology 2964 // Structured block - An executable statement with a single entry at the 2965 // top and a single exit at the bottom. 2966 // The point of exit cannot be a branch out of the structured block. 2967 // longjmp() and throw() must not violate the entry/exit criteria. 2968 CS->getCapturedDecl()->setNothrow(); 2969 2970 BuiltLoopExprs B; 2971 // In presence of clause 'collapse', it will define the nested loops number. 2972 unsigned NestedLoopCount = 2973 CheckOpenMPLoop(OMPD_parallel_for_simd, GetCollapseNumberExpr(Clauses), 2974 AStmt, *this, *DSAStack, VarsWithImplicitDSA, B); 2975 if (NestedLoopCount == 0) 2976 return StmtError(); 2977 2978 getCurFunction()->setHasBranchProtectedScope(); 2979 return OMPParallelForSimdDirective::Create( 2980 Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, 2981 B.IterationVarRef, B.LastIteration, B.CalcLastIteration, B.PreCond, 2982 B.Cond, B.SeparatedCond, B.Init, B.Inc, B.Counters, B.Updates, B.Finals); 2983 } 2984 2985 StmtResult 2986 Sema::ActOnOpenMPParallelSectionsDirective(ArrayRef<OMPClause *> Clauses, 2987 Stmt *AStmt, SourceLocation StartLoc, 2988 SourceLocation EndLoc) { 2989 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2990 auto BaseStmt = AStmt; 2991 while (CapturedStmt *CS = dyn_cast_or_null<CapturedStmt>(BaseStmt)) 2992 BaseStmt = CS->getCapturedStmt(); 2993 if (auto C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) { 2994 auto S = C->children(); 2995 if (!S) 2996 return StmtError(); 2997 // All associated statements must be '#pragma omp section' except for 2998 // the first one. 2999 for (++S; S; ++S) { 3000 auto SectionStmt = *S; 3001 if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) { 3002 if (SectionStmt) 3003 Diag(SectionStmt->getLocStart(), 3004 diag::err_omp_parallel_sections_substmt_not_section); 3005 return StmtError(); 3006 } 3007 } 3008 } else { 3009 Diag(AStmt->getLocStart(), 3010 diag::err_omp_parallel_sections_not_compound_stmt); 3011 return StmtError(); 3012 } 3013 3014 getCurFunction()->setHasBranchProtectedScope(); 3015 3016 return OMPParallelSectionsDirective::Create(Context, StartLoc, EndLoc, 3017 Clauses, AStmt); 3018 } 3019 3020 StmtResult Sema::ActOnOpenMPTaskDirective(ArrayRef<OMPClause *> Clauses, 3021 Stmt *AStmt, SourceLocation StartLoc, 3022 SourceLocation EndLoc) { 3023 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 3024 CapturedStmt *CS = cast<CapturedStmt>(AStmt); 3025 // 1.2.2 OpenMP Language Terminology 3026 // Structured block - An executable statement with a single entry at the 3027 // top and a single exit at the bottom. 3028 // The point of exit cannot be a branch out of the structured block. 3029 // longjmp() and throw() must not violate the entry/exit criteria. 3030 CS->getCapturedDecl()->setNothrow(); 3031 3032 getCurFunction()->setHasBranchProtectedScope(); 3033 3034 return OMPTaskDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); 3035 } 3036 3037 StmtResult Sema::ActOnOpenMPTaskyieldDirective(SourceLocation StartLoc, 3038 SourceLocation EndLoc) { 3039 return OMPTaskyieldDirective::Create(Context, StartLoc, EndLoc); 3040 } 3041 3042 StmtResult Sema::ActOnOpenMPBarrierDirective(SourceLocation StartLoc, 3043 SourceLocation EndLoc) { 3044 return OMPBarrierDirective::Create(Context, StartLoc, EndLoc); 3045 } 3046 3047 StmtResult Sema::ActOnOpenMPTaskwaitDirective(SourceLocation StartLoc, 3048 SourceLocation EndLoc) { 3049 return OMPTaskwaitDirective::Create(Context, StartLoc, EndLoc); 3050 } 3051 3052 StmtResult Sema::ActOnOpenMPFlushDirective(ArrayRef<OMPClause *> Clauses, 3053 SourceLocation StartLoc, 3054 SourceLocation EndLoc) { 3055 assert(Clauses.size() <= 1 && "Extra clauses in flush directive"); 3056 return OMPFlushDirective::Create(Context, StartLoc, EndLoc, Clauses); 3057 } 3058 3059 StmtResult Sema::ActOnOpenMPOrderedDirective(Stmt *AStmt, 3060 SourceLocation StartLoc, 3061 SourceLocation EndLoc) { 3062 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 3063 3064 getCurFunction()->setHasBranchProtectedScope(); 3065 3066 return OMPOrderedDirective::Create(Context, StartLoc, EndLoc, AStmt); 3067 } 3068 3069 StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, 3070 Stmt *AStmt, 3071 SourceLocation StartLoc, 3072 SourceLocation EndLoc) { 3073 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 3074 auto CS = cast<CapturedStmt>(AStmt); 3075 // 1.2.2 OpenMP Language Terminology 3076 // Structured block - An executable statement with a single entry at the 3077 // top and a single exit at the bottom. 3078 // The point of exit cannot be a branch out of the structured block. 3079 // longjmp() and throw() must not violate the entry/exit criteria. 3080 // TODO further analysis of associated statements and clauses. 3081 OpenMPClauseKind AtomicKind = OMPC_unknown; 3082 SourceLocation AtomicKindLoc; 3083 for (auto *C : Clauses) { 3084 if (C->getClauseKind() == OMPC_read || C->getClauseKind() == OMPC_write || 3085 C->getClauseKind() == OMPC_update || 3086 C->getClauseKind() == OMPC_capture) { 3087 if (AtomicKind != OMPC_unknown) { 3088 Diag(C->getLocStart(), diag::err_omp_atomic_several_clauses) 3089 << SourceRange(C->getLocStart(), C->getLocEnd()); 3090 Diag(AtomicKindLoc, diag::note_omp_atomic_previous_clause) 3091 << getOpenMPClauseName(AtomicKind); 3092 } else { 3093 AtomicKind = C->getClauseKind(); 3094 AtomicKindLoc = C->getLocStart(); 3095 } 3096 } 3097 } 3098 auto Body = CS->getCapturedStmt(); 3099 if (AtomicKind == OMPC_read) { 3100 if (!isa<Expr>(Body)) { 3101 Diag(Body->getLocStart(), 3102 diag::err_omp_atomic_read_not_expression_statement); 3103 return StmtError(); 3104 } 3105 } else if (AtomicKind == OMPC_write) { 3106 if (!isa<Expr>(Body)) { 3107 Diag(Body->getLocStart(), 3108 diag::err_omp_atomic_write_not_expression_statement); 3109 return StmtError(); 3110 } 3111 } else if (AtomicKind == OMPC_update || AtomicKind == OMPC_unknown) { 3112 if (!isa<Expr>(Body)) { 3113 Diag(Body->getLocStart(), 3114 diag::err_omp_atomic_update_not_expression_statement) 3115 << (AtomicKind == OMPC_update); 3116 return StmtError(); 3117 } 3118 } else if (AtomicKind == OMPC_capture) { 3119 if (isa<Expr>(Body) && !isa<BinaryOperator>(Body)) { 3120 Diag(Body->getLocStart(), 3121 diag::err_omp_atomic_capture_not_expression_statement); 3122 return StmtError(); 3123 } else if (!isa<Expr>(Body) && !isa<CompoundStmt>(Body)) { 3124 Diag(Body->getLocStart(), 3125 diag::err_omp_atomic_capture_not_compound_statement); 3126 return StmtError(); 3127 } 3128 } 3129 3130 getCurFunction()->setHasBranchProtectedScope(); 3131 3132 return OMPAtomicDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); 3133 } 3134 3135 StmtResult Sema::ActOnOpenMPTargetDirective(ArrayRef<OMPClause *> Clauses, 3136 Stmt *AStmt, 3137 SourceLocation StartLoc, 3138 SourceLocation EndLoc) { 3139 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 3140 3141 getCurFunction()->setHasBranchProtectedScope(); 3142 3143 return OMPTargetDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); 3144 } 3145 3146 OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr *Expr, 3147 SourceLocation StartLoc, 3148 SourceLocation LParenLoc, 3149 SourceLocation EndLoc) { 3150 OMPClause *Res = nullptr; 3151 switch (Kind) { 3152 case OMPC_if: 3153 Res = ActOnOpenMPIfClause(Expr, StartLoc, LParenLoc, EndLoc); 3154 break; 3155 case OMPC_final: 3156 Res = ActOnOpenMPFinalClause(Expr, StartLoc, LParenLoc, EndLoc); 3157 break; 3158 case OMPC_num_threads: 3159 Res = ActOnOpenMPNumThreadsClause(Expr, StartLoc, LParenLoc, EndLoc); 3160 break; 3161 case OMPC_safelen: 3162 Res = ActOnOpenMPSafelenClause(Expr, StartLoc, LParenLoc, EndLoc); 3163 break; 3164 case OMPC_collapse: 3165 Res = ActOnOpenMPCollapseClause(Expr, StartLoc, LParenLoc, EndLoc); 3166 break; 3167 case OMPC_default: 3168 case OMPC_proc_bind: 3169 case OMPC_schedule: 3170 case OMPC_private: 3171 case OMPC_firstprivate: 3172 case OMPC_lastprivate: 3173 case OMPC_shared: 3174 case OMPC_reduction: 3175 case OMPC_linear: 3176 case OMPC_aligned: 3177 case OMPC_copyin: 3178 case OMPC_copyprivate: 3179 case OMPC_ordered: 3180 case OMPC_nowait: 3181 case OMPC_untied: 3182 case OMPC_mergeable: 3183 case OMPC_threadprivate: 3184 case OMPC_flush: 3185 case OMPC_read: 3186 case OMPC_write: 3187 case OMPC_update: 3188 case OMPC_capture: 3189 case OMPC_seq_cst: 3190 case OMPC_unknown: 3191 llvm_unreachable("Clause is not allowed."); 3192 } 3193 return Res; 3194 } 3195 3196 OMPClause *Sema::ActOnOpenMPIfClause(Expr *Condition, SourceLocation StartLoc, 3197 SourceLocation LParenLoc, 3198 SourceLocation EndLoc) { 3199 Expr *ValExpr = Condition; 3200 if (!Condition->isValueDependent() && !Condition->isTypeDependent() && 3201 !Condition->isInstantiationDependent() && 3202 !Condition->containsUnexpandedParameterPack()) { 3203 ExprResult Val = ActOnBooleanCondition(DSAStack->getCurScope(), 3204 Condition->getExprLoc(), Condition); 3205 if (Val.isInvalid()) 3206 return nullptr; 3207 3208 ValExpr = Val.get(); 3209 } 3210 3211 return new (Context) OMPIfClause(ValExpr, StartLoc, LParenLoc, EndLoc); 3212 } 3213 3214 OMPClause *Sema::ActOnOpenMPFinalClause(Expr *Condition, 3215 SourceLocation StartLoc, 3216 SourceLocation LParenLoc, 3217 SourceLocation EndLoc) { 3218 Expr *ValExpr = Condition; 3219 if (!Condition->isValueDependent() && !Condition->isTypeDependent() && 3220 !Condition->isInstantiationDependent() && 3221 !Condition->containsUnexpandedParameterPack()) { 3222 ExprResult Val = ActOnBooleanCondition(DSAStack->getCurScope(), 3223 Condition->getExprLoc(), Condition); 3224 if (Val.isInvalid()) 3225 return nullptr; 3226 3227 ValExpr = Val.get(); 3228 } 3229 3230 return new (Context) OMPFinalClause(ValExpr, StartLoc, LParenLoc, EndLoc); 3231 } 3232 ExprResult Sema::PerformOpenMPImplicitIntegerConversion(SourceLocation Loc, 3233 Expr *Op) { 3234 if (!Op) 3235 return ExprError(); 3236 3237 class IntConvertDiagnoser : public ICEConvertDiagnoser { 3238 public: 3239 IntConvertDiagnoser() 3240 : ICEConvertDiagnoser(/*AllowScopedEnumerations*/ false, false, true) {} 3241 SemaDiagnosticBuilder diagnoseNotInt(Sema &S, SourceLocation Loc, 3242 QualType T) override { 3243 return S.Diag(Loc, diag::err_omp_not_integral) << T; 3244 } 3245 SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc, 3246 QualType T) override { 3247 return S.Diag(Loc, diag::err_omp_incomplete_type) << T; 3248 } 3249 SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc, 3250 QualType T, 3251 QualType ConvTy) override { 3252 return S.Diag(Loc, diag::err_omp_explicit_conversion) << T << ConvTy; 3253 } 3254 SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv, 3255 QualType ConvTy) override { 3256 return S.Diag(Conv->getLocation(), diag::note_omp_conversion_here) 3257 << ConvTy->isEnumeralType() << ConvTy; 3258 } 3259 SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc, 3260 QualType T) override { 3261 return S.Diag(Loc, diag::err_omp_ambiguous_conversion) << T; 3262 } 3263 SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv, 3264 QualType ConvTy) override { 3265 return S.Diag(Conv->getLocation(), diag::note_omp_conversion_here) 3266 << ConvTy->isEnumeralType() << ConvTy; 3267 } 3268 SemaDiagnosticBuilder diagnoseConversion(Sema &, SourceLocation, QualType, 3269 QualType) override { 3270 llvm_unreachable("conversion functions are permitted"); 3271 } 3272 } ConvertDiagnoser; 3273 return PerformContextualImplicitConversion(Loc, Op, ConvertDiagnoser); 3274 } 3275 3276 OMPClause *Sema::ActOnOpenMPNumThreadsClause(Expr *NumThreads, 3277 SourceLocation StartLoc, 3278 SourceLocation LParenLoc, 3279 SourceLocation EndLoc) { 3280 Expr *ValExpr = NumThreads; 3281 if (!NumThreads->isValueDependent() && !NumThreads->isTypeDependent() && 3282 !NumThreads->isInstantiationDependent() && 3283 !NumThreads->containsUnexpandedParameterPack()) { 3284 SourceLocation NumThreadsLoc = NumThreads->getLocStart(); 3285 ExprResult Val = 3286 PerformOpenMPImplicitIntegerConversion(NumThreadsLoc, NumThreads); 3287 if (Val.isInvalid()) 3288 return nullptr; 3289 3290 ValExpr = Val.get(); 3291 3292 // OpenMP [2.5, Restrictions] 3293 // The num_threads expression must evaluate to a positive integer value. 3294 llvm::APSInt Result; 3295 if (ValExpr->isIntegerConstantExpr(Result, Context) && Result.isSigned() && 3296 !Result.isStrictlyPositive()) { 3297 Diag(NumThreadsLoc, diag::err_omp_negative_expression_in_clause) 3298 << "num_threads" << NumThreads->getSourceRange(); 3299 return nullptr; 3300 } 3301 } 3302 3303 return new (Context) 3304 OMPNumThreadsClause(ValExpr, StartLoc, LParenLoc, EndLoc); 3305 } 3306 3307 ExprResult Sema::VerifyPositiveIntegerConstantInClause(Expr *E, 3308 OpenMPClauseKind CKind) { 3309 if (!E) 3310 return ExprError(); 3311 if (E->isValueDependent() || E->isTypeDependent() || 3312 E->isInstantiationDependent() || E->containsUnexpandedParameterPack()) 3313 return E; 3314 llvm::APSInt Result; 3315 ExprResult ICE = VerifyIntegerConstantExpression(E, &Result); 3316 if (ICE.isInvalid()) 3317 return ExprError(); 3318 if (!Result.isStrictlyPositive()) { 3319 Diag(E->getExprLoc(), diag::err_omp_negative_expression_in_clause) 3320 << getOpenMPClauseName(CKind) << E->getSourceRange(); 3321 return ExprError(); 3322 } 3323 if (CKind == OMPC_aligned && !Result.isPowerOf2()) { 3324 Diag(E->getExprLoc(), diag::warn_omp_alignment_not_power_of_two) 3325 << E->getSourceRange(); 3326 return ExprError(); 3327 } 3328 return ICE; 3329 } 3330 3331 OMPClause *Sema::ActOnOpenMPSafelenClause(Expr *Len, SourceLocation StartLoc, 3332 SourceLocation LParenLoc, 3333 SourceLocation EndLoc) { 3334 // OpenMP [2.8.1, simd construct, Description] 3335 // The parameter of the safelen clause must be a constant 3336 // positive integer expression. 3337 ExprResult Safelen = VerifyPositiveIntegerConstantInClause(Len, OMPC_safelen); 3338 if (Safelen.isInvalid()) 3339 return nullptr; 3340 return new (Context) 3341 OMPSafelenClause(Safelen.get(), StartLoc, LParenLoc, EndLoc); 3342 } 3343 3344 OMPClause *Sema::ActOnOpenMPCollapseClause(Expr *NumForLoops, 3345 SourceLocation StartLoc, 3346 SourceLocation LParenLoc, 3347 SourceLocation EndLoc) { 3348 // OpenMP [2.7.1, loop construct, Description] 3349 // OpenMP [2.8.1, simd construct, Description] 3350 // OpenMP [2.9.6, distribute construct, Description] 3351 // The parameter of the collapse clause must be a constant 3352 // positive integer expression. 3353 ExprResult NumForLoopsResult = 3354 VerifyPositiveIntegerConstantInClause(NumForLoops, OMPC_collapse); 3355 if (NumForLoopsResult.isInvalid()) 3356 return nullptr; 3357 return new (Context) 3358 OMPCollapseClause(NumForLoopsResult.get(), StartLoc, LParenLoc, EndLoc); 3359 } 3360 3361 OMPClause *Sema::ActOnOpenMPSimpleClause( 3362 OpenMPClauseKind Kind, unsigned Argument, SourceLocation ArgumentLoc, 3363 SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) { 3364 OMPClause *Res = nullptr; 3365 switch (Kind) { 3366 case OMPC_default: 3367 Res = 3368 ActOnOpenMPDefaultClause(static_cast<OpenMPDefaultClauseKind>(Argument), 3369 ArgumentLoc, StartLoc, LParenLoc, EndLoc); 3370 break; 3371 case OMPC_proc_bind: 3372 Res = ActOnOpenMPProcBindClause( 3373 static_cast<OpenMPProcBindClauseKind>(Argument), ArgumentLoc, StartLoc, 3374 LParenLoc, EndLoc); 3375 break; 3376 case OMPC_if: 3377 case OMPC_final: 3378 case OMPC_num_threads: 3379 case OMPC_safelen: 3380 case OMPC_collapse: 3381 case OMPC_schedule: 3382 case OMPC_private: 3383 case OMPC_firstprivate: 3384 case OMPC_lastprivate: 3385 case OMPC_shared: 3386 case OMPC_reduction: 3387 case OMPC_linear: 3388 case OMPC_aligned: 3389 case OMPC_copyin: 3390 case OMPC_copyprivate: 3391 case OMPC_ordered: 3392 case OMPC_nowait: 3393 case OMPC_untied: 3394 case OMPC_mergeable: 3395 case OMPC_threadprivate: 3396 case OMPC_flush: 3397 case OMPC_read: 3398 case OMPC_write: 3399 case OMPC_update: 3400 case OMPC_capture: 3401 case OMPC_seq_cst: 3402 case OMPC_unknown: 3403 llvm_unreachable("Clause is not allowed."); 3404 } 3405 return Res; 3406 } 3407 3408 OMPClause *Sema::ActOnOpenMPDefaultClause(OpenMPDefaultClauseKind Kind, 3409 SourceLocation KindKwLoc, 3410 SourceLocation StartLoc, 3411 SourceLocation LParenLoc, 3412 SourceLocation EndLoc) { 3413 if (Kind == OMPC_DEFAULT_unknown) { 3414 std::string Values; 3415 static_assert(OMPC_DEFAULT_unknown > 0, 3416 "OMPC_DEFAULT_unknown not greater than 0"); 3417 std::string Sep(", "); 3418 for (unsigned i = 0; i < OMPC_DEFAULT_unknown; ++i) { 3419 Values += "'"; 3420 Values += getOpenMPSimpleClauseTypeName(OMPC_default, i); 3421 Values += "'"; 3422 switch (i) { 3423 case OMPC_DEFAULT_unknown - 2: 3424 Values += " or "; 3425 break; 3426 case OMPC_DEFAULT_unknown - 1: 3427 break; 3428 default: 3429 Values += Sep; 3430 break; 3431 } 3432 } 3433 Diag(KindKwLoc, diag::err_omp_unexpected_clause_value) 3434 << Values << getOpenMPClauseName(OMPC_default); 3435 return nullptr; 3436 } 3437 switch (Kind) { 3438 case OMPC_DEFAULT_none: 3439 DSAStack->setDefaultDSANone(KindKwLoc); 3440 break; 3441 case OMPC_DEFAULT_shared: 3442 DSAStack->setDefaultDSAShared(KindKwLoc); 3443 break; 3444 case OMPC_DEFAULT_unknown: 3445 llvm_unreachable("Clause kind is not allowed."); 3446 break; 3447 } 3448 return new (Context) 3449 OMPDefaultClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc); 3450 } 3451 3452 OMPClause *Sema::ActOnOpenMPProcBindClause(OpenMPProcBindClauseKind Kind, 3453 SourceLocation KindKwLoc, 3454 SourceLocation StartLoc, 3455 SourceLocation LParenLoc, 3456 SourceLocation EndLoc) { 3457 if (Kind == OMPC_PROC_BIND_unknown) { 3458 std::string Values; 3459 std::string Sep(", "); 3460 for (unsigned i = 0; i < OMPC_PROC_BIND_unknown; ++i) { 3461 Values += "'"; 3462 Values += getOpenMPSimpleClauseTypeName(OMPC_proc_bind, i); 3463 Values += "'"; 3464 switch (i) { 3465 case OMPC_PROC_BIND_unknown - 2: 3466 Values += " or "; 3467 break; 3468 case OMPC_PROC_BIND_unknown - 1: 3469 break; 3470 default: 3471 Values += Sep; 3472 break; 3473 } 3474 } 3475 Diag(KindKwLoc, diag::err_omp_unexpected_clause_value) 3476 << Values << getOpenMPClauseName(OMPC_proc_bind); 3477 return nullptr; 3478 } 3479 return new (Context) 3480 OMPProcBindClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc); 3481 } 3482 3483 OMPClause *Sema::ActOnOpenMPSingleExprWithArgClause( 3484 OpenMPClauseKind Kind, unsigned Argument, Expr *Expr, 3485 SourceLocation StartLoc, SourceLocation LParenLoc, 3486 SourceLocation ArgumentLoc, SourceLocation CommaLoc, 3487 SourceLocation EndLoc) { 3488 OMPClause *Res = nullptr; 3489 switch (Kind) { 3490 case OMPC_schedule: 3491 Res = ActOnOpenMPScheduleClause( 3492 static_cast<OpenMPScheduleClauseKind>(Argument), Expr, StartLoc, 3493 LParenLoc, ArgumentLoc, CommaLoc, EndLoc); 3494 break; 3495 case OMPC_if: 3496 case OMPC_final: 3497 case OMPC_num_threads: 3498 case OMPC_safelen: 3499 case OMPC_collapse: 3500 case OMPC_default: 3501 case OMPC_proc_bind: 3502 case OMPC_private: 3503 case OMPC_firstprivate: 3504 case OMPC_lastprivate: 3505 case OMPC_shared: 3506 case OMPC_reduction: 3507 case OMPC_linear: 3508 case OMPC_aligned: 3509 case OMPC_copyin: 3510 case OMPC_copyprivate: 3511 case OMPC_ordered: 3512 case OMPC_nowait: 3513 case OMPC_untied: 3514 case OMPC_mergeable: 3515 case OMPC_threadprivate: 3516 case OMPC_flush: 3517 case OMPC_read: 3518 case OMPC_write: 3519 case OMPC_update: 3520 case OMPC_capture: 3521 case OMPC_seq_cst: 3522 case OMPC_unknown: 3523 llvm_unreachable("Clause is not allowed."); 3524 } 3525 return Res; 3526 } 3527 3528 OMPClause *Sema::ActOnOpenMPScheduleClause( 3529 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 3530 SourceLocation LParenLoc, SourceLocation KindLoc, SourceLocation CommaLoc, 3531 SourceLocation EndLoc) { 3532 if (Kind == OMPC_SCHEDULE_unknown) { 3533 std::string Values; 3534 std::string Sep(", "); 3535 for (unsigned i = 0; i < OMPC_SCHEDULE_unknown; ++i) { 3536 Values += "'"; 3537 Values += getOpenMPSimpleClauseTypeName(OMPC_schedule, i); 3538 Values += "'"; 3539 switch (i) { 3540 case OMPC_SCHEDULE_unknown - 2: 3541 Values += " or "; 3542 break; 3543 case OMPC_SCHEDULE_unknown - 1: 3544 break; 3545 default: 3546 Values += Sep; 3547 break; 3548 } 3549 } 3550 Diag(KindLoc, diag::err_omp_unexpected_clause_value) 3551 << Values << getOpenMPClauseName(OMPC_schedule); 3552 return nullptr; 3553 } 3554 Expr *ValExpr = ChunkSize; 3555 if (ChunkSize) { 3556 if (!ChunkSize->isValueDependent() && !ChunkSize->isTypeDependent() && 3557 !ChunkSize->isInstantiationDependent() && 3558 !ChunkSize->containsUnexpandedParameterPack()) { 3559 SourceLocation ChunkSizeLoc = ChunkSize->getLocStart(); 3560 ExprResult Val = 3561 PerformOpenMPImplicitIntegerConversion(ChunkSizeLoc, ChunkSize); 3562 if (Val.isInvalid()) 3563 return nullptr; 3564 3565 ValExpr = Val.get(); 3566 3567 // OpenMP [2.7.1, Restrictions] 3568 // chunk_size must be a loop invariant integer expression with a positive 3569 // value. 3570 llvm::APSInt Result; 3571 if (ValExpr->isIntegerConstantExpr(Result, Context) && 3572 Result.isSigned() && !Result.isStrictlyPositive()) { 3573 Diag(ChunkSizeLoc, diag::err_omp_negative_expression_in_clause) 3574 << "schedule" << ChunkSize->getSourceRange(); 3575 return nullptr; 3576 } 3577 } 3578 } 3579 3580 return new (Context) OMPScheduleClause(StartLoc, LParenLoc, KindLoc, CommaLoc, 3581 EndLoc, Kind, ValExpr); 3582 } 3583 3584 OMPClause *Sema::ActOnOpenMPClause(OpenMPClauseKind Kind, 3585 SourceLocation StartLoc, 3586 SourceLocation EndLoc) { 3587 OMPClause *Res = nullptr; 3588 switch (Kind) { 3589 case OMPC_ordered: 3590 Res = ActOnOpenMPOrderedClause(StartLoc, EndLoc); 3591 break; 3592 case OMPC_nowait: 3593 Res = ActOnOpenMPNowaitClause(StartLoc, EndLoc); 3594 break; 3595 case OMPC_untied: 3596 Res = ActOnOpenMPUntiedClause(StartLoc, EndLoc); 3597 break; 3598 case OMPC_mergeable: 3599 Res = ActOnOpenMPMergeableClause(StartLoc, EndLoc); 3600 break; 3601 case OMPC_read: 3602 Res = ActOnOpenMPReadClause(StartLoc, EndLoc); 3603 break; 3604 case OMPC_write: 3605 Res = ActOnOpenMPWriteClause(StartLoc, EndLoc); 3606 break; 3607 case OMPC_update: 3608 Res = ActOnOpenMPUpdateClause(StartLoc, EndLoc); 3609 break; 3610 case OMPC_capture: 3611 Res = ActOnOpenMPCaptureClause(StartLoc, EndLoc); 3612 break; 3613 case OMPC_seq_cst: 3614 Res = ActOnOpenMPSeqCstClause(StartLoc, EndLoc); 3615 break; 3616 case OMPC_if: 3617 case OMPC_final: 3618 case OMPC_num_threads: 3619 case OMPC_safelen: 3620 case OMPC_collapse: 3621 case OMPC_schedule: 3622 case OMPC_private: 3623 case OMPC_firstprivate: 3624 case OMPC_lastprivate: 3625 case OMPC_shared: 3626 case OMPC_reduction: 3627 case OMPC_linear: 3628 case OMPC_aligned: 3629 case OMPC_copyin: 3630 case OMPC_copyprivate: 3631 case OMPC_default: 3632 case OMPC_proc_bind: 3633 case OMPC_threadprivate: 3634 case OMPC_flush: 3635 case OMPC_unknown: 3636 llvm_unreachable("Clause is not allowed."); 3637 } 3638 return Res; 3639 } 3640 3641 OMPClause *Sema::ActOnOpenMPOrderedClause(SourceLocation StartLoc, 3642 SourceLocation EndLoc) { 3643 DSAStack->setOrderedRegion(); 3644 return new (Context) OMPOrderedClause(StartLoc, EndLoc); 3645 } 3646 3647 OMPClause *Sema::ActOnOpenMPNowaitClause(SourceLocation StartLoc, 3648 SourceLocation EndLoc) { 3649 return new (Context) OMPNowaitClause(StartLoc, EndLoc); 3650 } 3651 3652 OMPClause *Sema::ActOnOpenMPUntiedClause(SourceLocation StartLoc, 3653 SourceLocation EndLoc) { 3654 return new (Context) OMPUntiedClause(StartLoc, EndLoc); 3655 } 3656 3657 OMPClause *Sema::ActOnOpenMPMergeableClause(SourceLocation StartLoc, 3658 SourceLocation EndLoc) { 3659 return new (Context) OMPMergeableClause(StartLoc, EndLoc); 3660 } 3661 3662 OMPClause *Sema::ActOnOpenMPReadClause(SourceLocation StartLoc, 3663 SourceLocation EndLoc) { 3664 return new (Context) OMPReadClause(StartLoc, EndLoc); 3665 } 3666 3667 OMPClause *Sema::ActOnOpenMPWriteClause(SourceLocation StartLoc, 3668 SourceLocation EndLoc) { 3669 return new (Context) OMPWriteClause(StartLoc, EndLoc); 3670 } 3671 3672 OMPClause *Sema::ActOnOpenMPUpdateClause(SourceLocation StartLoc, 3673 SourceLocation EndLoc) { 3674 return new (Context) OMPUpdateClause(StartLoc, EndLoc); 3675 } 3676 3677 OMPClause *Sema::ActOnOpenMPCaptureClause(SourceLocation StartLoc, 3678 SourceLocation EndLoc) { 3679 return new (Context) OMPCaptureClause(StartLoc, EndLoc); 3680 } 3681 3682 OMPClause *Sema::ActOnOpenMPSeqCstClause(SourceLocation StartLoc, 3683 SourceLocation EndLoc) { 3684 return new (Context) OMPSeqCstClause(StartLoc, EndLoc); 3685 } 3686 3687 OMPClause *Sema::ActOnOpenMPVarListClause( 3688 OpenMPClauseKind Kind, ArrayRef<Expr *> VarList, Expr *TailExpr, 3689 SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, 3690 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 3691 const DeclarationNameInfo &ReductionId) { 3692 OMPClause *Res = nullptr; 3693 switch (Kind) { 3694 case OMPC_private: 3695 Res = ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, EndLoc); 3696 break; 3697 case OMPC_firstprivate: 3698 Res = ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, EndLoc); 3699 break; 3700 case OMPC_lastprivate: 3701 Res = ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, EndLoc); 3702 break; 3703 case OMPC_shared: 3704 Res = ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, EndLoc); 3705 break; 3706 case OMPC_reduction: 3707 Res = ActOnOpenMPReductionClause(VarList, StartLoc, LParenLoc, ColonLoc, 3708 EndLoc, ReductionIdScopeSpec, ReductionId); 3709 break; 3710 case OMPC_linear: 3711 Res = ActOnOpenMPLinearClause(VarList, TailExpr, StartLoc, LParenLoc, 3712 ColonLoc, EndLoc); 3713 break; 3714 case OMPC_aligned: 3715 Res = ActOnOpenMPAlignedClause(VarList, TailExpr, StartLoc, LParenLoc, 3716 ColonLoc, EndLoc); 3717 break; 3718 case OMPC_copyin: 3719 Res = ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, EndLoc); 3720 break; 3721 case OMPC_copyprivate: 3722 Res = ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, EndLoc); 3723 break; 3724 case OMPC_flush: 3725 Res = ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, EndLoc); 3726 break; 3727 case OMPC_if: 3728 case OMPC_final: 3729 case OMPC_num_threads: 3730 case OMPC_safelen: 3731 case OMPC_collapse: 3732 case OMPC_default: 3733 case OMPC_proc_bind: 3734 case OMPC_schedule: 3735 case OMPC_ordered: 3736 case OMPC_nowait: 3737 case OMPC_untied: 3738 case OMPC_mergeable: 3739 case OMPC_threadprivate: 3740 case OMPC_read: 3741 case OMPC_write: 3742 case OMPC_update: 3743 case OMPC_capture: 3744 case OMPC_seq_cst: 3745 case OMPC_unknown: 3746 llvm_unreachable("Clause is not allowed."); 3747 } 3748 return Res; 3749 } 3750 3751 OMPClause *Sema::ActOnOpenMPPrivateClause(ArrayRef<Expr *> VarList, 3752 SourceLocation StartLoc, 3753 SourceLocation LParenLoc, 3754 SourceLocation EndLoc) { 3755 SmallVector<Expr *, 8> Vars; 3756 for (auto &RefExpr : VarList) { 3757 assert(RefExpr && "NULL expr in OpenMP private clause."); 3758 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 3759 // It will be analyzed later. 3760 Vars.push_back(RefExpr); 3761 continue; 3762 } 3763 3764 SourceLocation ELoc = RefExpr->getExprLoc(); 3765 // OpenMP [2.1, C/C++] 3766 // A list item is a variable name. 3767 // OpenMP [2.9.3.3, Restrictions, p.1] 3768 // A variable that is part of another variable (as an array or 3769 // structure element) cannot appear in a private clause. 3770 DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr); 3771 if (!DE || !isa<VarDecl>(DE->getDecl())) { 3772 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 3773 continue; 3774 } 3775 Decl *D = DE->getDecl(); 3776 VarDecl *VD = cast<VarDecl>(D); 3777 3778 QualType Type = VD->getType(); 3779 if (Type->isDependentType() || Type->isInstantiationDependentType()) { 3780 // It will be analyzed later. 3781 Vars.push_back(DE); 3782 continue; 3783 } 3784 3785 // OpenMP [2.9.3.3, Restrictions, C/C++, p.3] 3786 // A variable that appears in a private clause must not have an incomplete 3787 // type or a reference type. 3788 if (RequireCompleteType(ELoc, Type, 3789 diag::err_omp_private_incomplete_type)) { 3790 continue; 3791 } 3792 if (Type->isReferenceType()) { 3793 Diag(ELoc, diag::err_omp_clause_ref_type_arg) 3794 << getOpenMPClauseName(OMPC_private) << Type; 3795 bool IsDecl = 3796 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 3797 Diag(VD->getLocation(), 3798 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3799 << VD; 3800 continue; 3801 } 3802 3803 // OpenMP [2.9.3.3, Restrictions, C/C++, p.1] 3804 // A variable of class type (or array thereof) that appears in a private 3805 // clause requires an accessible, unambiguous default constructor for the 3806 // class type. 3807 while (Type.getNonReferenceType()->isArrayType()) { 3808 Type = cast<ArrayType>(Type.getNonReferenceType().getTypePtr()) 3809 ->getElementType(); 3810 } 3811 CXXRecordDecl *RD = getLangOpts().CPlusPlus 3812 ? Type.getNonReferenceType()->getAsCXXRecordDecl() 3813 : nullptr; 3814 // FIXME This code must be replaced by actual constructing/destructing of 3815 // the private variable. 3816 if (RD) { 3817 CXXConstructorDecl *CD = LookupDefaultConstructor(RD); 3818 PartialDiagnostic PD = 3819 PartialDiagnostic(PartialDiagnostic::NullDiagnostic()); 3820 if (!CD || 3821 CheckConstructorAccess(ELoc, CD, 3822 InitializedEntity::InitializeTemporary(Type), 3823 CD->getAccess(), PD) == AR_inaccessible || 3824 CD->isDeleted()) { 3825 Diag(ELoc, diag::err_omp_required_method) 3826 << getOpenMPClauseName(OMPC_private) << 0; 3827 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 3828 VarDecl::DeclarationOnly; 3829 Diag(VD->getLocation(), 3830 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3831 << VD; 3832 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 3833 continue; 3834 } 3835 MarkFunctionReferenced(ELoc, CD); 3836 DiagnoseUseOfDecl(CD, ELoc); 3837 3838 CXXDestructorDecl *DD = RD->getDestructor(); 3839 if (DD) { 3840 if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible || 3841 DD->isDeleted()) { 3842 Diag(ELoc, diag::err_omp_required_method) 3843 << getOpenMPClauseName(OMPC_private) << 4; 3844 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 3845 VarDecl::DeclarationOnly; 3846 Diag(VD->getLocation(), 3847 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3848 << VD; 3849 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 3850 continue; 3851 } 3852 MarkFunctionReferenced(ELoc, DD); 3853 DiagnoseUseOfDecl(DD, ELoc); 3854 } 3855 } 3856 3857 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 3858 // in a Construct] 3859 // Variables with the predetermined data-sharing attributes may not be 3860 // listed in data-sharing attributes clauses, except for the cases 3861 // listed below. For these exceptions only, listing a predetermined 3862 // variable in a data-sharing attribute clause is allowed and overrides 3863 // the variable's predetermined data-sharing attributes. 3864 DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false); 3865 if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_private) { 3866 Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind) 3867 << getOpenMPClauseName(OMPC_private); 3868 ReportOriginalDSA(*this, DSAStack, VD, DVar); 3869 continue; 3870 } 3871 3872 DSAStack->addDSA(VD, DE, OMPC_private); 3873 Vars.push_back(DE); 3874 } 3875 3876 if (Vars.empty()) 3877 return nullptr; 3878 3879 return OMPPrivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars); 3880 } 3881 3882 OMPClause *Sema::ActOnOpenMPFirstprivateClause(ArrayRef<Expr *> VarList, 3883 SourceLocation StartLoc, 3884 SourceLocation LParenLoc, 3885 SourceLocation EndLoc) { 3886 SmallVector<Expr *, 8> Vars; 3887 bool IsImplicitClause = 3888 StartLoc.isInvalid() && LParenLoc.isInvalid() && EndLoc.isInvalid(); 3889 auto ImplicitClauseLoc = DSAStack->getConstructLoc(); 3890 3891 for (auto &RefExpr : VarList) { 3892 assert(RefExpr && "NULL expr in OpenMP firstprivate clause."); 3893 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 3894 // It will be analyzed later. 3895 Vars.push_back(RefExpr); 3896 continue; 3897 } 3898 3899 SourceLocation ELoc = IsImplicitClause ? ImplicitClauseLoc 3900 : RefExpr->getExprLoc(); 3901 // OpenMP [2.1, C/C++] 3902 // A list item is a variable name. 3903 // OpenMP [2.9.3.3, Restrictions, p.1] 3904 // A variable that is part of another variable (as an array or 3905 // structure element) cannot appear in a private clause. 3906 DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr); 3907 if (!DE || !isa<VarDecl>(DE->getDecl())) { 3908 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 3909 continue; 3910 } 3911 Decl *D = DE->getDecl(); 3912 VarDecl *VD = cast<VarDecl>(D); 3913 3914 QualType Type = VD->getType(); 3915 if (Type->isDependentType() || Type->isInstantiationDependentType()) { 3916 // It will be analyzed later. 3917 Vars.push_back(DE); 3918 continue; 3919 } 3920 3921 // OpenMP [2.9.3.3, Restrictions, C/C++, p.3] 3922 // A variable that appears in a private clause must not have an incomplete 3923 // type or a reference type. 3924 if (RequireCompleteType(ELoc, Type, 3925 diag::err_omp_firstprivate_incomplete_type)) { 3926 continue; 3927 } 3928 if (Type->isReferenceType()) { 3929 if (IsImplicitClause) { 3930 Diag(ImplicitClauseLoc, 3931 diag::err_omp_task_predetermined_firstprivate_ref_type_arg) 3932 << Type; 3933 Diag(RefExpr->getExprLoc(), diag::note_used_here); 3934 } else { 3935 Diag(ELoc, diag::err_omp_clause_ref_type_arg) 3936 << getOpenMPClauseName(OMPC_firstprivate) << Type; 3937 } 3938 bool IsDecl = 3939 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 3940 Diag(VD->getLocation(), 3941 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3942 << VD; 3943 continue; 3944 } 3945 3946 // OpenMP [2.9.3.4, Restrictions, C/C++, p.1] 3947 // A variable of class type (or array thereof) that appears in a private 3948 // clause requires an accessible, unambiguous copy constructor for the 3949 // class type. 3950 Type = Context.getBaseElementType(Type); 3951 CXXRecordDecl *RD = getLangOpts().CPlusPlus 3952 ? Type.getNonReferenceType()->getAsCXXRecordDecl() 3953 : nullptr; 3954 // FIXME This code must be replaced by actual constructing/destructing of 3955 // the firstprivate variable. 3956 if (RD) { 3957 CXXConstructorDecl *CD = LookupCopyingConstructor(RD, 0); 3958 PartialDiagnostic PD = 3959 PartialDiagnostic(PartialDiagnostic::NullDiagnostic()); 3960 if (!CD || 3961 CheckConstructorAccess(ELoc, CD, 3962 InitializedEntity::InitializeTemporary(Type), 3963 CD->getAccess(), PD) == AR_inaccessible || 3964 CD->isDeleted()) { 3965 if (IsImplicitClause) { 3966 Diag(ImplicitClauseLoc, 3967 diag::err_omp_task_predetermined_firstprivate_required_method) 3968 << 0; 3969 Diag(RefExpr->getExprLoc(), diag::note_used_here); 3970 } else { 3971 Diag(ELoc, diag::err_omp_required_method) 3972 << getOpenMPClauseName(OMPC_firstprivate) << 1; 3973 } 3974 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 3975 VarDecl::DeclarationOnly; 3976 Diag(VD->getLocation(), 3977 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3978 << VD; 3979 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 3980 continue; 3981 } 3982 MarkFunctionReferenced(ELoc, CD); 3983 DiagnoseUseOfDecl(CD, ELoc); 3984 3985 CXXDestructorDecl *DD = RD->getDestructor(); 3986 if (DD) { 3987 if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible || 3988 DD->isDeleted()) { 3989 if (IsImplicitClause) { 3990 Diag(ImplicitClauseLoc, 3991 diag::err_omp_task_predetermined_firstprivate_required_method) 3992 << 1; 3993 Diag(RefExpr->getExprLoc(), diag::note_used_here); 3994 } else { 3995 Diag(ELoc, diag::err_omp_required_method) 3996 << getOpenMPClauseName(OMPC_firstprivate) << 4; 3997 } 3998 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 3999 VarDecl::DeclarationOnly; 4000 Diag(VD->getLocation(), 4001 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4002 << VD; 4003 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 4004 continue; 4005 } 4006 MarkFunctionReferenced(ELoc, DD); 4007 DiagnoseUseOfDecl(DD, ELoc); 4008 } 4009 } 4010 4011 // If an implicit firstprivate variable found it was checked already. 4012 if (!IsImplicitClause) { 4013 DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false); 4014 Type = Type.getNonReferenceType().getCanonicalType(); 4015 bool IsConstant = Type.isConstant(Context); 4016 Type = Context.getBaseElementType(Type); 4017 // OpenMP [2.4.13, Data-sharing Attribute Clauses] 4018 // A list item that specifies a given variable may not appear in more 4019 // than one clause on the same directive, except that a variable may be 4020 // specified in both firstprivate and lastprivate clauses. 4021 if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_firstprivate && 4022 DVar.CKind != OMPC_lastprivate && DVar.RefExpr) { 4023 Diag(ELoc, diag::err_omp_wrong_dsa) 4024 << getOpenMPClauseName(DVar.CKind) 4025 << getOpenMPClauseName(OMPC_firstprivate); 4026 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4027 continue; 4028 } 4029 4030 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 4031 // in a Construct] 4032 // Variables with the predetermined data-sharing attributes may not be 4033 // listed in data-sharing attributes clauses, except for the cases 4034 // listed below. For these exceptions only, listing a predetermined 4035 // variable in a data-sharing attribute clause is allowed and overrides 4036 // the variable's predetermined data-sharing attributes. 4037 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 4038 // in a Construct, C/C++, p.2] 4039 // Variables with const-qualified type having no mutable member may be 4040 // listed in a firstprivate clause, even if they are static data members. 4041 if (!(IsConstant || VD->isStaticDataMember()) && !DVar.RefExpr && 4042 DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_shared) { 4043 Diag(ELoc, diag::err_omp_wrong_dsa) 4044 << getOpenMPClauseName(DVar.CKind) 4045 << getOpenMPClauseName(OMPC_firstprivate); 4046 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4047 continue; 4048 } 4049 4050 OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective(); 4051 // OpenMP [2.9.3.4, Restrictions, p.2] 4052 // A list item that is private within a parallel region must not appear 4053 // in a firstprivate clause on a worksharing construct if any of the 4054 // worksharing regions arising from the worksharing construct ever bind 4055 // to any of the parallel regions arising from the parallel construct. 4056 if (isOpenMPWorksharingDirective(CurrDir) && 4057 !isOpenMPParallelDirective(CurrDir)) { 4058 DVar = DSAStack->getImplicitDSA(VD, true); 4059 if (DVar.CKind != OMPC_shared && 4060 (isOpenMPParallelDirective(DVar.DKind) || 4061 DVar.DKind == OMPD_unknown)) { 4062 Diag(ELoc, diag::err_omp_required_access) 4063 << getOpenMPClauseName(OMPC_firstprivate) 4064 << getOpenMPClauseName(OMPC_shared); 4065 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4066 continue; 4067 } 4068 } 4069 // OpenMP [2.9.3.4, Restrictions, p.3] 4070 // A list item that appears in a reduction clause of a parallel construct 4071 // must not appear in a firstprivate clause on a worksharing or task 4072 // construct if any of the worksharing or task regions arising from the 4073 // worksharing or task construct ever bind to any of the parallel regions 4074 // arising from the parallel construct. 4075 // OpenMP [2.9.3.4, Restrictions, p.4] 4076 // A list item that appears in a reduction clause in worksharing 4077 // construct must not appear in a firstprivate clause in a task construct 4078 // encountered during execution of any of the worksharing regions arising 4079 // from the worksharing construct. 4080 if (CurrDir == OMPD_task) { 4081 DVar = 4082 DSAStack->hasInnermostDSA(VD, MatchesAnyClause(OMPC_reduction), 4083 [](OpenMPDirectiveKind K) -> bool { 4084 return isOpenMPParallelDirective(K) || 4085 isOpenMPWorksharingDirective(K); 4086 }, 4087 false); 4088 if (DVar.CKind == OMPC_reduction && 4089 (isOpenMPParallelDirective(DVar.DKind) || 4090 isOpenMPWorksharingDirective(DVar.DKind))) { 4091 Diag(ELoc, diag::err_omp_parallel_reduction_in_task_firstprivate) 4092 << getOpenMPDirectiveName(DVar.DKind); 4093 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4094 continue; 4095 } 4096 } 4097 } 4098 4099 DSAStack->addDSA(VD, DE, OMPC_firstprivate); 4100 Vars.push_back(DE); 4101 } 4102 4103 if (Vars.empty()) 4104 return nullptr; 4105 4106 return OMPFirstprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, 4107 Vars); 4108 } 4109 4110 OMPClause *Sema::ActOnOpenMPLastprivateClause(ArrayRef<Expr *> VarList, 4111 SourceLocation StartLoc, 4112 SourceLocation LParenLoc, 4113 SourceLocation EndLoc) { 4114 SmallVector<Expr *, 8> Vars; 4115 for (auto &RefExpr : VarList) { 4116 assert(RefExpr && "NULL expr in OpenMP lastprivate clause."); 4117 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 4118 // It will be analyzed later. 4119 Vars.push_back(RefExpr); 4120 continue; 4121 } 4122 4123 SourceLocation ELoc = RefExpr->getExprLoc(); 4124 // OpenMP [2.1, C/C++] 4125 // A list item is a variable name. 4126 // OpenMP [2.14.3.5, Restrictions, p.1] 4127 // A variable that is part of another variable (as an array or structure 4128 // element) cannot appear in a lastprivate clause. 4129 DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr); 4130 if (!DE || !isa<VarDecl>(DE->getDecl())) { 4131 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 4132 continue; 4133 } 4134 Decl *D = DE->getDecl(); 4135 VarDecl *VD = cast<VarDecl>(D); 4136 4137 QualType Type = VD->getType(); 4138 if (Type->isDependentType() || Type->isInstantiationDependentType()) { 4139 // It will be analyzed later. 4140 Vars.push_back(DE); 4141 continue; 4142 } 4143 4144 // OpenMP [2.14.3.5, Restrictions, C/C++, p.2] 4145 // A variable that appears in a lastprivate clause must not have an 4146 // incomplete type or a reference type. 4147 if (RequireCompleteType(ELoc, Type, 4148 diag::err_omp_lastprivate_incomplete_type)) { 4149 continue; 4150 } 4151 if (Type->isReferenceType()) { 4152 Diag(ELoc, diag::err_omp_clause_ref_type_arg) 4153 << getOpenMPClauseName(OMPC_lastprivate) << Type; 4154 bool IsDecl = 4155 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4156 Diag(VD->getLocation(), 4157 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4158 << VD; 4159 continue; 4160 } 4161 4162 // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced 4163 // in a Construct] 4164 // Variables with the predetermined data-sharing attributes may not be 4165 // listed in data-sharing attributes clauses, except for the cases 4166 // listed below. 4167 DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false); 4168 if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_lastprivate && 4169 DVar.CKind != OMPC_firstprivate && 4170 (DVar.CKind != OMPC_private || DVar.RefExpr != nullptr)) { 4171 Diag(ELoc, diag::err_omp_wrong_dsa) 4172 << getOpenMPClauseName(DVar.CKind) 4173 << getOpenMPClauseName(OMPC_lastprivate); 4174 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4175 continue; 4176 } 4177 4178 OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective(); 4179 // OpenMP [2.14.3.5, Restrictions, p.2] 4180 // A list item that is private within a parallel region, or that appears in 4181 // the reduction clause of a parallel construct, must not appear in a 4182 // lastprivate clause on a worksharing construct if any of the corresponding 4183 // worksharing regions ever binds to any of the corresponding parallel 4184 // regions. 4185 if (isOpenMPWorksharingDirective(CurrDir) && 4186 !isOpenMPParallelDirective(CurrDir)) { 4187 DVar = DSAStack->getImplicitDSA(VD, true); 4188 if (DVar.CKind != OMPC_shared) { 4189 Diag(ELoc, diag::err_omp_required_access) 4190 << getOpenMPClauseName(OMPC_lastprivate) 4191 << getOpenMPClauseName(OMPC_shared); 4192 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4193 continue; 4194 } 4195 } 4196 // OpenMP [2.14.3.5, Restrictions, C++, p.1,2] 4197 // A variable of class type (or array thereof) that appears in a 4198 // lastprivate clause requires an accessible, unambiguous default 4199 // constructor for the class type, unless the list item is also specified 4200 // in a firstprivate clause. 4201 // A variable of class type (or array thereof) that appears in a 4202 // lastprivate clause requires an accessible, unambiguous copy assignment 4203 // operator for the class type. 4204 while (Type.getNonReferenceType()->isArrayType()) 4205 Type = cast<ArrayType>(Type.getNonReferenceType().getTypePtr()) 4206 ->getElementType(); 4207 CXXRecordDecl *RD = getLangOpts().CPlusPlus 4208 ? Type.getNonReferenceType()->getAsCXXRecordDecl() 4209 : nullptr; 4210 // FIXME This code must be replaced by actual copying and destructing of the 4211 // lastprivate variable. 4212 if (RD) { 4213 CXXMethodDecl *MD = LookupCopyingAssignment(RD, 0, false, 0); 4214 DeclAccessPair FoundDecl = DeclAccessPair::make(MD, MD->getAccess()); 4215 if (MD) { 4216 if (CheckMemberAccess(ELoc, RD, FoundDecl) == AR_inaccessible || 4217 MD->isDeleted()) { 4218 Diag(ELoc, diag::err_omp_required_method) 4219 << getOpenMPClauseName(OMPC_lastprivate) << 2; 4220 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 4221 VarDecl::DeclarationOnly; 4222 Diag(VD->getLocation(), 4223 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4224 << VD; 4225 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 4226 continue; 4227 } 4228 MarkFunctionReferenced(ELoc, MD); 4229 DiagnoseUseOfDecl(MD, ELoc); 4230 } 4231 4232 CXXDestructorDecl *DD = RD->getDestructor(); 4233 if (DD) { 4234 PartialDiagnostic PD = 4235 PartialDiagnostic(PartialDiagnostic::NullDiagnostic()); 4236 if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible || 4237 DD->isDeleted()) { 4238 Diag(ELoc, diag::err_omp_required_method) 4239 << getOpenMPClauseName(OMPC_lastprivate) << 4; 4240 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 4241 VarDecl::DeclarationOnly; 4242 Diag(VD->getLocation(), 4243 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4244 << VD; 4245 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 4246 continue; 4247 } 4248 MarkFunctionReferenced(ELoc, DD); 4249 DiagnoseUseOfDecl(DD, ELoc); 4250 } 4251 } 4252 4253 if (DVar.CKind != OMPC_firstprivate) 4254 DSAStack->addDSA(VD, DE, OMPC_lastprivate); 4255 Vars.push_back(DE); 4256 } 4257 4258 if (Vars.empty()) 4259 return nullptr; 4260 4261 return OMPLastprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, 4262 Vars); 4263 } 4264 4265 OMPClause *Sema::ActOnOpenMPSharedClause(ArrayRef<Expr *> VarList, 4266 SourceLocation StartLoc, 4267 SourceLocation LParenLoc, 4268 SourceLocation EndLoc) { 4269 SmallVector<Expr *, 8> Vars; 4270 for (auto &RefExpr : VarList) { 4271 assert(RefExpr && "NULL expr in OpenMP shared clause."); 4272 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 4273 // It will be analyzed later. 4274 Vars.push_back(RefExpr); 4275 continue; 4276 } 4277 4278 SourceLocation ELoc = RefExpr->getExprLoc(); 4279 // OpenMP [2.1, C/C++] 4280 // A list item is a variable name. 4281 // OpenMP [2.14.3.2, Restrictions, p.1] 4282 // A variable that is part of another variable (as an array or structure 4283 // element) cannot appear in a shared unless it is a static data member 4284 // of a C++ class. 4285 DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr); 4286 if (!DE || !isa<VarDecl>(DE->getDecl())) { 4287 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 4288 continue; 4289 } 4290 Decl *D = DE->getDecl(); 4291 VarDecl *VD = cast<VarDecl>(D); 4292 4293 QualType Type = VD->getType(); 4294 if (Type->isDependentType() || Type->isInstantiationDependentType()) { 4295 // It will be analyzed later. 4296 Vars.push_back(DE); 4297 continue; 4298 } 4299 4300 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 4301 // in a Construct] 4302 // Variables with the predetermined data-sharing attributes may not be 4303 // listed in data-sharing attributes clauses, except for the cases 4304 // listed below. For these exceptions only, listing a predetermined 4305 // variable in a data-sharing attribute clause is allowed and overrides 4306 // the variable's predetermined data-sharing attributes. 4307 DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false); 4308 if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_shared && 4309 DVar.RefExpr) { 4310 Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind) 4311 << getOpenMPClauseName(OMPC_shared); 4312 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4313 continue; 4314 } 4315 4316 DSAStack->addDSA(VD, DE, OMPC_shared); 4317 Vars.push_back(DE); 4318 } 4319 4320 if (Vars.empty()) 4321 return nullptr; 4322 4323 return OMPSharedClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars); 4324 } 4325 4326 namespace { 4327 class DSARefChecker : public StmtVisitor<DSARefChecker, bool> { 4328 DSAStackTy *Stack; 4329 4330 public: 4331 bool VisitDeclRefExpr(DeclRefExpr *E) { 4332 if (VarDecl *VD = dyn_cast<VarDecl>(E->getDecl())) { 4333 DSAStackTy::DSAVarData DVar = Stack->getTopDSA(VD, false); 4334 if (DVar.CKind == OMPC_shared && !DVar.RefExpr) 4335 return false; 4336 if (DVar.CKind != OMPC_unknown) 4337 return true; 4338 DSAStackTy::DSAVarData DVarPrivate = 4339 Stack->hasDSA(VD, isOpenMPPrivate, MatchesAlways(), false); 4340 if (DVarPrivate.CKind != OMPC_unknown) 4341 return true; 4342 return false; 4343 } 4344 return false; 4345 } 4346 bool VisitStmt(Stmt *S) { 4347 for (auto Child : S->children()) { 4348 if (Child && Visit(Child)) 4349 return true; 4350 } 4351 return false; 4352 } 4353 explicit DSARefChecker(DSAStackTy *S) : Stack(S) {} 4354 }; 4355 } // namespace 4356 4357 OMPClause *Sema::ActOnOpenMPReductionClause( 4358 ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, 4359 SourceLocation ColonLoc, SourceLocation EndLoc, 4360 CXXScopeSpec &ReductionIdScopeSpec, 4361 const DeclarationNameInfo &ReductionId) { 4362 // TODO: Allow scope specification search when 'declare reduction' is 4363 // supported. 4364 assert(ReductionIdScopeSpec.isEmpty() && 4365 "No support for scoped reduction identifiers yet."); 4366 4367 auto DN = ReductionId.getName(); 4368 auto OOK = DN.getCXXOverloadedOperator(); 4369 BinaryOperatorKind BOK = BO_Comma; 4370 4371 // OpenMP [2.14.3.6, reduction clause] 4372 // C 4373 // reduction-identifier is either an identifier or one of the following 4374 // operators: +, -, *, &, |, ^, && and || 4375 // C++ 4376 // reduction-identifier is either an id-expression or one of the following 4377 // operators: +, -, *, &, |, ^, && and || 4378 // FIXME: Only 'min' and 'max' identifiers are supported for now. 4379 switch (OOK) { 4380 case OO_Plus: 4381 case OO_Minus: 4382 BOK = BO_AddAssign; 4383 break; 4384 case OO_Star: 4385 BOK = BO_MulAssign; 4386 break; 4387 case OO_Amp: 4388 BOK = BO_AndAssign; 4389 break; 4390 case OO_Pipe: 4391 BOK = BO_OrAssign; 4392 break; 4393 case OO_Caret: 4394 BOK = BO_XorAssign; 4395 break; 4396 case OO_AmpAmp: 4397 BOK = BO_LAnd; 4398 break; 4399 case OO_PipePipe: 4400 BOK = BO_LOr; 4401 break; 4402 default: 4403 if (auto II = DN.getAsIdentifierInfo()) { 4404 if (II->isStr("max")) 4405 BOK = BO_GT; 4406 else if (II->isStr("min")) 4407 BOK = BO_LT; 4408 } 4409 break; 4410 } 4411 SourceRange ReductionIdRange; 4412 if (ReductionIdScopeSpec.isValid()) { 4413 ReductionIdRange.setBegin(ReductionIdScopeSpec.getBeginLoc()); 4414 } 4415 ReductionIdRange.setEnd(ReductionId.getEndLoc()); 4416 if (BOK == BO_Comma) { 4417 // Not allowed reduction identifier is found. 4418 Diag(ReductionId.getLocStart(), diag::err_omp_unknown_reduction_identifier) 4419 << ReductionIdRange; 4420 return nullptr; 4421 } 4422 4423 SmallVector<Expr *, 8> Vars; 4424 for (auto RefExpr : VarList) { 4425 assert(RefExpr && "nullptr expr in OpenMP reduction clause."); 4426 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 4427 // It will be analyzed later. 4428 Vars.push_back(RefExpr); 4429 continue; 4430 } 4431 4432 if (RefExpr->isTypeDependent() || RefExpr->isValueDependent() || 4433 RefExpr->isInstantiationDependent() || 4434 RefExpr->containsUnexpandedParameterPack()) { 4435 // It will be analyzed later. 4436 Vars.push_back(RefExpr); 4437 continue; 4438 } 4439 4440 auto ELoc = RefExpr->getExprLoc(); 4441 auto ERange = RefExpr->getSourceRange(); 4442 // OpenMP [2.1, C/C++] 4443 // A list item is a variable or array section, subject to the restrictions 4444 // specified in Section 2.4 on page 42 and in each of the sections 4445 // describing clauses and directives for which a list appears. 4446 // OpenMP [2.14.3.3, Restrictions, p.1] 4447 // A variable that is part of another variable (as an array or 4448 // structure element) cannot appear in a private clause. 4449 auto DE = dyn_cast<DeclRefExpr>(RefExpr); 4450 if (!DE || !isa<VarDecl>(DE->getDecl())) { 4451 Diag(ELoc, diag::err_omp_expected_var_name) << ERange; 4452 continue; 4453 } 4454 auto D = DE->getDecl(); 4455 auto VD = cast<VarDecl>(D); 4456 auto Type = VD->getType(); 4457 // OpenMP [2.9.3.3, Restrictions, C/C++, p.3] 4458 // A variable that appears in a private clause must not have an incomplete 4459 // type or a reference type. 4460 if (RequireCompleteType(ELoc, Type, 4461 diag::err_omp_reduction_incomplete_type)) 4462 continue; 4463 // OpenMP [2.14.3.6, reduction clause, Restrictions] 4464 // Arrays may not appear in a reduction clause. 4465 if (Type.getNonReferenceType()->isArrayType()) { 4466 Diag(ELoc, diag::err_omp_reduction_type_array) << Type << ERange; 4467 bool IsDecl = 4468 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4469 Diag(VD->getLocation(), 4470 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4471 << VD; 4472 continue; 4473 } 4474 // OpenMP [2.14.3.6, reduction clause, Restrictions] 4475 // A list item that appears in a reduction clause must not be 4476 // const-qualified. 4477 if (Type.getNonReferenceType().isConstant(Context)) { 4478 Diag(ELoc, diag::err_omp_const_variable) 4479 << getOpenMPClauseName(OMPC_reduction) << Type << ERange; 4480 bool IsDecl = 4481 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4482 Diag(VD->getLocation(), 4483 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4484 << VD; 4485 continue; 4486 } 4487 // OpenMP [2.9.3.6, Restrictions, C/C++, p.4] 4488 // If a list-item is a reference type then it must bind to the same object 4489 // for all threads of the team. 4490 VarDecl *VDDef = VD->getDefinition(); 4491 if (Type->isReferenceType() && VDDef) { 4492 DSARefChecker Check(DSAStack); 4493 if (Check.Visit(VDDef->getInit())) { 4494 Diag(ELoc, diag::err_omp_reduction_ref_type_arg) << ERange; 4495 Diag(VDDef->getLocation(), diag::note_defined_here) << VDDef; 4496 continue; 4497 } 4498 } 4499 // OpenMP [2.14.3.6, reduction clause, Restrictions] 4500 // The type of a list item that appears in a reduction clause must be valid 4501 // for the reduction-identifier. For a max or min reduction in C, the type 4502 // of the list item must be an allowed arithmetic data type: char, int, 4503 // float, double, or _Bool, possibly modified with long, short, signed, or 4504 // unsigned. For a max or min reduction in C++, the type of the list item 4505 // must be an allowed arithmetic data type: char, wchar_t, int, float, 4506 // double, or bool, possibly modified with long, short, signed, or unsigned. 4507 if ((BOK == BO_GT || BOK == BO_LT) && 4508 !(Type->isScalarType() || 4509 (getLangOpts().CPlusPlus && Type->isArithmeticType()))) { 4510 Diag(ELoc, diag::err_omp_clause_not_arithmetic_type_arg) 4511 << getLangOpts().CPlusPlus; 4512 bool IsDecl = 4513 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4514 Diag(VD->getLocation(), 4515 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4516 << VD; 4517 continue; 4518 } 4519 if ((BOK == BO_OrAssign || BOK == BO_AndAssign || BOK == BO_XorAssign) && 4520 !getLangOpts().CPlusPlus && Type->isFloatingType()) { 4521 Diag(ELoc, diag::err_omp_clause_floating_type_arg); 4522 bool IsDecl = 4523 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4524 Diag(VD->getLocation(), 4525 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4526 << VD; 4527 continue; 4528 } 4529 bool Suppress = getDiagnostics().getSuppressAllDiagnostics(); 4530 getDiagnostics().setSuppressAllDiagnostics(true); 4531 ExprResult ReductionOp = 4532 BuildBinOp(DSAStack->getCurScope(), ReductionId.getLocStart(), BOK, 4533 RefExpr, RefExpr); 4534 getDiagnostics().setSuppressAllDiagnostics(Suppress); 4535 if (ReductionOp.isInvalid()) { 4536 Diag(ELoc, diag::err_omp_reduction_id_not_compatible) << Type 4537 << ReductionIdRange; 4538 bool IsDecl = 4539 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4540 Diag(VD->getLocation(), 4541 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4542 << VD; 4543 continue; 4544 } 4545 4546 // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced 4547 // in a Construct] 4548 // Variables with the predetermined data-sharing attributes may not be 4549 // listed in data-sharing attributes clauses, except for the cases 4550 // listed below. For these exceptions only, listing a predetermined 4551 // variable in a data-sharing attribute clause is allowed and overrides 4552 // the variable's predetermined data-sharing attributes. 4553 // OpenMP [2.14.3.6, Restrictions, p.3] 4554 // Any number of reduction clauses can be specified on the directive, 4555 // but a list item can appear only once in the reduction clauses for that 4556 // directive. 4557 DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false); 4558 if (DVar.CKind == OMPC_reduction) { 4559 Diag(ELoc, diag::err_omp_once_referenced) 4560 << getOpenMPClauseName(OMPC_reduction); 4561 if (DVar.RefExpr) { 4562 Diag(DVar.RefExpr->getExprLoc(), diag::note_omp_referenced); 4563 } 4564 } else if (DVar.CKind != OMPC_unknown) { 4565 Diag(ELoc, diag::err_omp_wrong_dsa) 4566 << getOpenMPClauseName(DVar.CKind) 4567 << getOpenMPClauseName(OMPC_reduction); 4568 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4569 continue; 4570 } 4571 4572 // OpenMP [2.14.3.6, Restrictions, p.1] 4573 // A list item that appears in a reduction clause of a worksharing 4574 // construct must be shared in the parallel regions to which any of the 4575 // worksharing regions arising from the worksharing construct bind. 4576 OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective(); 4577 if (isOpenMPWorksharingDirective(CurrDir) && 4578 !isOpenMPParallelDirective(CurrDir)) { 4579 DVar = DSAStack->getImplicitDSA(VD, true); 4580 if (DVar.CKind != OMPC_shared) { 4581 Diag(ELoc, diag::err_omp_required_access) 4582 << getOpenMPClauseName(OMPC_reduction) 4583 << getOpenMPClauseName(OMPC_shared); 4584 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4585 continue; 4586 } 4587 } 4588 4589 CXXRecordDecl *RD = getLangOpts().CPlusPlus 4590 ? Type.getNonReferenceType()->getAsCXXRecordDecl() 4591 : nullptr; 4592 // FIXME This code must be replaced by actual constructing/destructing of 4593 // the reduction variable. 4594 if (RD) { 4595 CXXConstructorDecl *CD = LookupDefaultConstructor(RD); 4596 PartialDiagnostic PD = 4597 PartialDiagnostic(PartialDiagnostic::NullDiagnostic()); 4598 if (!CD || 4599 CheckConstructorAccess(ELoc, CD, 4600 InitializedEntity::InitializeTemporary(Type), 4601 CD->getAccess(), PD) == AR_inaccessible || 4602 CD->isDeleted()) { 4603 Diag(ELoc, diag::err_omp_required_method) 4604 << getOpenMPClauseName(OMPC_reduction) << 0; 4605 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 4606 VarDecl::DeclarationOnly; 4607 Diag(VD->getLocation(), 4608 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4609 << VD; 4610 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 4611 continue; 4612 } 4613 MarkFunctionReferenced(ELoc, CD); 4614 DiagnoseUseOfDecl(CD, ELoc); 4615 4616 CXXDestructorDecl *DD = RD->getDestructor(); 4617 if (DD) { 4618 if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible || 4619 DD->isDeleted()) { 4620 Diag(ELoc, diag::err_omp_required_method) 4621 << getOpenMPClauseName(OMPC_reduction) << 4; 4622 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 4623 VarDecl::DeclarationOnly; 4624 Diag(VD->getLocation(), 4625 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4626 << VD; 4627 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 4628 continue; 4629 } 4630 MarkFunctionReferenced(ELoc, DD); 4631 DiagnoseUseOfDecl(DD, ELoc); 4632 } 4633 } 4634 4635 DSAStack->addDSA(VD, DE, OMPC_reduction); 4636 Vars.push_back(DE); 4637 } 4638 4639 if (Vars.empty()) 4640 return nullptr; 4641 4642 return OMPReductionClause::Create( 4643 Context, StartLoc, LParenLoc, ColonLoc, EndLoc, Vars, 4644 ReductionIdScopeSpec.getWithLocInContext(Context), ReductionId); 4645 } 4646 4647 OMPClause *Sema::ActOnOpenMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 4648 SourceLocation StartLoc, 4649 SourceLocation LParenLoc, 4650 SourceLocation ColonLoc, 4651 SourceLocation EndLoc) { 4652 SmallVector<Expr *, 8> Vars; 4653 for (auto &RefExpr : VarList) { 4654 assert(RefExpr && "NULL expr in OpenMP linear clause."); 4655 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 4656 // It will be analyzed later. 4657 Vars.push_back(RefExpr); 4658 continue; 4659 } 4660 4661 // OpenMP [2.14.3.7, linear clause] 4662 // A list item that appears in a linear clause is subject to the private 4663 // clause semantics described in Section 2.14.3.3 on page 159 except as 4664 // noted. In addition, the value of the new list item on each iteration 4665 // of the associated loop(s) corresponds to the value of the original 4666 // list item before entering the construct plus the logical number of 4667 // the iteration times linear-step. 4668 4669 SourceLocation ELoc = RefExpr->getExprLoc(); 4670 // OpenMP [2.1, C/C++] 4671 // A list item is a variable name. 4672 // OpenMP [2.14.3.3, Restrictions, p.1] 4673 // A variable that is part of another variable (as an array or 4674 // structure element) cannot appear in a private clause. 4675 DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr); 4676 if (!DE || !isa<VarDecl>(DE->getDecl())) { 4677 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 4678 continue; 4679 } 4680 4681 VarDecl *VD = cast<VarDecl>(DE->getDecl()); 4682 4683 // OpenMP [2.14.3.7, linear clause] 4684 // A list-item cannot appear in more than one linear clause. 4685 // A list-item that appears in a linear clause cannot appear in any 4686 // other data-sharing attribute clause. 4687 DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false); 4688 if (DVar.RefExpr) { 4689 Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind) 4690 << getOpenMPClauseName(OMPC_linear); 4691 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4692 continue; 4693 } 4694 4695 QualType QType = VD->getType(); 4696 if (QType->isDependentType() || QType->isInstantiationDependentType()) { 4697 // It will be analyzed later. 4698 Vars.push_back(DE); 4699 continue; 4700 } 4701 4702 // A variable must not have an incomplete type or a reference type. 4703 if (RequireCompleteType(ELoc, QType, 4704 diag::err_omp_linear_incomplete_type)) { 4705 continue; 4706 } 4707 if (QType->isReferenceType()) { 4708 Diag(ELoc, diag::err_omp_clause_ref_type_arg) 4709 << getOpenMPClauseName(OMPC_linear) << QType; 4710 bool IsDecl = 4711 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4712 Diag(VD->getLocation(), 4713 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4714 << VD; 4715 continue; 4716 } 4717 4718 // A list item must not be const-qualified. 4719 if (QType.isConstant(Context)) { 4720 Diag(ELoc, diag::err_omp_const_variable) 4721 << getOpenMPClauseName(OMPC_linear); 4722 bool IsDecl = 4723 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4724 Diag(VD->getLocation(), 4725 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4726 << VD; 4727 continue; 4728 } 4729 4730 // A list item must be of integral or pointer type. 4731 QType = QType.getUnqualifiedType().getCanonicalType(); 4732 const Type *Ty = QType.getTypePtrOrNull(); 4733 if (!Ty || (!Ty->isDependentType() && !Ty->isIntegralType(Context) && 4734 !Ty->isPointerType())) { 4735 Diag(ELoc, diag::err_omp_linear_expected_int_or_ptr) << QType; 4736 bool IsDecl = 4737 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4738 Diag(VD->getLocation(), 4739 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4740 << VD; 4741 continue; 4742 } 4743 4744 DSAStack->addDSA(VD, DE, OMPC_linear); 4745 Vars.push_back(DE); 4746 } 4747 4748 if (Vars.empty()) 4749 return nullptr; 4750 4751 Expr *StepExpr = Step; 4752 if (Step && !Step->isValueDependent() && !Step->isTypeDependent() && 4753 !Step->isInstantiationDependent() && 4754 !Step->containsUnexpandedParameterPack()) { 4755 SourceLocation StepLoc = Step->getLocStart(); 4756 ExprResult Val = PerformOpenMPImplicitIntegerConversion(StepLoc, Step); 4757 if (Val.isInvalid()) 4758 return nullptr; 4759 StepExpr = Val.get(); 4760 4761 // Warn about zero linear step (it would be probably better specified as 4762 // making corresponding variables 'const'). 4763 llvm::APSInt Result; 4764 if (StepExpr->isIntegerConstantExpr(Result, Context) && 4765 !Result.isNegative() && !Result.isStrictlyPositive()) 4766 Diag(StepLoc, diag::warn_omp_linear_step_zero) << Vars[0] 4767 << (Vars.size() > 1); 4768 } 4769 4770 return OMPLinearClause::Create(Context, StartLoc, LParenLoc, ColonLoc, EndLoc, 4771 Vars, StepExpr); 4772 } 4773 4774 OMPClause *Sema::ActOnOpenMPAlignedClause( 4775 ArrayRef<Expr *> VarList, Expr *Alignment, SourceLocation StartLoc, 4776 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc) { 4777 4778 SmallVector<Expr *, 8> Vars; 4779 for (auto &RefExpr : VarList) { 4780 assert(RefExpr && "NULL expr in OpenMP aligned clause."); 4781 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 4782 // It will be analyzed later. 4783 Vars.push_back(RefExpr); 4784 continue; 4785 } 4786 4787 SourceLocation ELoc = RefExpr->getExprLoc(); 4788 // OpenMP [2.1, C/C++] 4789 // A list item is a variable name. 4790 DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr); 4791 if (!DE || !isa<VarDecl>(DE->getDecl())) { 4792 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 4793 continue; 4794 } 4795 4796 VarDecl *VD = cast<VarDecl>(DE->getDecl()); 4797 4798 // OpenMP [2.8.1, simd construct, Restrictions] 4799 // The type of list items appearing in the aligned clause must be 4800 // array, pointer, reference to array, or reference to pointer. 4801 QualType QType = DE->getType() 4802 .getNonReferenceType() 4803 .getUnqualifiedType() 4804 .getCanonicalType(); 4805 const Type *Ty = QType.getTypePtrOrNull(); 4806 if (!Ty || (!Ty->isDependentType() && !Ty->isArrayType() && 4807 !Ty->isPointerType())) { 4808 Diag(ELoc, diag::err_omp_aligned_expected_array_or_ptr) 4809 << QType << getLangOpts().CPlusPlus << RefExpr->getSourceRange(); 4810 bool IsDecl = 4811 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4812 Diag(VD->getLocation(), 4813 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4814 << VD; 4815 continue; 4816 } 4817 4818 // OpenMP [2.8.1, simd construct, Restrictions] 4819 // A list-item cannot appear in more than one aligned clause. 4820 if (DeclRefExpr *PrevRef = DSAStack->addUniqueAligned(VD, DE)) { 4821 Diag(ELoc, diag::err_omp_aligned_twice) << RefExpr->getSourceRange(); 4822 Diag(PrevRef->getExprLoc(), diag::note_omp_explicit_dsa) 4823 << getOpenMPClauseName(OMPC_aligned); 4824 continue; 4825 } 4826 4827 Vars.push_back(DE); 4828 } 4829 4830 // OpenMP [2.8.1, simd construct, Description] 4831 // The parameter of the aligned clause, alignment, must be a constant 4832 // positive integer expression. 4833 // If no optional parameter is specified, implementation-defined default 4834 // alignments for SIMD instructions on the target platforms are assumed. 4835 if (Alignment != nullptr) { 4836 ExprResult AlignResult = 4837 VerifyPositiveIntegerConstantInClause(Alignment, OMPC_aligned); 4838 if (AlignResult.isInvalid()) 4839 return nullptr; 4840 Alignment = AlignResult.get(); 4841 } 4842 if (Vars.empty()) 4843 return nullptr; 4844 4845 return OMPAlignedClause::Create(Context, StartLoc, LParenLoc, ColonLoc, 4846 EndLoc, Vars, Alignment); 4847 } 4848 4849 OMPClause *Sema::ActOnOpenMPCopyinClause(ArrayRef<Expr *> VarList, 4850 SourceLocation StartLoc, 4851 SourceLocation LParenLoc, 4852 SourceLocation EndLoc) { 4853 SmallVector<Expr *, 8> Vars; 4854 for (auto &RefExpr : VarList) { 4855 assert(RefExpr && "NULL expr in OpenMP copyin clause."); 4856 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 4857 // It will be analyzed later. 4858 Vars.push_back(RefExpr); 4859 continue; 4860 } 4861 4862 SourceLocation ELoc = RefExpr->getExprLoc(); 4863 // OpenMP [2.1, C/C++] 4864 // A list item is a variable name. 4865 // OpenMP [2.14.4.1, Restrictions, p.1] 4866 // A list item that appears in a copyin clause must be threadprivate. 4867 DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr); 4868 if (!DE || !isa<VarDecl>(DE->getDecl())) { 4869 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 4870 continue; 4871 } 4872 4873 Decl *D = DE->getDecl(); 4874 VarDecl *VD = cast<VarDecl>(D); 4875 4876 QualType Type = VD->getType(); 4877 if (Type->isDependentType() || Type->isInstantiationDependentType()) { 4878 // It will be analyzed later. 4879 Vars.push_back(DE); 4880 continue; 4881 } 4882 4883 // OpenMP [2.14.4.1, Restrictions, C/C++, p.1] 4884 // A list item that appears in a copyin clause must be threadprivate. 4885 if (!DSAStack->isThreadPrivate(VD)) { 4886 Diag(ELoc, diag::err_omp_required_access) 4887 << getOpenMPClauseName(OMPC_copyin) 4888 << getOpenMPDirectiveName(OMPD_threadprivate); 4889 continue; 4890 } 4891 4892 // OpenMP [2.14.4.1, Restrictions, C/C++, p.2] 4893 // A variable of class type (or array thereof) that appears in a 4894 // copyin clause requires an accessible, unambiguous copy assignment 4895 // operator for the class type. 4896 Type = Context.getBaseElementType(Type); 4897 CXXRecordDecl *RD = 4898 getLangOpts().CPlusPlus ? Type->getAsCXXRecordDecl() : nullptr; 4899 // FIXME This code must be replaced by actual assignment of the 4900 // threadprivate variable. 4901 if (RD) { 4902 CXXMethodDecl *MD = LookupCopyingAssignment(RD, 0, false, 0); 4903 DeclAccessPair FoundDecl = DeclAccessPair::make(MD, MD->getAccess()); 4904 if (MD) { 4905 if (CheckMemberAccess(ELoc, RD, FoundDecl) == AR_inaccessible || 4906 MD->isDeleted()) { 4907 Diag(ELoc, diag::err_omp_required_method) 4908 << getOpenMPClauseName(OMPC_copyin) << 2; 4909 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 4910 VarDecl::DeclarationOnly; 4911 Diag(VD->getLocation(), 4912 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4913 << VD; 4914 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 4915 continue; 4916 } 4917 MarkFunctionReferenced(ELoc, MD); 4918 DiagnoseUseOfDecl(MD, ELoc); 4919 } 4920 } 4921 4922 DSAStack->addDSA(VD, DE, OMPC_copyin); 4923 Vars.push_back(DE); 4924 } 4925 4926 if (Vars.empty()) 4927 return nullptr; 4928 4929 return OMPCopyinClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars); 4930 } 4931 4932 OMPClause *Sema::ActOnOpenMPCopyprivateClause(ArrayRef<Expr *> VarList, 4933 SourceLocation StartLoc, 4934 SourceLocation LParenLoc, 4935 SourceLocation EndLoc) { 4936 SmallVector<Expr *, 8> Vars; 4937 for (auto &RefExpr : VarList) { 4938 assert(RefExpr && "NULL expr in OpenMP copyprivate clause."); 4939 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 4940 // It will be analyzed later. 4941 Vars.push_back(RefExpr); 4942 continue; 4943 } 4944 4945 SourceLocation ELoc = RefExpr->getExprLoc(); 4946 // OpenMP [2.1, C/C++] 4947 // A list item is a variable name. 4948 // OpenMP [2.14.4.1, Restrictions, p.1] 4949 // A list item that appears in a copyin clause must be threadprivate. 4950 DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr); 4951 if (!DE || !isa<VarDecl>(DE->getDecl())) { 4952 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 4953 continue; 4954 } 4955 4956 Decl *D = DE->getDecl(); 4957 VarDecl *VD = cast<VarDecl>(D); 4958 4959 QualType Type = VD->getType(); 4960 if (Type->isDependentType() || Type->isInstantiationDependentType()) { 4961 // It will be analyzed later. 4962 Vars.push_back(DE); 4963 continue; 4964 } 4965 4966 // OpenMP [2.14.4.2, Restrictions, p.2] 4967 // A list item that appears in a copyprivate clause may not appear in a 4968 // private or firstprivate clause on the single construct. 4969 if (!DSAStack->isThreadPrivate(VD)) { 4970 auto DVar = DSAStack->getTopDSA(VD, false); 4971 if (DVar.CKind != OMPC_copyprivate && DVar.CKind != OMPC_unknown && 4972 !(DVar.CKind == OMPC_private && !DVar.RefExpr)) { 4973 Diag(ELoc, diag::err_omp_wrong_dsa) 4974 << getOpenMPClauseName(DVar.CKind) 4975 << getOpenMPClauseName(OMPC_copyprivate); 4976 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4977 continue; 4978 } 4979 4980 // OpenMP [2.11.4.2, Restrictions, p.1] 4981 // All list items that appear in a copyprivate clause must be either 4982 // threadprivate or private in the enclosing context. 4983 if (DVar.CKind == OMPC_unknown) { 4984 DVar = DSAStack->getImplicitDSA(VD, false); 4985 if (DVar.CKind == OMPC_shared) { 4986 Diag(ELoc, diag::err_omp_required_access) 4987 << getOpenMPClauseName(OMPC_copyprivate) 4988 << "threadprivate or private in the enclosing context"; 4989 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4990 continue; 4991 } 4992 } 4993 } 4994 4995 // OpenMP [2.14.4.1, Restrictions, C/C++, p.2] 4996 // A variable of class type (or array thereof) that appears in a 4997 // copyin clause requires an accessible, unambiguous copy assignment 4998 // operator for the class type. 4999 Type = Context.getBaseElementType(Type); 5000 CXXRecordDecl *RD = 5001 getLangOpts().CPlusPlus ? Type->getAsCXXRecordDecl() : nullptr; 5002 // FIXME This code must be replaced by actual assignment of the 5003 // threadprivate variable. 5004 if (RD) { 5005 CXXMethodDecl *MD = LookupCopyingAssignment(RD, 0, false, 0); 5006 DeclAccessPair FoundDecl = DeclAccessPair::make(MD, MD->getAccess()); 5007 if (MD) { 5008 if (CheckMemberAccess(ELoc, RD, FoundDecl) == AR_inaccessible || 5009 MD->isDeleted()) { 5010 Diag(ELoc, diag::err_omp_required_method) 5011 << getOpenMPClauseName(OMPC_copyprivate) << 2; 5012 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 5013 VarDecl::DeclarationOnly; 5014 Diag(VD->getLocation(), 5015 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 5016 << VD; 5017 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 5018 continue; 5019 } 5020 MarkFunctionReferenced(ELoc, MD); 5021 DiagnoseUseOfDecl(MD, ELoc); 5022 } 5023 } 5024 5025 // No need to mark vars as copyprivate, they are already threadprivate or 5026 // implicitly private. 5027 Vars.push_back(DE); 5028 } 5029 5030 if (Vars.empty()) 5031 return nullptr; 5032 5033 return OMPCopyprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars); 5034 } 5035 5036 OMPClause *Sema::ActOnOpenMPFlushClause(ArrayRef<Expr *> VarList, 5037 SourceLocation StartLoc, 5038 SourceLocation LParenLoc, 5039 SourceLocation EndLoc) { 5040 if (VarList.empty()) 5041 return nullptr; 5042 5043 return OMPFlushClause::Create(Context, StartLoc, LParenLoc, EndLoc, VarList); 5044 } 5045 5046