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 condition later. 1799 SourceRange ConditionSrcRange; 1800 /// \brief Loop variable. 1801 VarDecl *Var; 1802 /// \brief Reference to loop variable. 1803 DeclRefExpr *VarRef; 1804 /// \brief Lower bound (initializer for the var). 1805 Expr *LB; 1806 /// \brief Upper bound. 1807 Expr *UB; 1808 /// \brief Loop step (increment). 1809 Expr *Step; 1810 /// \brief This flag is true when condition is one of: 1811 /// Var < UB 1812 /// Var <= UB 1813 /// UB > Var 1814 /// UB >= Var 1815 bool TestIsLessOp; 1816 /// \brief This flag is true when condition is strict ( < or > ). 1817 bool TestIsStrictOp; 1818 /// \brief This flag is true when step is subtracted on each iteration. 1819 bool SubtractStep; 1820 1821 public: 1822 OpenMPIterationSpaceChecker(Sema &SemaRef, SourceLocation DefaultLoc) 1823 : SemaRef(SemaRef), DefaultLoc(DefaultLoc), ConditionLoc(DefaultLoc), 1824 ConditionSrcRange(SourceRange()), Var(nullptr), VarRef(nullptr), 1825 LB(nullptr), UB(nullptr), Step(nullptr), TestIsLessOp(false), 1826 TestIsStrictOp(false), SubtractStep(false) {} 1827 /// \brief Check init-expr for canonical loop form and save loop counter 1828 /// variable - #Var and its initialization value - #LB. 1829 bool CheckInit(Stmt *S); 1830 /// \brief Check test-expr for canonical form, save upper-bound (#UB), flags 1831 /// for less/greater and for strict/non-strict comparison. 1832 bool CheckCond(Expr *S); 1833 /// \brief Check incr-expr for canonical loop form and return true if it 1834 /// does not conform, otherwise save loop step (#Step). 1835 bool CheckInc(Expr *S); 1836 /// \brief Return the loop counter variable. 1837 VarDecl *GetLoopVar() const { return Var; } 1838 /// \brief Return the reference expression to loop counter variable. 1839 DeclRefExpr *GetLoopVarRefExpr() const { return VarRef; } 1840 /// \brief Return true if any expression is dependent. 1841 bool Dependent() const; 1842 1843 private: 1844 /// \brief Check the right-hand side of an assignment in the increment 1845 /// expression. 1846 bool CheckIncRHS(Expr *RHS); 1847 /// \brief Helper to set loop counter variable and its initializer. 1848 bool SetVarAndLB(VarDecl *NewVar, DeclRefExpr *NewVarRefExpr, Expr *NewLB); 1849 /// \brief Helper to set upper bound. 1850 bool SetUB(Expr *NewUB, bool LessOp, bool StrictOp, const SourceRange &SR, 1851 const SourceLocation &SL); 1852 /// \brief Helper to set loop increment. 1853 bool SetStep(Expr *NewStep, bool Subtract); 1854 }; 1855 1856 bool OpenMPIterationSpaceChecker::Dependent() const { 1857 if (!Var) { 1858 assert(!LB && !UB && !Step); 1859 return false; 1860 } 1861 return Var->getType()->isDependentType() || (LB && LB->isValueDependent()) || 1862 (UB && UB->isValueDependent()) || (Step && Step->isValueDependent()); 1863 } 1864 1865 bool OpenMPIterationSpaceChecker::SetVarAndLB(VarDecl *NewVar, 1866 DeclRefExpr *NewVarRefExpr, 1867 Expr *NewLB) { 1868 // State consistency checking to ensure correct usage. 1869 assert(Var == nullptr && LB == nullptr && VarRef == nullptr && 1870 UB == nullptr && Step == nullptr && !TestIsLessOp && !TestIsStrictOp); 1871 if (!NewVar || !NewLB) 1872 return true; 1873 Var = NewVar; 1874 VarRef = NewVarRefExpr; 1875 LB = NewLB; 1876 return false; 1877 } 1878 1879 bool OpenMPIterationSpaceChecker::SetUB(Expr *NewUB, bool LessOp, bool StrictOp, 1880 const SourceRange &SR, 1881 const SourceLocation &SL) { 1882 // State consistency checking to ensure correct usage. 1883 assert(Var != nullptr && LB != nullptr && UB == nullptr && Step == nullptr && 1884 !TestIsLessOp && !TestIsStrictOp); 1885 if (!NewUB) 1886 return true; 1887 UB = NewUB; 1888 TestIsLessOp = LessOp; 1889 TestIsStrictOp = StrictOp; 1890 ConditionSrcRange = SR; 1891 ConditionLoc = SL; 1892 return false; 1893 } 1894 1895 bool OpenMPIterationSpaceChecker::SetStep(Expr *NewStep, bool Subtract) { 1896 // State consistency checking to ensure correct usage. 1897 assert(Var != nullptr && LB != nullptr && Step == nullptr); 1898 if (!NewStep) 1899 return true; 1900 if (!NewStep->isValueDependent()) { 1901 // Check that the step is integer expression. 1902 SourceLocation StepLoc = NewStep->getLocStart(); 1903 ExprResult Val = 1904 SemaRef.PerformOpenMPImplicitIntegerConversion(StepLoc, NewStep); 1905 if (Val.isInvalid()) 1906 return true; 1907 NewStep = Val.get(); 1908 1909 // OpenMP [2.6, Canonical Loop Form, Restrictions] 1910 // If test-expr is of form var relational-op b and relational-op is < or 1911 // <= then incr-expr must cause var to increase on each iteration of the 1912 // loop. If test-expr is of form var relational-op b and relational-op is 1913 // > or >= then incr-expr must cause var to decrease on each iteration of 1914 // the loop. 1915 // If test-expr is of form b relational-op var and relational-op is < or 1916 // <= then incr-expr must cause var to decrease on each iteration of the 1917 // loop. If test-expr is of form b relational-op var and relational-op is 1918 // > or >= then incr-expr must cause var to increase on each iteration of 1919 // the loop. 1920 llvm::APSInt Result; 1921 bool IsConstant = NewStep->isIntegerConstantExpr(Result, SemaRef.Context); 1922 bool IsUnsigned = !NewStep->getType()->hasSignedIntegerRepresentation(); 1923 bool IsConstNeg = 1924 IsConstant && Result.isSigned() && (Subtract != Result.isNegative()); 1925 bool IsConstZero = IsConstant && !Result.getBoolValue(); 1926 if (UB && (IsConstZero || 1927 (TestIsLessOp ? (IsConstNeg || (IsUnsigned && Subtract)) 1928 : (!IsConstNeg || (IsUnsigned && !Subtract))))) { 1929 SemaRef.Diag(NewStep->getExprLoc(), 1930 diag::err_omp_loop_incr_not_compatible) 1931 << Var << TestIsLessOp << NewStep->getSourceRange(); 1932 SemaRef.Diag(ConditionLoc, 1933 diag::note_omp_loop_cond_requres_compatible_incr) 1934 << TestIsLessOp << ConditionSrcRange; 1935 return true; 1936 } 1937 } 1938 1939 Step = NewStep; 1940 SubtractStep = Subtract; 1941 return false; 1942 } 1943 1944 bool OpenMPIterationSpaceChecker::CheckInit(Stmt *S) { 1945 // Check init-expr for canonical loop form and save loop counter 1946 // variable - #Var and its initialization value - #LB. 1947 // OpenMP [2.6] Canonical loop form. init-expr may be one of the following: 1948 // var = lb 1949 // integer-type var = lb 1950 // random-access-iterator-type var = lb 1951 // pointer-type var = lb 1952 // 1953 if (!S) { 1954 SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_init); 1955 return true; 1956 } 1957 if (Expr *E = dyn_cast<Expr>(S)) 1958 S = E->IgnoreParens(); 1959 if (auto BO = dyn_cast<BinaryOperator>(S)) { 1960 if (BO->getOpcode() == BO_Assign) 1961 if (auto DRE = dyn_cast<DeclRefExpr>(BO->getLHS()->IgnoreParens())) 1962 return SetVarAndLB(dyn_cast<VarDecl>(DRE->getDecl()), DRE, 1963 BO->getLHS()); 1964 } else if (auto DS = dyn_cast<DeclStmt>(S)) { 1965 if (DS->isSingleDecl()) { 1966 if (auto Var = dyn_cast_or_null<VarDecl>(DS->getSingleDecl())) { 1967 if (Var->hasInit()) { 1968 // Accept non-canonical init form here but emit ext. warning. 1969 if (Var->getInitStyle() != VarDecl::CInit) 1970 SemaRef.Diag(S->getLocStart(), 1971 diag::ext_omp_loop_not_canonical_init) 1972 << S->getSourceRange(); 1973 return SetVarAndLB(Var, nullptr, Var->getInit()); 1974 } 1975 } 1976 } 1977 } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S)) 1978 if (CE->getOperator() == OO_Equal) 1979 if (auto DRE = dyn_cast<DeclRefExpr>(CE->getArg(0))) 1980 return SetVarAndLB(dyn_cast<VarDecl>(DRE->getDecl()), DRE, 1981 CE->getArg(1)); 1982 1983 SemaRef.Diag(S->getLocStart(), diag::err_omp_loop_not_canonical_init) 1984 << S->getSourceRange(); 1985 return true; 1986 } 1987 1988 /// \brief Ignore parenthesizes, implicit casts, copy constructor and return the 1989 /// variable (which may be the loop variable) if possible. 1990 static const VarDecl *GetInitVarDecl(const Expr *E) { 1991 if (!E) 1992 return nullptr; 1993 E = E->IgnoreParenImpCasts(); 1994 if (auto *CE = dyn_cast_or_null<CXXConstructExpr>(E)) 1995 if (const CXXConstructorDecl *Ctor = CE->getConstructor()) 1996 if (Ctor->isCopyConstructor() && CE->getNumArgs() == 1 && 1997 CE->getArg(0) != nullptr) 1998 E = CE->getArg(0)->IgnoreParenImpCasts(); 1999 auto DRE = dyn_cast_or_null<DeclRefExpr>(E); 2000 if (!DRE) 2001 return nullptr; 2002 return dyn_cast<VarDecl>(DRE->getDecl()); 2003 } 2004 2005 bool OpenMPIterationSpaceChecker::CheckCond(Expr *S) { 2006 // Check test-expr for canonical form, save upper-bound UB, flags for 2007 // less/greater and for strict/non-strict comparison. 2008 // OpenMP [2.6] Canonical loop form. Test-expr may be one of the following: 2009 // var relational-op b 2010 // b relational-op var 2011 // 2012 if (!S) { 2013 SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_cond) << Var; 2014 return true; 2015 } 2016 S = S->IgnoreParenImpCasts(); 2017 SourceLocation CondLoc = S->getLocStart(); 2018 if (auto BO = dyn_cast<BinaryOperator>(S)) { 2019 if (BO->isRelationalOp()) { 2020 if (GetInitVarDecl(BO->getLHS()) == Var) 2021 return SetUB(BO->getRHS(), 2022 (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_LE), 2023 (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_GT), 2024 BO->getSourceRange(), BO->getOperatorLoc()); 2025 if (GetInitVarDecl(BO->getRHS()) == Var) 2026 return SetUB(BO->getLHS(), 2027 (BO->getOpcode() == BO_GT || BO->getOpcode() == BO_GE), 2028 (BO->getOpcode() == BO_LT || BO->getOpcode() == BO_GT), 2029 BO->getSourceRange(), BO->getOperatorLoc()); 2030 } 2031 } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S)) { 2032 if (CE->getNumArgs() == 2) { 2033 auto Op = CE->getOperator(); 2034 switch (Op) { 2035 case OO_Greater: 2036 case OO_GreaterEqual: 2037 case OO_Less: 2038 case OO_LessEqual: 2039 if (GetInitVarDecl(CE->getArg(0)) == Var) 2040 return SetUB(CE->getArg(1), Op == OO_Less || Op == OO_LessEqual, 2041 Op == OO_Less || Op == OO_Greater, CE->getSourceRange(), 2042 CE->getOperatorLoc()); 2043 if (GetInitVarDecl(CE->getArg(1)) == Var) 2044 return SetUB(CE->getArg(0), Op == OO_Greater || Op == OO_GreaterEqual, 2045 Op == OO_Less || Op == OO_Greater, CE->getSourceRange(), 2046 CE->getOperatorLoc()); 2047 break; 2048 default: 2049 break; 2050 } 2051 } 2052 } 2053 SemaRef.Diag(CondLoc, diag::err_omp_loop_not_canonical_cond) 2054 << S->getSourceRange() << Var; 2055 return true; 2056 } 2057 2058 bool OpenMPIterationSpaceChecker::CheckIncRHS(Expr *RHS) { 2059 // RHS of canonical loop form increment can be: 2060 // var + incr 2061 // incr + var 2062 // var - incr 2063 // 2064 RHS = RHS->IgnoreParenImpCasts(); 2065 if (auto BO = dyn_cast<BinaryOperator>(RHS)) { 2066 if (BO->isAdditiveOp()) { 2067 bool IsAdd = BO->getOpcode() == BO_Add; 2068 if (GetInitVarDecl(BO->getLHS()) == Var) 2069 return SetStep(BO->getRHS(), !IsAdd); 2070 if (IsAdd && GetInitVarDecl(BO->getRHS()) == Var) 2071 return SetStep(BO->getLHS(), false); 2072 } 2073 } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(RHS)) { 2074 bool IsAdd = CE->getOperator() == OO_Plus; 2075 if ((IsAdd || CE->getOperator() == OO_Minus) && CE->getNumArgs() == 2) { 2076 if (GetInitVarDecl(CE->getArg(0)) == Var) 2077 return SetStep(CE->getArg(1), !IsAdd); 2078 if (IsAdd && GetInitVarDecl(CE->getArg(1)) == Var) 2079 return SetStep(CE->getArg(0), false); 2080 } 2081 } 2082 SemaRef.Diag(RHS->getLocStart(), diag::err_omp_loop_not_canonical_incr) 2083 << RHS->getSourceRange() << Var; 2084 return true; 2085 } 2086 2087 bool OpenMPIterationSpaceChecker::CheckInc(Expr *S) { 2088 // Check incr-expr for canonical loop form and return true if it 2089 // does not conform. 2090 // OpenMP [2.6] Canonical loop form. Test-expr may be one of the following: 2091 // ++var 2092 // var++ 2093 // --var 2094 // var-- 2095 // var += incr 2096 // var -= incr 2097 // var = var + incr 2098 // var = incr + var 2099 // var = var - incr 2100 // 2101 if (!S) { 2102 SemaRef.Diag(DefaultLoc, diag::err_omp_loop_not_canonical_incr) << Var; 2103 return true; 2104 } 2105 S = S->IgnoreParens(); 2106 if (auto UO = dyn_cast<UnaryOperator>(S)) { 2107 if (UO->isIncrementDecrementOp() && GetInitVarDecl(UO->getSubExpr()) == Var) 2108 return SetStep( 2109 SemaRef.ActOnIntegerConstant(UO->getLocStart(), 2110 (UO->isDecrementOp() ? -1 : 1)).get(), 2111 false); 2112 } else if (auto BO = dyn_cast<BinaryOperator>(S)) { 2113 switch (BO->getOpcode()) { 2114 case BO_AddAssign: 2115 case BO_SubAssign: 2116 if (GetInitVarDecl(BO->getLHS()) == Var) 2117 return SetStep(BO->getRHS(), BO->getOpcode() == BO_SubAssign); 2118 break; 2119 case BO_Assign: 2120 if (GetInitVarDecl(BO->getLHS()) == Var) 2121 return CheckIncRHS(BO->getRHS()); 2122 break; 2123 default: 2124 break; 2125 } 2126 } else if (auto CE = dyn_cast<CXXOperatorCallExpr>(S)) { 2127 switch (CE->getOperator()) { 2128 case OO_PlusPlus: 2129 case OO_MinusMinus: 2130 if (GetInitVarDecl(CE->getArg(0)) == Var) 2131 return SetStep( 2132 SemaRef.ActOnIntegerConstant( 2133 CE->getLocStart(), 2134 ((CE->getOperator() == OO_MinusMinus) ? -1 : 1)).get(), 2135 false); 2136 break; 2137 case OO_PlusEqual: 2138 case OO_MinusEqual: 2139 if (GetInitVarDecl(CE->getArg(0)) == Var) 2140 return SetStep(CE->getArg(1), CE->getOperator() == OO_MinusEqual); 2141 break; 2142 case OO_Equal: 2143 if (GetInitVarDecl(CE->getArg(0)) == Var) 2144 return CheckIncRHS(CE->getArg(1)); 2145 break; 2146 default: 2147 break; 2148 } 2149 } 2150 SemaRef.Diag(S->getLocStart(), diag::err_omp_loop_not_canonical_incr) 2151 << S->getSourceRange() << Var; 2152 return true; 2153 } 2154 } // namespace 2155 2156 /// \brief Called on a for stmt to check and extract its iteration space 2157 /// for further processing (such as collapsing). 2158 static bool CheckOpenMPIterationSpace( 2159 OpenMPDirectiveKind DKind, Stmt *S, Sema &SemaRef, DSAStackTy &DSA, 2160 unsigned CurrentNestedLoopCount, unsigned NestedLoopCount, 2161 Expr *NestedLoopCountExpr, 2162 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) { 2163 // OpenMP [2.6, Canonical Loop Form] 2164 // for (init-expr; test-expr; incr-expr) structured-block 2165 auto For = dyn_cast_or_null<ForStmt>(S); 2166 if (!For) { 2167 SemaRef.Diag(S->getLocStart(), diag::err_omp_not_for) 2168 << (NestedLoopCountExpr != nullptr) << getOpenMPDirectiveName(DKind) 2169 << NestedLoopCount << (CurrentNestedLoopCount > 0) 2170 << CurrentNestedLoopCount; 2171 if (NestedLoopCount > 1) 2172 SemaRef.Diag(NestedLoopCountExpr->getExprLoc(), 2173 diag::note_omp_collapse_expr) 2174 << NestedLoopCountExpr->getSourceRange(); 2175 return true; 2176 } 2177 assert(For->getBody()); 2178 2179 OpenMPIterationSpaceChecker ISC(SemaRef, For->getForLoc()); 2180 2181 // Check init. 2182 auto Init = For->getInit(); 2183 if (ISC.CheckInit(Init)) { 2184 return true; 2185 } 2186 2187 bool HasErrors = false; 2188 2189 // Check loop variable's type. 2190 auto Var = ISC.GetLoopVar(); 2191 2192 // OpenMP [2.6, Canonical Loop Form] 2193 // Var is one of the following: 2194 // A variable of signed or unsigned integer type. 2195 // For C++, a variable of a random access iterator type. 2196 // For C, a variable of a pointer type. 2197 auto VarType = Var->getType(); 2198 if (!VarType->isDependentType() && !VarType->isIntegerType() && 2199 !VarType->isPointerType() && 2200 !(SemaRef.getLangOpts().CPlusPlus && VarType->isOverloadableType())) { 2201 SemaRef.Diag(Init->getLocStart(), diag::err_omp_loop_variable_type) 2202 << SemaRef.getLangOpts().CPlusPlus; 2203 HasErrors = true; 2204 } 2205 2206 // OpenMP, 2.14.1.1 Data-sharing Attribute Rules for Variables Referenced in a 2207 // Construct 2208 // The loop iteration variable(s) in the associated for-loop(s) of a for or 2209 // parallel for construct is (are) private. 2210 // The loop iteration variable in the associated for-loop of a simd construct 2211 // with just one associated for-loop is linear with a constant-linear-step 2212 // that is the increment of the associated for-loop. 2213 // Exclude loop var from the list of variables with implicitly defined data 2214 // sharing attributes. 2215 while (VarsWithImplicitDSA.count(Var) > 0) 2216 VarsWithImplicitDSA.erase(Var); 2217 2218 // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced in 2219 // a Construct, C/C++]. 2220 // The loop iteration variable in the associated for-loop of a simd construct 2221 // with just one associated for-loop may be listed in a linear clause with a 2222 // constant-linear-step that is the increment of the associated for-loop. 2223 // The loop iteration variable(s) in the associated for-loop(s) of a for or 2224 // parallel for construct may be listed in a private or lastprivate clause. 2225 DSAStackTy::DSAVarData DVar = DSA.getTopDSA(Var, false); 2226 auto LoopVarRefExpr = ISC.GetLoopVarRefExpr(); 2227 // If LoopVarRefExpr is nullptr it means the corresponding loop variable is 2228 // declared in the loop and it is predetermined as a private. 2229 auto PredeterminedCKind = 2230 isOpenMPSimdDirective(DKind) 2231 ? ((NestedLoopCount == 1) ? OMPC_linear : OMPC_lastprivate) 2232 : OMPC_private; 2233 if (((isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown && 2234 DVar.CKind != PredeterminedCKind) || 2235 (isOpenMPWorksharingDirective(DKind) && !isOpenMPSimdDirective(DKind) && 2236 DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_private && 2237 DVar.CKind != OMPC_lastprivate)) && 2238 (DVar.CKind != OMPC_private || DVar.RefExpr != nullptr)) { 2239 SemaRef.Diag(Init->getLocStart(), diag::err_omp_loop_var_dsa) 2240 << getOpenMPClauseName(DVar.CKind) << getOpenMPDirectiveName(DKind) 2241 << getOpenMPClauseName(PredeterminedCKind); 2242 ReportOriginalDSA(SemaRef, &DSA, Var, DVar, true); 2243 HasErrors = true; 2244 } else if (LoopVarRefExpr != nullptr) { 2245 // Make the loop iteration variable private (for worksharing constructs), 2246 // linear (for simd directives with the only one associated loop) or 2247 // lastprivate (for simd directives with several collapsed loops). 2248 DSA.addDSA(Var, LoopVarRefExpr, PredeterminedCKind); 2249 } 2250 2251 assert(isOpenMPLoopDirective(DKind) && "DSA for non-loop vars"); 2252 2253 // Check test-expr. 2254 HasErrors |= ISC.CheckCond(For->getCond()); 2255 2256 // Check incr-expr. 2257 HasErrors |= ISC.CheckInc(For->getInc()); 2258 2259 if (ISC.Dependent()) 2260 return HasErrors; 2261 2262 // FIXME: Build loop's iteration space representation. 2263 return HasErrors; 2264 } 2265 2266 /// \brief A helper routine to skip no-op (attributed, compound) stmts get the 2267 /// next nested for loop. If \a IgnoreCaptured is true, it skips captured stmt 2268 /// to get the first for loop. 2269 static Stmt *IgnoreContainerStmts(Stmt *S, bool IgnoreCaptured) { 2270 if (IgnoreCaptured) 2271 if (auto CapS = dyn_cast_or_null<CapturedStmt>(S)) 2272 S = CapS->getCapturedStmt(); 2273 // OpenMP [2.8.1, simd construct, Restrictions] 2274 // All loops associated with the construct must be perfectly nested; that is, 2275 // there must be no intervening code nor any OpenMP directive between any two 2276 // loops. 2277 while (true) { 2278 if (auto AS = dyn_cast_or_null<AttributedStmt>(S)) 2279 S = AS->getSubStmt(); 2280 else if (auto CS = dyn_cast_or_null<CompoundStmt>(S)) { 2281 if (CS->size() != 1) 2282 break; 2283 S = CS->body_back(); 2284 } else 2285 break; 2286 } 2287 return S; 2288 } 2289 2290 /// \brief Called on a for stmt to check itself and nested loops (if any). 2291 /// \return Returns 0 if one of the collapsed stmts is not canonical for loop, 2292 /// number of collapsed loops otherwise. 2293 static unsigned 2294 CheckOpenMPLoop(OpenMPDirectiveKind DKind, Expr *NestedLoopCountExpr, 2295 Stmt *AStmt, Sema &SemaRef, DSAStackTy &DSA, 2296 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) { 2297 unsigned NestedLoopCount = 1; 2298 if (NestedLoopCountExpr) { 2299 // Found 'collapse' clause - calculate collapse number. 2300 llvm::APSInt Result; 2301 if (NestedLoopCountExpr->EvaluateAsInt(Result, SemaRef.getASTContext())) 2302 NestedLoopCount = Result.getLimitedValue(); 2303 } 2304 // This is helper routine for loop directives (e.g., 'for', 'simd', 2305 // 'for simd', etc.). 2306 Stmt *CurStmt = IgnoreContainerStmts(AStmt, true); 2307 for (unsigned Cnt = 0; Cnt < NestedLoopCount; ++Cnt) { 2308 if (CheckOpenMPIterationSpace(DKind, CurStmt, SemaRef, DSA, Cnt, 2309 NestedLoopCount, NestedLoopCountExpr, 2310 VarsWithImplicitDSA)) 2311 return 0; 2312 // Move on to the next nested for loop, or to the loop body. 2313 CurStmt = IgnoreContainerStmts(cast<ForStmt>(CurStmt)->getBody(), false); 2314 } 2315 2316 // FIXME: Build resulting iteration space for IR generation (collapsing 2317 // iteration spaces when loop count > 1 ('collapse' clause)). 2318 return NestedLoopCount; 2319 } 2320 2321 static Expr *GetCollapseNumberExpr(ArrayRef<OMPClause *> Clauses) { 2322 auto CollapseFilter = [](const OMPClause *C) -> bool { 2323 return C->getClauseKind() == OMPC_collapse; 2324 }; 2325 OMPExecutableDirective::filtered_clause_iterator<decltype(CollapseFilter)> I( 2326 Clauses, CollapseFilter); 2327 if (I) 2328 return cast<OMPCollapseClause>(*I)->getNumForLoops(); 2329 return nullptr; 2330 } 2331 2332 StmtResult Sema::ActOnOpenMPSimdDirective( 2333 ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, 2334 SourceLocation EndLoc, 2335 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) { 2336 // In presence of clause 'collapse', it will define the nested loops number. 2337 unsigned NestedLoopCount = 2338 CheckOpenMPLoop(OMPD_simd, GetCollapseNumberExpr(Clauses), AStmt, *this, 2339 *DSAStack, VarsWithImplicitDSA); 2340 if (NestedLoopCount == 0) 2341 return StmtError(); 2342 2343 getCurFunction()->setHasBranchProtectedScope(); 2344 return OMPSimdDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, 2345 Clauses, AStmt); 2346 } 2347 2348 StmtResult Sema::ActOnOpenMPForDirective( 2349 ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, 2350 SourceLocation EndLoc, 2351 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) { 2352 // In presence of clause 'collapse', it will define the nested loops number. 2353 unsigned NestedLoopCount = 2354 CheckOpenMPLoop(OMPD_for, GetCollapseNumberExpr(Clauses), AStmt, *this, 2355 *DSAStack, VarsWithImplicitDSA); 2356 if (NestedLoopCount == 0) 2357 return StmtError(); 2358 2359 getCurFunction()->setHasBranchProtectedScope(); 2360 return OMPForDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, 2361 Clauses, AStmt); 2362 } 2363 2364 StmtResult Sema::ActOnOpenMPForSimdDirective( 2365 ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, 2366 SourceLocation EndLoc, 2367 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) { 2368 // In presence of clause 'collapse', it will define the nested loops number. 2369 unsigned NestedLoopCount = 2370 CheckOpenMPLoop(OMPD_for_simd, GetCollapseNumberExpr(Clauses), AStmt, 2371 *this, *DSAStack, VarsWithImplicitDSA); 2372 if (NestedLoopCount == 0) 2373 return StmtError(); 2374 2375 getCurFunction()->setHasBranchProtectedScope(); 2376 return OMPForSimdDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, 2377 Clauses, AStmt); 2378 } 2379 2380 StmtResult Sema::ActOnOpenMPSectionsDirective(ArrayRef<OMPClause *> Clauses, 2381 Stmt *AStmt, 2382 SourceLocation StartLoc, 2383 SourceLocation EndLoc) { 2384 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2385 auto BaseStmt = AStmt; 2386 while (CapturedStmt *CS = dyn_cast_or_null<CapturedStmt>(BaseStmt)) 2387 BaseStmt = CS->getCapturedStmt(); 2388 if (auto C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) { 2389 auto S = C->children(); 2390 if (!S) 2391 return StmtError(); 2392 // All associated statements must be '#pragma omp section' except for 2393 // the first one. 2394 for (++S; S; ++S) { 2395 auto SectionStmt = *S; 2396 if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) { 2397 if (SectionStmt) 2398 Diag(SectionStmt->getLocStart(), 2399 diag::err_omp_sections_substmt_not_section); 2400 return StmtError(); 2401 } 2402 } 2403 } else { 2404 Diag(AStmt->getLocStart(), diag::err_omp_sections_not_compound_stmt); 2405 return StmtError(); 2406 } 2407 2408 getCurFunction()->setHasBranchProtectedScope(); 2409 2410 return OMPSectionsDirective::Create(Context, StartLoc, EndLoc, Clauses, 2411 AStmt); 2412 } 2413 2414 StmtResult Sema::ActOnOpenMPSectionDirective(Stmt *AStmt, 2415 SourceLocation StartLoc, 2416 SourceLocation EndLoc) { 2417 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2418 2419 getCurFunction()->setHasBranchProtectedScope(); 2420 2421 return OMPSectionDirective::Create(Context, StartLoc, EndLoc, AStmt); 2422 } 2423 2424 StmtResult Sema::ActOnOpenMPSingleDirective(ArrayRef<OMPClause *> Clauses, 2425 Stmt *AStmt, 2426 SourceLocation StartLoc, 2427 SourceLocation EndLoc) { 2428 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2429 2430 getCurFunction()->setHasBranchProtectedScope(); 2431 2432 return OMPSingleDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); 2433 } 2434 2435 StmtResult Sema::ActOnOpenMPMasterDirective(Stmt *AStmt, 2436 SourceLocation StartLoc, 2437 SourceLocation EndLoc) { 2438 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2439 2440 getCurFunction()->setHasBranchProtectedScope(); 2441 2442 return OMPMasterDirective::Create(Context, StartLoc, EndLoc, AStmt); 2443 } 2444 2445 StmtResult 2446 Sema::ActOnOpenMPCriticalDirective(const DeclarationNameInfo &DirName, 2447 Stmt *AStmt, SourceLocation StartLoc, 2448 SourceLocation EndLoc) { 2449 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2450 2451 getCurFunction()->setHasBranchProtectedScope(); 2452 2453 return OMPCriticalDirective::Create(Context, DirName, StartLoc, EndLoc, 2454 AStmt); 2455 } 2456 2457 StmtResult Sema::ActOnOpenMPParallelForDirective( 2458 ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, 2459 SourceLocation EndLoc, 2460 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) { 2461 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2462 CapturedStmt *CS = cast<CapturedStmt>(AStmt); 2463 // 1.2.2 OpenMP Language Terminology 2464 // Structured block - An executable statement with a single entry at the 2465 // top and a single exit at the bottom. 2466 // The point of exit cannot be a branch out of the structured block. 2467 // longjmp() and throw() must not violate the entry/exit criteria. 2468 CS->getCapturedDecl()->setNothrow(); 2469 2470 // In presence of clause 'collapse', it will define the nested loops number. 2471 unsigned NestedLoopCount = 2472 CheckOpenMPLoop(OMPD_parallel_for, GetCollapseNumberExpr(Clauses), AStmt, 2473 *this, *DSAStack, VarsWithImplicitDSA); 2474 if (NestedLoopCount == 0) 2475 return StmtError(); 2476 2477 getCurFunction()->setHasBranchProtectedScope(); 2478 return OMPParallelForDirective::Create(Context, StartLoc, EndLoc, 2479 NestedLoopCount, Clauses, AStmt); 2480 } 2481 2482 StmtResult Sema::ActOnOpenMPParallelForSimdDirective( 2483 ArrayRef<OMPClause *> Clauses, Stmt *AStmt, SourceLocation StartLoc, 2484 SourceLocation EndLoc, 2485 llvm::DenseMap<VarDecl *, Expr *> &VarsWithImplicitDSA) { 2486 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2487 CapturedStmt *CS = cast<CapturedStmt>(AStmt); 2488 // 1.2.2 OpenMP Language Terminology 2489 // Structured block - An executable statement with a single entry at the 2490 // top and a single exit at the bottom. 2491 // The point of exit cannot be a branch out of the structured block. 2492 // longjmp() and throw() must not violate the entry/exit criteria. 2493 CS->getCapturedDecl()->setNothrow(); 2494 2495 // In presence of clause 'collapse', it will define the nested loops number. 2496 unsigned NestedLoopCount = 2497 CheckOpenMPLoop(OMPD_parallel_for_simd, GetCollapseNumberExpr(Clauses), 2498 AStmt, *this, *DSAStack, VarsWithImplicitDSA); 2499 if (NestedLoopCount == 0) 2500 return StmtError(); 2501 2502 getCurFunction()->setHasBranchProtectedScope(); 2503 return OMPParallelForSimdDirective::Create(Context, StartLoc, EndLoc, 2504 NestedLoopCount, Clauses, AStmt); 2505 } 2506 2507 StmtResult 2508 Sema::ActOnOpenMPParallelSectionsDirective(ArrayRef<OMPClause *> Clauses, 2509 Stmt *AStmt, SourceLocation StartLoc, 2510 SourceLocation EndLoc) { 2511 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2512 auto BaseStmt = AStmt; 2513 while (CapturedStmt *CS = dyn_cast_or_null<CapturedStmt>(BaseStmt)) 2514 BaseStmt = CS->getCapturedStmt(); 2515 if (auto C = dyn_cast_or_null<CompoundStmt>(BaseStmt)) { 2516 auto S = C->children(); 2517 if (!S) 2518 return StmtError(); 2519 // All associated statements must be '#pragma omp section' except for 2520 // the first one. 2521 for (++S; S; ++S) { 2522 auto SectionStmt = *S; 2523 if (!SectionStmt || !isa<OMPSectionDirective>(SectionStmt)) { 2524 if (SectionStmt) 2525 Diag(SectionStmt->getLocStart(), 2526 diag::err_omp_parallel_sections_substmt_not_section); 2527 return StmtError(); 2528 } 2529 } 2530 } else { 2531 Diag(AStmt->getLocStart(), 2532 diag::err_omp_parallel_sections_not_compound_stmt); 2533 return StmtError(); 2534 } 2535 2536 getCurFunction()->setHasBranchProtectedScope(); 2537 2538 return OMPParallelSectionsDirective::Create(Context, StartLoc, EndLoc, 2539 Clauses, AStmt); 2540 } 2541 2542 StmtResult Sema::ActOnOpenMPTaskDirective(ArrayRef<OMPClause *> Clauses, 2543 Stmt *AStmt, SourceLocation StartLoc, 2544 SourceLocation EndLoc) { 2545 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2546 CapturedStmt *CS = cast<CapturedStmt>(AStmt); 2547 // 1.2.2 OpenMP Language Terminology 2548 // Structured block - An executable statement with a single entry at the 2549 // top and a single exit at the bottom. 2550 // The point of exit cannot be a branch out of the structured block. 2551 // longjmp() and throw() must not violate the entry/exit criteria. 2552 CS->getCapturedDecl()->setNothrow(); 2553 2554 getCurFunction()->setHasBranchProtectedScope(); 2555 2556 return OMPTaskDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); 2557 } 2558 2559 StmtResult Sema::ActOnOpenMPTaskyieldDirective(SourceLocation StartLoc, 2560 SourceLocation EndLoc) { 2561 return OMPTaskyieldDirective::Create(Context, StartLoc, EndLoc); 2562 } 2563 2564 StmtResult Sema::ActOnOpenMPBarrierDirective(SourceLocation StartLoc, 2565 SourceLocation EndLoc) { 2566 return OMPBarrierDirective::Create(Context, StartLoc, EndLoc); 2567 } 2568 2569 StmtResult Sema::ActOnOpenMPTaskwaitDirective(SourceLocation StartLoc, 2570 SourceLocation EndLoc) { 2571 return OMPTaskwaitDirective::Create(Context, StartLoc, EndLoc); 2572 } 2573 2574 StmtResult Sema::ActOnOpenMPFlushDirective(ArrayRef<OMPClause *> Clauses, 2575 SourceLocation StartLoc, 2576 SourceLocation EndLoc) { 2577 assert(Clauses.size() <= 1 && "Extra clauses in flush directive"); 2578 return OMPFlushDirective::Create(Context, StartLoc, EndLoc, Clauses); 2579 } 2580 2581 StmtResult Sema::ActOnOpenMPOrderedDirective(Stmt *AStmt, 2582 SourceLocation StartLoc, 2583 SourceLocation EndLoc) { 2584 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2585 2586 getCurFunction()->setHasBranchProtectedScope(); 2587 2588 return OMPOrderedDirective::Create(Context, StartLoc, EndLoc, AStmt); 2589 } 2590 2591 StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, 2592 Stmt *AStmt, 2593 SourceLocation StartLoc, 2594 SourceLocation EndLoc) { 2595 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2596 auto CS = cast<CapturedStmt>(AStmt); 2597 // 1.2.2 OpenMP Language Terminology 2598 // Structured block - An executable statement with a single entry at the 2599 // top and a single exit at the bottom. 2600 // The point of exit cannot be a branch out of the structured block. 2601 // longjmp() and throw() must not violate the entry/exit criteria. 2602 // TODO further analysis of associated statements and clauses. 2603 OpenMPClauseKind AtomicKind = OMPC_unknown; 2604 SourceLocation AtomicKindLoc; 2605 for (auto *C : Clauses) { 2606 if (C->getClauseKind() == OMPC_read || C->getClauseKind() == OMPC_write || 2607 C->getClauseKind() == OMPC_update || 2608 C->getClauseKind() == OMPC_capture) { 2609 if (AtomicKind != OMPC_unknown) { 2610 Diag(C->getLocStart(), diag::err_omp_atomic_several_clauses) 2611 << SourceRange(C->getLocStart(), C->getLocEnd()); 2612 Diag(AtomicKindLoc, diag::note_omp_atomic_previous_clause) 2613 << getOpenMPClauseName(AtomicKind); 2614 } else { 2615 AtomicKind = C->getClauseKind(); 2616 AtomicKindLoc = C->getLocStart(); 2617 } 2618 } 2619 } 2620 auto Body = CS->getCapturedStmt(); 2621 if (AtomicKind == OMPC_read) { 2622 if (!isa<Expr>(Body)) { 2623 Diag(Body->getLocStart(), 2624 diag::err_omp_atomic_read_not_expression_statement); 2625 return StmtError(); 2626 } 2627 } else if (AtomicKind == OMPC_write) { 2628 if (!isa<Expr>(Body)) { 2629 Diag(Body->getLocStart(), 2630 diag::err_omp_atomic_write_not_expression_statement); 2631 return StmtError(); 2632 } 2633 } else if (AtomicKind == OMPC_update || AtomicKind == OMPC_unknown) { 2634 if (!isa<Expr>(Body)) { 2635 Diag(Body->getLocStart(), 2636 diag::err_omp_atomic_update_not_expression_statement) 2637 << (AtomicKind == OMPC_update); 2638 return StmtError(); 2639 } 2640 } else if (AtomicKind == OMPC_capture) { 2641 if (isa<Expr>(Body) && !isa<BinaryOperator>(Body)) { 2642 Diag(Body->getLocStart(), 2643 diag::err_omp_atomic_capture_not_expression_statement); 2644 return StmtError(); 2645 } else if (!isa<Expr>(Body) && !isa<CompoundStmt>(Body)) { 2646 Diag(Body->getLocStart(), 2647 diag::err_omp_atomic_capture_not_compound_statement); 2648 return StmtError(); 2649 } 2650 } 2651 2652 getCurFunction()->setHasBranchProtectedScope(); 2653 2654 return OMPAtomicDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); 2655 } 2656 2657 StmtResult Sema::ActOnOpenMPTargetDirective(ArrayRef<OMPClause *> Clauses, 2658 Stmt *AStmt, 2659 SourceLocation StartLoc, 2660 SourceLocation EndLoc) { 2661 assert(AStmt && isa<CapturedStmt>(AStmt) && "Captured statement expected"); 2662 2663 getCurFunction()->setHasBranchProtectedScope(); 2664 2665 return OMPTargetDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); 2666 } 2667 2668 OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr *Expr, 2669 SourceLocation StartLoc, 2670 SourceLocation LParenLoc, 2671 SourceLocation EndLoc) { 2672 OMPClause *Res = nullptr; 2673 switch (Kind) { 2674 case OMPC_if: 2675 Res = ActOnOpenMPIfClause(Expr, StartLoc, LParenLoc, EndLoc); 2676 break; 2677 case OMPC_final: 2678 Res = ActOnOpenMPFinalClause(Expr, StartLoc, LParenLoc, EndLoc); 2679 break; 2680 case OMPC_num_threads: 2681 Res = ActOnOpenMPNumThreadsClause(Expr, StartLoc, LParenLoc, EndLoc); 2682 break; 2683 case OMPC_safelen: 2684 Res = ActOnOpenMPSafelenClause(Expr, StartLoc, LParenLoc, EndLoc); 2685 break; 2686 case OMPC_collapse: 2687 Res = ActOnOpenMPCollapseClause(Expr, StartLoc, LParenLoc, EndLoc); 2688 break; 2689 case OMPC_default: 2690 case OMPC_proc_bind: 2691 case OMPC_schedule: 2692 case OMPC_private: 2693 case OMPC_firstprivate: 2694 case OMPC_lastprivate: 2695 case OMPC_shared: 2696 case OMPC_reduction: 2697 case OMPC_linear: 2698 case OMPC_aligned: 2699 case OMPC_copyin: 2700 case OMPC_copyprivate: 2701 case OMPC_ordered: 2702 case OMPC_nowait: 2703 case OMPC_untied: 2704 case OMPC_mergeable: 2705 case OMPC_threadprivate: 2706 case OMPC_flush: 2707 case OMPC_read: 2708 case OMPC_write: 2709 case OMPC_update: 2710 case OMPC_capture: 2711 case OMPC_seq_cst: 2712 case OMPC_unknown: 2713 llvm_unreachable("Clause is not allowed."); 2714 } 2715 return Res; 2716 } 2717 2718 OMPClause *Sema::ActOnOpenMPIfClause(Expr *Condition, SourceLocation StartLoc, 2719 SourceLocation LParenLoc, 2720 SourceLocation EndLoc) { 2721 Expr *ValExpr = Condition; 2722 if (!Condition->isValueDependent() && !Condition->isTypeDependent() && 2723 !Condition->isInstantiationDependent() && 2724 !Condition->containsUnexpandedParameterPack()) { 2725 ExprResult Val = ActOnBooleanCondition(DSAStack->getCurScope(), 2726 Condition->getExprLoc(), Condition); 2727 if (Val.isInvalid()) 2728 return nullptr; 2729 2730 ValExpr = Val.get(); 2731 } 2732 2733 return new (Context) OMPIfClause(ValExpr, StartLoc, LParenLoc, EndLoc); 2734 } 2735 2736 OMPClause *Sema::ActOnOpenMPFinalClause(Expr *Condition, 2737 SourceLocation StartLoc, 2738 SourceLocation LParenLoc, 2739 SourceLocation EndLoc) { 2740 Expr *ValExpr = Condition; 2741 if (!Condition->isValueDependent() && !Condition->isTypeDependent() && 2742 !Condition->isInstantiationDependent() && 2743 !Condition->containsUnexpandedParameterPack()) { 2744 ExprResult Val = ActOnBooleanCondition(DSAStack->getCurScope(), 2745 Condition->getExprLoc(), Condition); 2746 if (Val.isInvalid()) 2747 return nullptr; 2748 2749 ValExpr = Val.get(); 2750 } 2751 2752 return new (Context) OMPFinalClause(ValExpr, StartLoc, LParenLoc, EndLoc); 2753 } 2754 ExprResult Sema::PerformOpenMPImplicitIntegerConversion(SourceLocation Loc, 2755 Expr *Op) { 2756 if (!Op) 2757 return ExprError(); 2758 2759 class IntConvertDiagnoser : public ICEConvertDiagnoser { 2760 public: 2761 IntConvertDiagnoser() 2762 : ICEConvertDiagnoser(/*AllowScopedEnumerations*/ false, false, true) {} 2763 SemaDiagnosticBuilder diagnoseNotInt(Sema &S, SourceLocation Loc, 2764 QualType T) override { 2765 return S.Diag(Loc, diag::err_omp_not_integral) << T; 2766 } 2767 SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc, 2768 QualType T) override { 2769 return S.Diag(Loc, diag::err_omp_incomplete_type) << T; 2770 } 2771 SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc, 2772 QualType T, 2773 QualType ConvTy) override { 2774 return S.Diag(Loc, diag::err_omp_explicit_conversion) << T << ConvTy; 2775 } 2776 SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv, 2777 QualType ConvTy) override { 2778 return S.Diag(Conv->getLocation(), diag::note_omp_conversion_here) 2779 << ConvTy->isEnumeralType() << ConvTy; 2780 } 2781 SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc, 2782 QualType T) override { 2783 return S.Diag(Loc, diag::err_omp_ambiguous_conversion) << T; 2784 } 2785 SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv, 2786 QualType ConvTy) override { 2787 return S.Diag(Conv->getLocation(), diag::note_omp_conversion_here) 2788 << ConvTy->isEnumeralType() << ConvTy; 2789 } 2790 SemaDiagnosticBuilder diagnoseConversion(Sema &, SourceLocation, QualType, 2791 QualType) override { 2792 llvm_unreachable("conversion functions are permitted"); 2793 } 2794 } ConvertDiagnoser; 2795 return PerformContextualImplicitConversion(Loc, Op, ConvertDiagnoser); 2796 } 2797 2798 OMPClause *Sema::ActOnOpenMPNumThreadsClause(Expr *NumThreads, 2799 SourceLocation StartLoc, 2800 SourceLocation LParenLoc, 2801 SourceLocation EndLoc) { 2802 Expr *ValExpr = NumThreads; 2803 if (!NumThreads->isValueDependent() && !NumThreads->isTypeDependent() && 2804 !NumThreads->isInstantiationDependent() && 2805 !NumThreads->containsUnexpandedParameterPack()) { 2806 SourceLocation NumThreadsLoc = NumThreads->getLocStart(); 2807 ExprResult Val = 2808 PerformOpenMPImplicitIntegerConversion(NumThreadsLoc, NumThreads); 2809 if (Val.isInvalid()) 2810 return nullptr; 2811 2812 ValExpr = Val.get(); 2813 2814 // OpenMP [2.5, Restrictions] 2815 // The num_threads expression must evaluate to a positive integer value. 2816 llvm::APSInt Result; 2817 if (ValExpr->isIntegerConstantExpr(Result, Context) && Result.isSigned() && 2818 !Result.isStrictlyPositive()) { 2819 Diag(NumThreadsLoc, diag::err_omp_negative_expression_in_clause) 2820 << "num_threads" << NumThreads->getSourceRange(); 2821 return nullptr; 2822 } 2823 } 2824 2825 return new (Context) 2826 OMPNumThreadsClause(ValExpr, StartLoc, LParenLoc, EndLoc); 2827 } 2828 2829 ExprResult Sema::VerifyPositiveIntegerConstantInClause(Expr *E, 2830 OpenMPClauseKind CKind) { 2831 if (!E) 2832 return ExprError(); 2833 if (E->isValueDependent() || E->isTypeDependent() || 2834 E->isInstantiationDependent() || E->containsUnexpandedParameterPack()) 2835 return E; 2836 llvm::APSInt Result; 2837 ExprResult ICE = VerifyIntegerConstantExpression(E, &Result); 2838 if (ICE.isInvalid()) 2839 return ExprError(); 2840 if (!Result.isStrictlyPositive()) { 2841 Diag(E->getExprLoc(), diag::err_omp_negative_expression_in_clause) 2842 << getOpenMPClauseName(CKind) << E->getSourceRange(); 2843 return ExprError(); 2844 } 2845 return ICE; 2846 } 2847 2848 OMPClause *Sema::ActOnOpenMPSafelenClause(Expr *Len, SourceLocation StartLoc, 2849 SourceLocation LParenLoc, 2850 SourceLocation EndLoc) { 2851 // OpenMP [2.8.1, simd construct, Description] 2852 // The parameter of the safelen clause must be a constant 2853 // positive integer expression. 2854 ExprResult Safelen = VerifyPositiveIntegerConstantInClause(Len, OMPC_safelen); 2855 if (Safelen.isInvalid()) 2856 return nullptr; 2857 return new (Context) 2858 OMPSafelenClause(Safelen.get(), StartLoc, LParenLoc, EndLoc); 2859 } 2860 2861 OMPClause *Sema::ActOnOpenMPCollapseClause(Expr *NumForLoops, 2862 SourceLocation StartLoc, 2863 SourceLocation LParenLoc, 2864 SourceLocation EndLoc) { 2865 // OpenMP [2.7.1, loop construct, Description] 2866 // OpenMP [2.8.1, simd construct, Description] 2867 // OpenMP [2.9.6, distribute construct, Description] 2868 // The parameter of the collapse clause must be a constant 2869 // positive integer expression. 2870 ExprResult NumForLoopsResult = 2871 VerifyPositiveIntegerConstantInClause(NumForLoops, OMPC_collapse); 2872 if (NumForLoopsResult.isInvalid()) 2873 return nullptr; 2874 return new (Context) 2875 OMPCollapseClause(NumForLoopsResult.get(), StartLoc, LParenLoc, EndLoc); 2876 } 2877 2878 OMPClause *Sema::ActOnOpenMPSimpleClause( 2879 OpenMPClauseKind Kind, unsigned Argument, SourceLocation ArgumentLoc, 2880 SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) { 2881 OMPClause *Res = nullptr; 2882 switch (Kind) { 2883 case OMPC_default: 2884 Res = 2885 ActOnOpenMPDefaultClause(static_cast<OpenMPDefaultClauseKind>(Argument), 2886 ArgumentLoc, StartLoc, LParenLoc, EndLoc); 2887 break; 2888 case OMPC_proc_bind: 2889 Res = ActOnOpenMPProcBindClause( 2890 static_cast<OpenMPProcBindClauseKind>(Argument), ArgumentLoc, StartLoc, 2891 LParenLoc, EndLoc); 2892 break; 2893 case OMPC_if: 2894 case OMPC_final: 2895 case OMPC_num_threads: 2896 case OMPC_safelen: 2897 case OMPC_collapse: 2898 case OMPC_schedule: 2899 case OMPC_private: 2900 case OMPC_firstprivate: 2901 case OMPC_lastprivate: 2902 case OMPC_shared: 2903 case OMPC_reduction: 2904 case OMPC_linear: 2905 case OMPC_aligned: 2906 case OMPC_copyin: 2907 case OMPC_copyprivate: 2908 case OMPC_ordered: 2909 case OMPC_nowait: 2910 case OMPC_untied: 2911 case OMPC_mergeable: 2912 case OMPC_threadprivate: 2913 case OMPC_flush: 2914 case OMPC_read: 2915 case OMPC_write: 2916 case OMPC_update: 2917 case OMPC_capture: 2918 case OMPC_seq_cst: 2919 case OMPC_unknown: 2920 llvm_unreachable("Clause is not allowed."); 2921 } 2922 return Res; 2923 } 2924 2925 OMPClause *Sema::ActOnOpenMPDefaultClause(OpenMPDefaultClauseKind Kind, 2926 SourceLocation KindKwLoc, 2927 SourceLocation StartLoc, 2928 SourceLocation LParenLoc, 2929 SourceLocation EndLoc) { 2930 if (Kind == OMPC_DEFAULT_unknown) { 2931 std::string Values; 2932 static_assert(OMPC_DEFAULT_unknown > 0, 2933 "OMPC_DEFAULT_unknown not greater than 0"); 2934 std::string Sep(", "); 2935 for (unsigned i = 0; i < OMPC_DEFAULT_unknown; ++i) { 2936 Values += "'"; 2937 Values += getOpenMPSimpleClauseTypeName(OMPC_default, i); 2938 Values += "'"; 2939 switch (i) { 2940 case OMPC_DEFAULT_unknown - 2: 2941 Values += " or "; 2942 break; 2943 case OMPC_DEFAULT_unknown - 1: 2944 break; 2945 default: 2946 Values += Sep; 2947 break; 2948 } 2949 } 2950 Diag(KindKwLoc, diag::err_omp_unexpected_clause_value) 2951 << Values << getOpenMPClauseName(OMPC_default); 2952 return nullptr; 2953 } 2954 switch (Kind) { 2955 case OMPC_DEFAULT_none: 2956 DSAStack->setDefaultDSANone(KindKwLoc); 2957 break; 2958 case OMPC_DEFAULT_shared: 2959 DSAStack->setDefaultDSAShared(KindKwLoc); 2960 break; 2961 case OMPC_DEFAULT_unknown: 2962 llvm_unreachable("Clause kind is not allowed."); 2963 break; 2964 } 2965 return new (Context) 2966 OMPDefaultClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc); 2967 } 2968 2969 OMPClause *Sema::ActOnOpenMPProcBindClause(OpenMPProcBindClauseKind Kind, 2970 SourceLocation KindKwLoc, 2971 SourceLocation StartLoc, 2972 SourceLocation LParenLoc, 2973 SourceLocation EndLoc) { 2974 if (Kind == OMPC_PROC_BIND_unknown) { 2975 std::string Values; 2976 std::string Sep(", "); 2977 for (unsigned i = 0; i < OMPC_PROC_BIND_unknown; ++i) { 2978 Values += "'"; 2979 Values += getOpenMPSimpleClauseTypeName(OMPC_proc_bind, i); 2980 Values += "'"; 2981 switch (i) { 2982 case OMPC_PROC_BIND_unknown - 2: 2983 Values += " or "; 2984 break; 2985 case OMPC_PROC_BIND_unknown - 1: 2986 break; 2987 default: 2988 Values += Sep; 2989 break; 2990 } 2991 } 2992 Diag(KindKwLoc, diag::err_omp_unexpected_clause_value) 2993 << Values << getOpenMPClauseName(OMPC_proc_bind); 2994 return nullptr; 2995 } 2996 return new (Context) 2997 OMPProcBindClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc); 2998 } 2999 3000 OMPClause *Sema::ActOnOpenMPSingleExprWithArgClause( 3001 OpenMPClauseKind Kind, unsigned Argument, Expr *Expr, 3002 SourceLocation StartLoc, SourceLocation LParenLoc, 3003 SourceLocation ArgumentLoc, SourceLocation CommaLoc, 3004 SourceLocation EndLoc) { 3005 OMPClause *Res = nullptr; 3006 switch (Kind) { 3007 case OMPC_schedule: 3008 Res = ActOnOpenMPScheduleClause( 3009 static_cast<OpenMPScheduleClauseKind>(Argument), Expr, StartLoc, 3010 LParenLoc, ArgumentLoc, CommaLoc, EndLoc); 3011 break; 3012 case OMPC_if: 3013 case OMPC_final: 3014 case OMPC_num_threads: 3015 case OMPC_safelen: 3016 case OMPC_collapse: 3017 case OMPC_default: 3018 case OMPC_proc_bind: 3019 case OMPC_private: 3020 case OMPC_firstprivate: 3021 case OMPC_lastprivate: 3022 case OMPC_shared: 3023 case OMPC_reduction: 3024 case OMPC_linear: 3025 case OMPC_aligned: 3026 case OMPC_copyin: 3027 case OMPC_copyprivate: 3028 case OMPC_ordered: 3029 case OMPC_nowait: 3030 case OMPC_untied: 3031 case OMPC_mergeable: 3032 case OMPC_threadprivate: 3033 case OMPC_flush: 3034 case OMPC_read: 3035 case OMPC_write: 3036 case OMPC_update: 3037 case OMPC_capture: 3038 case OMPC_seq_cst: 3039 case OMPC_unknown: 3040 llvm_unreachable("Clause is not allowed."); 3041 } 3042 return Res; 3043 } 3044 3045 OMPClause *Sema::ActOnOpenMPScheduleClause( 3046 OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc, 3047 SourceLocation LParenLoc, SourceLocation KindLoc, SourceLocation CommaLoc, 3048 SourceLocation EndLoc) { 3049 if (Kind == OMPC_SCHEDULE_unknown) { 3050 std::string Values; 3051 std::string Sep(", "); 3052 for (unsigned i = 0; i < OMPC_SCHEDULE_unknown; ++i) { 3053 Values += "'"; 3054 Values += getOpenMPSimpleClauseTypeName(OMPC_schedule, i); 3055 Values += "'"; 3056 switch (i) { 3057 case OMPC_SCHEDULE_unknown - 2: 3058 Values += " or "; 3059 break; 3060 case OMPC_SCHEDULE_unknown - 1: 3061 break; 3062 default: 3063 Values += Sep; 3064 break; 3065 } 3066 } 3067 Diag(KindLoc, diag::err_omp_unexpected_clause_value) 3068 << Values << getOpenMPClauseName(OMPC_schedule); 3069 return nullptr; 3070 } 3071 Expr *ValExpr = ChunkSize; 3072 if (ChunkSize) { 3073 if (!ChunkSize->isValueDependent() && !ChunkSize->isTypeDependent() && 3074 !ChunkSize->isInstantiationDependent() && 3075 !ChunkSize->containsUnexpandedParameterPack()) { 3076 SourceLocation ChunkSizeLoc = ChunkSize->getLocStart(); 3077 ExprResult Val = 3078 PerformOpenMPImplicitIntegerConversion(ChunkSizeLoc, ChunkSize); 3079 if (Val.isInvalid()) 3080 return nullptr; 3081 3082 ValExpr = Val.get(); 3083 3084 // OpenMP [2.7.1, Restrictions] 3085 // chunk_size must be a loop invariant integer expression with a positive 3086 // value. 3087 llvm::APSInt Result; 3088 if (ValExpr->isIntegerConstantExpr(Result, Context) && 3089 Result.isSigned() && !Result.isStrictlyPositive()) { 3090 Diag(ChunkSizeLoc, diag::err_omp_negative_expression_in_clause) 3091 << "schedule" << ChunkSize->getSourceRange(); 3092 return nullptr; 3093 } 3094 } 3095 } 3096 3097 return new (Context) OMPScheduleClause(StartLoc, LParenLoc, KindLoc, CommaLoc, 3098 EndLoc, Kind, ValExpr); 3099 } 3100 3101 OMPClause *Sema::ActOnOpenMPClause(OpenMPClauseKind Kind, 3102 SourceLocation StartLoc, 3103 SourceLocation EndLoc) { 3104 OMPClause *Res = nullptr; 3105 switch (Kind) { 3106 case OMPC_ordered: 3107 Res = ActOnOpenMPOrderedClause(StartLoc, EndLoc); 3108 break; 3109 case OMPC_nowait: 3110 Res = ActOnOpenMPNowaitClause(StartLoc, EndLoc); 3111 break; 3112 case OMPC_untied: 3113 Res = ActOnOpenMPUntiedClause(StartLoc, EndLoc); 3114 break; 3115 case OMPC_mergeable: 3116 Res = ActOnOpenMPMergeableClause(StartLoc, EndLoc); 3117 break; 3118 case OMPC_read: 3119 Res = ActOnOpenMPReadClause(StartLoc, EndLoc); 3120 break; 3121 case OMPC_write: 3122 Res = ActOnOpenMPWriteClause(StartLoc, EndLoc); 3123 break; 3124 case OMPC_update: 3125 Res = ActOnOpenMPUpdateClause(StartLoc, EndLoc); 3126 break; 3127 case OMPC_capture: 3128 Res = ActOnOpenMPCaptureClause(StartLoc, EndLoc); 3129 break; 3130 case OMPC_seq_cst: 3131 Res = ActOnOpenMPSeqCstClause(StartLoc, EndLoc); 3132 break; 3133 case OMPC_if: 3134 case OMPC_final: 3135 case OMPC_num_threads: 3136 case OMPC_safelen: 3137 case OMPC_collapse: 3138 case OMPC_schedule: 3139 case OMPC_private: 3140 case OMPC_firstprivate: 3141 case OMPC_lastprivate: 3142 case OMPC_shared: 3143 case OMPC_reduction: 3144 case OMPC_linear: 3145 case OMPC_aligned: 3146 case OMPC_copyin: 3147 case OMPC_copyprivate: 3148 case OMPC_default: 3149 case OMPC_proc_bind: 3150 case OMPC_threadprivate: 3151 case OMPC_flush: 3152 case OMPC_unknown: 3153 llvm_unreachable("Clause is not allowed."); 3154 } 3155 return Res; 3156 } 3157 3158 OMPClause *Sema::ActOnOpenMPOrderedClause(SourceLocation StartLoc, 3159 SourceLocation EndLoc) { 3160 DSAStack->setOrderedRegion(); 3161 return new (Context) OMPOrderedClause(StartLoc, EndLoc); 3162 } 3163 3164 OMPClause *Sema::ActOnOpenMPNowaitClause(SourceLocation StartLoc, 3165 SourceLocation EndLoc) { 3166 return new (Context) OMPNowaitClause(StartLoc, EndLoc); 3167 } 3168 3169 OMPClause *Sema::ActOnOpenMPUntiedClause(SourceLocation StartLoc, 3170 SourceLocation EndLoc) { 3171 return new (Context) OMPUntiedClause(StartLoc, EndLoc); 3172 } 3173 3174 OMPClause *Sema::ActOnOpenMPMergeableClause(SourceLocation StartLoc, 3175 SourceLocation EndLoc) { 3176 return new (Context) OMPMergeableClause(StartLoc, EndLoc); 3177 } 3178 3179 OMPClause *Sema::ActOnOpenMPReadClause(SourceLocation StartLoc, 3180 SourceLocation EndLoc) { 3181 return new (Context) OMPReadClause(StartLoc, EndLoc); 3182 } 3183 3184 OMPClause *Sema::ActOnOpenMPWriteClause(SourceLocation StartLoc, 3185 SourceLocation EndLoc) { 3186 return new (Context) OMPWriteClause(StartLoc, EndLoc); 3187 } 3188 3189 OMPClause *Sema::ActOnOpenMPUpdateClause(SourceLocation StartLoc, 3190 SourceLocation EndLoc) { 3191 return new (Context) OMPUpdateClause(StartLoc, EndLoc); 3192 } 3193 3194 OMPClause *Sema::ActOnOpenMPCaptureClause(SourceLocation StartLoc, 3195 SourceLocation EndLoc) { 3196 return new (Context) OMPCaptureClause(StartLoc, EndLoc); 3197 } 3198 3199 OMPClause *Sema::ActOnOpenMPSeqCstClause(SourceLocation StartLoc, 3200 SourceLocation EndLoc) { 3201 return new (Context) OMPSeqCstClause(StartLoc, EndLoc); 3202 } 3203 3204 OMPClause *Sema::ActOnOpenMPVarListClause( 3205 OpenMPClauseKind Kind, ArrayRef<Expr *> VarList, Expr *TailExpr, 3206 SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation ColonLoc, 3207 SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec, 3208 const DeclarationNameInfo &ReductionId) { 3209 OMPClause *Res = nullptr; 3210 switch (Kind) { 3211 case OMPC_private: 3212 Res = ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc, EndLoc); 3213 break; 3214 case OMPC_firstprivate: 3215 Res = ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc, EndLoc); 3216 break; 3217 case OMPC_lastprivate: 3218 Res = ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc, EndLoc); 3219 break; 3220 case OMPC_shared: 3221 Res = ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, EndLoc); 3222 break; 3223 case OMPC_reduction: 3224 Res = ActOnOpenMPReductionClause(VarList, StartLoc, LParenLoc, ColonLoc, 3225 EndLoc, ReductionIdScopeSpec, ReductionId); 3226 break; 3227 case OMPC_linear: 3228 Res = ActOnOpenMPLinearClause(VarList, TailExpr, StartLoc, LParenLoc, 3229 ColonLoc, EndLoc); 3230 break; 3231 case OMPC_aligned: 3232 Res = ActOnOpenMPAlignedClause(VarList, TailExpr, StartLoc, LParenLoc, 3233 ColonLoc, EndLoc); 3234 break; 3235 case OMPC_copyin: 3236 Res = ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc, EndLoc); 3237 break; 3238 case OMPC_copyprivate: 3239 Res = ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc, EndLoc); 3240 break; 3241 case OMPC_flush: 3242 Res = ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc, EndLoc); 3243 break; 3244 case OMPC_if: 3245 case OMPC_final: 3246 case OMPC_num_threads: 3247 case OMPC_safelen: 3248 case OMPC_collapse: 3249 case OMPC_default: 3250 case OMPC_proc_bind: 3251 case OMPC_schedule: 3252 case OMPC_ordered: 3253 case OMPC_nowait: 3254 case OMPC_untied: 3255 case OMPC_mergeable: 3256 case OMPC_threadprivate: 3257 case OMPC_read: 3258 case OMPC_write: 3259 case OMPC_update: 3260 case OMPC_capture: 3261 case OMPC_seq_cst: 3262 case OMPC_unknown: 3263 llvm_unreachable("Clause is not allowed."); 3264 } 3265 return Res; 3266 } 3267 3268 OMPClause *Sema::ActOnOpenMPPrivateClause(ArrayRef<Expr *> VarList, 3269 SourceLocation StartLoc, 3270 SourceLocation LParenLoc, 3271 SourceLocation EndLoc) { 3272 SmallVector<Expr *, 8> Vars; 3273 for (auto &RefExpr : VarList) { 3274 assert(RefExpr && "NULL expr in OpenMP private clause."); 3275 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 3276 // It will be analyzed later. 3277 Vars.push_back(RefExpr); 3278 continue; 3279 } 3280 3281 SourceLocation ELoc = RefExpr->getExprLoc(); 3282 // OpenMP [2.1, C/C++] 3283 // A list item is a variable name. 3284 // OpenMP [2.9.3.3, Restrictions, p.1] 3285 // A variable that is part of another variable (as an array or 3286 // structure element) cannot appear in a private clause. 3287 DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr); 3288 if (!DE || !isa<VarDecl>(DE->getDecl())) { 3289 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 3290 continue; 3291 } 3292 Decl *D = DE->getDecl(); 3293 VarDecl *VD = cast<VarDecl>(D); 3294 3295 QualType Type = VD->getType(); 3296 if (Type->isDependentType() || Type->isInstantiationDependentType()) { 3297 // It will be analyzed later. 3298 Vars.push_back(DE); 3299 continue; 3300 } 3301 3302 // OpenMP [2.9.3.3, Restrictions, C/C++, p.3] 3303 // A variable that appears in a private clause must not have an incomplete 3304 // type or a reference type. 3305 if (RequireCompleteType(ELoc, Type, 3306 diag::err_omp_private_incomplete_type)) { 3307 continue; 3308 } 3309 if (Type->isReferenceType()) { 3310 Diag(ELoc, diag::err_omp_clause_ref_type_arg) 3311 << getOpenMPClauseName(OMPC_private) << Type; 3312 bool IsDecl = 3313 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 3314 Diag(VD->getLocation(), 3315 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3316 << VD; 3317 continue; 3318 } 3319 3320 // OpenMP [2.9.3.3, Restrictions, C/C++, p.1] 3321 // A variable of class type (or array thereof) that appears in a private 3322 // clause requires an accessible, unambiguous default constructor for the 3323 // class type. 3324 while (Type.getNonReferenceType()->isArrayType()) { 3325 Type = cast<ArrayType>(Type.getNonReferenceType().getTypePtr()) 3326 ->getElementType(); 3327 } 3328 CXXRecordDecl *RD = getLangOpts().CPlusPlus 3329 ? Type.getNonReferenceType()->getAsCXXRecordDecl() 3330 : nullptr; 3331 // FIXME This code must be replaced by actual constructing/destructing of 3332 // the private variable. 3333 if (RD) { 3334 CXXConstructorDecl *CD = LookupDefaultConstructor(RD); 3335 PartialDiagnostic PD = 3336 PartialDiagnostic(PartialDiagnostic::NullDiagnostic()); 3337 if (!CD || 3338 CheckConstructorAccess(ELoc, CD, 3339 InitializedEntity::InitializeTemporary(Type), 3340 CD->getAccess(), PD) == AR_inaccessible || 3341 CD->isDeleted()) { 3342 Diag(ELoc, diag::err_omp_required_method) 3343 << getOpenMPClauseName(OMPC_private) << 0; 3344 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 3345 VarDecl::DeclarationOnly; 3346 Diag(VD->getLocation(), 3347 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3348 << VD; 3349 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 3350 continue; 3351 } 3352 MarkFunctionReferenced(ELoc, CD); 3353 DiagnoseUseOfDecl(CD, ELoc); 3354 3355 CXXDestructorDecl *DD = RD->getDestructor(); 3356 if (DD) { 3357 if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible || 3358 DD->isDeleted()) { 3359 Diag(ELoc, diag::err_omp_required_method) 3360 << getOpenMPClauseName(OMPC_private) << 4; 3361 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 3362 VarDecl::DeclarationOnly; 3363 Diag(VD->getLocation(), 3364 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3365 << VD; 3366 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 3367 continue; 3368 } 3369 MarkFunctionReferenced(ELoc, DD); 3370 DiagnoseUseOfDecl(DD, ELoc); 3371 } 3372 } 3373 3374 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 3375 // in a Construct] 3376 // Variables with the predetermined data-sharing attributes may not be 3377 // listed in data-sharing attributes clauses, except for the cases 3378 // listed below. For these exceptions only, listing a predetermined 3379 // variable in a data-sharing attribute clause is allowed and overrides 3380 // the variable's predetermined data-sharing attributes. 3381 DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false); 3382 if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_private) { 3383 Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind) 3384 << getOpenMPClauseName(OMPC_private); 3385 ReportOriginalDSA(*this, DSAStack, VD, DVar); 3386 continue; 3387 } 3388 3389 DSAStack->addDSA(VD, DE, OMPC_private); 3390 Vars.push_back(DE); 3391 } 3392 3393 if (Vars.empty()) 3394 return nullptr; 3395 3396 return OMPPrivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars); 3397 } 3398 3399 OMPClause *Sema::ActOnOpenMPFirstprivateClause(ArrayRef<Expr *> VarList, 3400 SourceLocation StartLoc, 3401 SourceLocation LParenLoc, 3402 SourceLocation EndLoc) { 3403 SmallVector<Expr *, 8> Vars; 3404 bool IsImplicitClause = 3405 StartLoc.isInvalid() && LParenLoc.isInvalid() && EndLoc.isInvalid(); 3406 auto ImplicitClauseLoc = DSAStack->getConstructLoc(); 3407 3408 for (auto &RefExpr : VarList) { 3409 assert(RefExpr && "NULL expr in OpenMP firstprivate clause."); 3410 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 3411 // It will be analyzed later. 3412 Vars.push_back(RefExpr); 3413 continue; 3414 } 3415 3416 SourceLocation ELoc = IsImplicitClause ? ImplicitClauseLoc 3417 : RefExpr->getExprLoc(); 3418 // OpenMP [2.1, C/C++] 3419 // A list item is a variable name. 3420 // OpenMP [2.9.3.3, Restrictions, p.1] 3421 // A variable that is part of another variable (as an array or 3422 // structure element) cannot appear in a private clause. 3423 DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr); 3424 if (!DE || !isa<VarDecl>(DE->getDecl())) { 3425 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 3426 continue; 3427 } 3428 Decl *D = DE->getDecl(); 3429 VarDecl *VD = cast<VarDecl>(D); 3430 3431 QualType Type = VD->getType(); 3432 if (Type->isDependentType() || Type->isInstantiationDependentType()) { 3433 // It will be analyzed later. 3434 Vars.push_back(DE); 3435 continue; 3436 } 3437 3438 // OpenMP [2.9.3.3, Restrictions, C/C++, p.3] 3439 // A variable that appears in a private clause must not have an incomplete 3440 // type or a reference type. 3441 if (RequireCompleteType(ELoc, Type, 3442 diag::err_omp_firstprivate_incomplete_type)) { 3443 continue; 3444 } 3445 if (Type->isReferenceType()) { 3446 if (IsImplicitClause) { 3447 Diag(ImplicitClauseLoc, 3448 diag::err_omp_task_predetermined_firstprivate_ref_type_arg) 3449 << Type; 3450 Diag(RefExpr->getExprLoc(), diag::note_used_here); 3451 } else { 3452 Diag(ELoc, diag::err_omp_clause_ref_type_arg) 3453 << getOpenMPClauseName(OMPC_firstprivate) << Type; 3454 } 3455 bool IsDecl = 3456 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 3457 Diag(VD->getLocation(), 3458 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3459 << VD; 3460 continue; 3461 } 3462 3463 // OpenMP [2.9.3.4, Restrictions, C/C++, p.1] 3464 // A variable of class type (or array thereof) that appears in a private 3465 // clause requires an accessible, unambiguous copy constructor for the 3466 // class type. 3467 Type = Context.getBaseElementType(Type); 3468 CXXRecordDecl *RD = getLangOpts().CPlusPlus 3469 ? Type.getNonReferenceType()->getAsCXXRecordDecl() 3470 : nullptr; 3471 // FIXME This code must be replaced by actual constructing/destructing of 3472 // the firstprivate variable. 3473 if (RD) { 3474 CXXConstructorDecl *CD = LookupCopyingConstructor(RD, 0); 3475 PartialDiagnostic PD = 3476 PartialDiagnostic(PartialDiagnostic::NullDiagnostic()); 3477 if (!CD || 3478 CheckConstructorAccess(ELoc, CD, 3479 InitializedEntity::InitializeTemporary(Type), 3480 CD->getAccess(), PD) == AR_inaccessible || 3481 CD->isDeleted()) { 3482 if (IsImplicitClause) { 3483 Diag(ImplicitClauseLoc, 3484 diag::err_omp_task_predetermined_firstprivate_required_method) 3485 << 0; 3486 Diag(RefExpr->getExprLoc(), diag::note_used_here); 3487 } else { 3488 Diag(ELoc, diag::err_omp_required_method) 3489 << getOpenMPClauseName(OMPC_firstprivate) << 1; 3490 } 3491 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 3492 VarDecl::DeclarationOnly; 3493 Diag(VD->getLocation(), 3494 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3495 << VD; 3496 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 3497 continue; 3498 } 3499 MarkFunctionReferenced(ELoc, CD); 3500 DiagnoseUseOfDecl(CD, ELoc); 3501 3502 CXXDestructorDecl *DD = RD->getDestructor(); 3503 if (DD) { 3504 if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible || 3505 DD->isDeleted()) { 3506 if (IsImplicitClause) { 3507 Diag(ImplicitClauseLoc, 3508 diag::err_omp_task_predetermined_firstprivate_required_method) 3509 << 1; 3510 Diag(RefExpr->getExprLoc(), diag::note_used_here); 3511 } else { 3512 Diag(ELoc, diag::err_omp_required_method) 3513 << getOpenMPClauseName(OMPC_firstprivate) << 4; 3514 } 3515 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 3516 VarDecl::DeclarationOnly; 3517 Diag(VD->getLocation(), 3518 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3519 << VD; 3520 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 3521 continue; 3522 } 3523 MarkFunctionReferenced(ELoc, DD); 3524 DiagnoseUseOfDecl(DD, ELoc); 3525 } 3526 } 3527 3528 // If an implicit firstprivate variable found it was checked already. 3529 if (!IsImplicitClause) { 3530 DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false); 3531 Type = Type.getNonReferenceType().getCanonicalType(); 3532 bool IsConstant = Type.isConstant(Context); 3533 Type = Context.getBaseElementType(Type); 3534 // OpenMP [2.4.13, Data-sharing Attribute Clauses] 3535 // A list item that specifies a given variable may not appear in more 3536 // than one clause on the same directive, except that a variable may be 3537 // specified in both firstprivate and lastprivate clauses. 3538 if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_firstprivate && 3539 DVar.CKind != OMPC_lastprivate && DVar.RefExpr) { 3540 Diag(ELoc, diag::err_omp_wrong_dsa) 3541 << getOpenMPClauseName(DVar.CKind) 3542 << getOpenMPClauseName(OMPC_firstprivate); 3543 ReportOriginalDSA(*this, DSAStack, VD, DVar); 3544 continue; 3545 } 3546 3547 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 3548 // in a Construct] 3549 // Variables with the predetermined data-sharing attributes may not be 3550 // listed in data-sharing attributes clauses, except for the cases 3551 // listed below. For these exceptions only, listing a predetermined 3552 // variable in a data-sharing attribute clause is allowed and overrides 3553 // the variable's predetermined data-sharing attributes. 3554 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 3555 // in a Construct, C/C++, p.2] 3556 // Variables with const-qualified type having no mutable member may be 3557 // listed in a firstprivate clause, even if they are static data members. 3558 if (!(IsConstant || VD->isStaticDataMember()) && !DVar.RefExpr && 3559 DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_shared) { 3560 Diag(ELoc, diag::err_omp_wrong_dsa) 3561 << getOpenMPClauseName(DVar.CKind) 3562 << getOpenMPClauseName(OMPC_firstprivate); 3563 ReportOriginalDSA(*this, DSAStack, VD, DVar); 3564 continue; 3565 } 3566 3567 OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective(); 3568 // OpenMP [2.9.3.4, Restrictions, p.2] 3569 // A list item that is private within a parallel region must not appear 3570 // in a firstprivate clause on a worksharing construct if any of the 3571 // worksharing regions arising from the worksharing construct ever bind 3572 // to any of the parallel regions arising from the parallel construct. 3573 if (isOpenMPWorksharingDirective(CurrDir) && 3574 !isOpenMPParallelDirective(CurrDir)) { 3575 DVar = DSAStack->getImplicitDSA(VD, true); 3576 if (DVar.CKind != OMPC_shared && 3577 (isOpenMPParallelDirective(DVar.DKind) || 3578 DVar.DKind == OMPD_unknown)) { 3579 Diag(ELoc, diag::err_omp_required_access) 3580 << getOpenMPClauseName(OMPC_firstprivate) 3581 << getOpenMPClauseName(OMPC_shared); 3582 ReportOriginalDSA(*this, DSAStack, VD, DVar); 3583 continue; 3584 } 3585 } 3586 // OpenMP [2.9.3.4, Restrictions, p.3] 3587 // A list item that appears in a reduction clause of a parallel construct 3588 // must not appear in a firstprivate clause on a worksharing or task 3589 // construct if any of the worksharing or task regions arising from the 3590 // worksharing or task construct ever bind to any of the parallel regions 3591 // arising from the parallel construct. 3592 // OpenMP [2.9.3.4, Restrictions, p.4] 3593 // A list item that appears in a reduction clause in worksharing 3594 // construct must not appear in a firstprivate clause in a task construct 3595 // encountered during execution of any of the worksharing regions arising 3596 // from the worksharing construct. 3597 if (CurrDir == OMPD_task) { 3598 DVar = 3599 DSAStack->hasInnermostDSA(VD, MatchesAnyClause(OMPC_reduction), 3600 [](OpenMPDirectiveKind K) -> bool { 3601 return isOpenMPParallelDirective(K) || 3602 isOpenMPWorksharingDirective(K); 3603 }, 3604 false); 3605 if (DVar.CKind == OMPC_reduction && 3606 (isOpenMPParallelDirective(DVar.DKind) || 3607 isOpenMPWorksharingDirective(DVar.DKind))) { 3608 Diag(ELoc, diag::err_omp_parallel_reduction_in_task_firstprivate) 3609 << getOpenMPDirectiveName(DVar.DKind); 3610 ReportOriginalDSA(*this, DSAStack, VD, DVar); 3611 continue; 3612 } 3613 } 3614 } 3615 3616 DSAStack->addDSA(VD, DE, OMPC_firstprivate); 3617 Vars.push_back(DE); 3618 } 3619 3620 if (Vars.empty()) 3621 return nullptr; 3622 3623 return OMPFirstprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, 3624 Vars); 3625 } 3626 3627 OMPClause *Sema::ActOnOpenMPLastprivateClause(ArrayRef<Expr *> VarList, 3628 SourceLocation StartLoc, 3629 SourceLocation LParenLoc, 3630 SourceLocation EndLoc) { 3631 SmallVector<Expr *, 8> Vars; 3632 for (auto &RefExpr : VarList) { 3633 assert(RefExpr && "NULL expr in OpenMP lastprivate clause."); 3634 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 3635 // It will be analyzed later. 3636 Vars.push_back(RefExpr); 3637 continue; 3638 } 3639 3640 SourceLocation ELoc = RefExpr->getExprLoc(); 3641 // OpenMP [2.1, C/C++] 3642 // A list item is a variable name. 3643 // OpenMP [2.14.3.5, Restrictions, p.1] 3644 // A variable that is part of another variable (as an array or structure 3645 // element) cannot appear in a lastprivate clause. 3646 DeclRefExpr *DE = dyn_cast_or_null<DeclRefExpr>(RefExpr); 3647 if (!DE || !isa<VarDecl>(DE->getDecl())) { 3648 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 3649 continue; 3650 } 3651 Decl *D = DE->getDecl(); 3652 VarDecl *VD = cast<VarDecl>(D); 3653 3654 QualType Type = VD->getType(); 3655 if (Type->isDependentType() || Type->isInstantiationDependentType()) { 3656 // It will be analyzed later. 3657 Vars.push_back(DE); 3658 continue; 3659 } 3660 3661 // OpenMP [2.14.3.5, Restrictions, C/C++, p.2] 3662 // A variable that appears in a lastprivate clause must not have an 3663 // incomplete type or a reference type. 3664 if (RequireCompleteType(ELoc, Type, 3665 diag::err_omp_lastprivate_incomplete_type)) { 3666 continue; 3667 } 3668 if (Type->isReferenceType()) { 3669 Diag(ELoc, diag::err_omp_clause_ref_type_arg) 3670 << getOpenMPClauseName(OMPC_lastprivate) << Type; 3671 bool IsDecl = 3672 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 3673 Diag(VD->getLocation(), 3674 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3675 << VD; 3676 continue; 3677 } 3678 3679 // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced 3680 // in a Construct] 3681 // Variables with the predetermined data-sharing attributes may not be 3682 // listed in data-sharing attributes clauses, except for the cases 3683 // listed below. 3684 DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false); 3685 if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_lastprivate && 3686 DVar.CKind != OMPC_firstprivate && 3687 (DVar.CKind != OMPC_private || DVar.RefExpr != nullptr)) { 3688 Diag(ELoc, diag::err_omp_wrong_dsa) 3689 << getOpenMPClauseName(DVar.CKind) 3690 << getOpenMPClauseName(OMPC_lastprivate); 3691 ReportOriginalDSA(*this, DSAStack, VD, DVar); 3692 continue; 3693 } 3694 3695 OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective(); 3696 // OpenMP [2.14.3.5, Restrictions, p.2] 3697 // A list item that is private within a parallel region, or that appears in 3698 // the reduction clause of a parallel construct, must not appear in a 3699 // lastprivate clause on a worksharing construct if any of the corresponding 3700 // worksharing regions ever binds to any of the corresponding parallel 3701 // regions. 3702 if (isOpenMPWorksharingDirective(CurrDir) && 3703 !isOpenMPParallelDirective(CurrDir)) { 3704 DVar = DSAStack->getImplicitDSA(VD, true); 3705 if (DVar.CKind != OMPC_shared) { 3706 Diag(ELoc, diag::err_omp_required_access) 3707 << getOpenMPClauseName(OMPC_lastprivate) 3708 << getOpenMPClauseName(OMPC_shared); 3709 ReportOriginalDSA(*this, DSAStack, VD, DVar); 3710 continue; 3711 } 3712 } 3713 // OpenMP [2.14.3.5, Restrictions, C++, p.1,2] 3714 // A variable of class type (or array thereof) that appears in a 3715 // lastprivate clause requires an accessible, unambiguous default 3716 // constructor for the class type, unless the list item is also specified 3717 // in a firstprivate clause. 3718 // A variable of class type (or array thereof) that appears in a 3719 // lastprivate clause requires an accessible, unambiguous copy assignment 3720 // operator for the class type. 3721 while (Type.getNonReferenceType()->isArrayType()) 3722 Type = cast<ArrayType>(Type.getNonReferenceType().getTypePtr()) 3723 ->getElementType(); 3724 CXXRecordDecl *RD = getLangOpts().CPlusPlus 3725 ? Type.getNonReferenceType()->getAsCXXRecordDecl() 3726 : nullptr; 3727 // FIXME This code must be replaced by actual copying and destructing of the 3728 // lastprivate variable. 3729 if (RD) { 3730 CXXMethodDecl *MD = LookupCopyingAssignment(RD, 0, false, 0); 3731 DeclAccessPair FoundDecl = DeclAccessPair::make(MD, MD->getAccess()); 3732 if (MD) { 3733 if (CheckMemberAccess(ELoc, RD, FoundDecl) == AR_inaccessible || 3734 MD->isDeleted()) { 3735 Diag(ELoc, diag::err_omp_required_method) 3736 << getOpenMPClauseName(OMPC_lastprivate) << 2; 3737 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 3738 VarDecl::DeclarationOnly; 3739 Diag(VD->getLocation(), 3740 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3741 << VD; 3742 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 3743 continue; 3744 } 3745 MarkFunctionReferenced(ELoc, MD); 3746 DiagnoseUseOfDecl(MD, ELoc); 3747 } 3748 3749 CXXDestructorDecl *DD = RD->getDestructor(); 3750 if (DD) { 3751 PartialDiagnostic PD = 3752 PartialDiagnostic(PartialDiagnostic::NullDiagnostic()); 3753 if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible || 3754 DD->isDeleted()) { 3755 Diag(ELoc, diag::err_omp_required_method) 3756 << getOpenMPClauseName(OMPC_lastprivate) << 4; 3757 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 3758 VarDecl::DeclarationOnly; 3759 Diag(VD->getLocation(), 3760 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3761 << VD; 3762 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 3763 continue; 3764 } 3765 MarkFunctionReferenced(ELoc, DD); 3766 DiagnoseUseOfDecl(DD, ELoc); 3767 } 3768 } 3769 3770 if (DVar.CKind != OMPC_firstprivate) 3771 DSAStack->addDSA(VD, DE, OMPC_lastprivate); 3772 Vars.push_back(DE); 3773 } 3774 3775 if (Vars.empty()) 3776 return nullptr; 3777 3778 return OMPLastprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, 3779 Vars); 3780 } 3781 3782 OMPClause *Sema::ActOnOpenMPSharedClause(ArrayRef<Expr *> VarList, 3783 SourceLocation StartLoc, 3784 SourceLocation LParenLoc, 3785 SourceLocation EndLoc) { 3786 SmallVector<Expr *, 8> Vars; 3787 for (auto &RefExpr : VarList) { 3788 assert(RefExpr && "NULL expr in OpenMP shared clause."); 3789 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 3790 // It will be analyzed later. 3791 Vars.push_back(RefExpr); 3792 continue; 3793 } 3794 3795 SourceLocation ELoc = RefExpr->getExprLoc(); 3796 // OpenMP [2.1, C/C++] 3797 // A list item is a variable name. 3798 // OpenMP [2.14.3.2, Restrictions, p.1] 3799 // A variable that is part of another variable (as an array or structure 3800 // element) cannot appear in a shared unless it is a static data member 3801 // of a C++ class. 3802 DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr); 3803 if (!DE || !isa<VarDecl>(DE->getDecl())) { 3804 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 3805 continue; 3806 } 3807 Decl *D = DE->getDecl(); 3808 VarDecl *VD = cast<VarDecl>(D); 3809 3810 QualType Type = VD->getType(); 3811 if (Type->isDependentType() || Type->isInstantiationDependentType()) { 3812 // It will be analyzed later. 3813 Vars.push_back(DE); 3814 continue; 3815 } 3816 3817 // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced 3818 // in a Construct] 3819 // Variables with the predetermined data-sharing attributes may not be 3820 // listed in data-sharing attributes clauses, except for the cases 3821 // listed below. For these exceptions only, listing a predetermined 3822 // variable in a data-sharing attribute clause is allowed and overrides 3823 // the variable's predetermined data-sharing attributes. 3824 DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false); 3825 if (DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_shared && 3826 DVar.RefExpr) { 3827 Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind) 3828 << getOpenMPClauseName(OMPC_shared); 3829 ReportOriginalDSA(*this, DSAStack, VD, DVar); 3830 continue; 3831 } 3832 3833 DSAStack->addDSA(VD, DE, OMPC_shared); 3834 Vars.push_back(DE); 3835 } 3836 3837 if (Vars.empty()) 3838 return nullptr; 3839 3840 return OMPSharedClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars); 3841 } 3842 3843 namespace { 3844 class DSARefChecker : public StmtVisitor<DSARefChecker, bool> { 3845 DSAStackTy *Stack; 3846 3847 public: 3848 bool VisitDeclRefExpr(DeclRefExpr *E) { 3849 if (VarDecl *VD = dyn_cast<VarDecl>(E->getDecl())) { 3850 DSAStackTy::DSAVarData DVar = Stack->getTopDSA(VD, false); 3851 if (DVar.CKind == OMPC_shared && !DVar.RefExpr) 3852 return false; 3853 if (DVar.CKind != OMPC_unknown) 3854 return true; 3855 DSAStackTy::DSAVarData DVarPrivate = 3856 Stack->hasDSA(VD, isOpenMPPrivate, MatchesAlways(), false); 3857 if (DVarPrivate.CKind != OMPC_unknown) 3858 return true; 3859 return false; 3860 } 3861 return false; 3862 } 3863 bool VisitStmt(Stmt *S) { 3864 for (auto Child : S->children()) { 3865 if (Child && Visit(Child)) 3866 return true; 3867 } 3868 return false; 3869 } 3870 explicit DSARefChecker(DSAStackTy *S) : Stack(S) {} 3871 }; 3872 } // namespace 3873 3874 OMPClause *Sema::ActOnOpenMPReductionClause( 3875 ArrayRef<Expr *> VarList, SourceLocation StartLoc, SourceLocation LParenLoc, 3876 SourceLocation ColonLoc, SourceLocation EndLoc, 3877 CXXScopeSpec &ReductionIdScopeSpec, 3878 const DeclarationNameInfo &ReductionId) { 3879 // TODO: Allow scope specification search when 'declare reduction' is 3880 // supported. 3881 assert(ReductionIdScopeSpec.isEmpty() && 3882 "No support for scoped reduction identifiers yet."); 3883 3884 auto DN = ReductionId.getName(); 3885 auto OOK = DN.getCXXOverloadedOperator(); 3886 BinaryOperatorKind BOK = BO_Comma; 3887 3888 // OpenMP [2.14.3.6, reduction clause] 3889 // C 3890 // reduction-identifier is either an identifier or one of the following 3891 // operators: +, -, *, &, |, ^, && and || 3892 // C++ 3893 // reduction-identifier is either an id-expression or one of the following 3894 // operators: +, -, *, &, |, ^, && and || 3895 // FIXME: Only 'min' and 'max' identifiers are supported for now. 3896 switch (OOK) { 3897 case OO_Plus: 3898 case OO_Minus: 3899 BOK = BO_AddAssign; 3900 break; 3901 case OO_Star: 3902 BOK = BO_MulAssign; 3903 break; 3904 case OO_Amp: 3905 BOK = BO_AndAssign; 3906 break; 3907 case OO_Pipe: 3908 BOK = BO_OrAssign; 3909 break; 3910 case OO_Caret: 3911 BOK = BO_XorAssign; 3912 break; 3913 case OO_AmpAmp: 3914 BOK = BO_LAnd; 3915 break; 3916 case OO_PipePipe: 3917 BOK = BO_LOr; 3918 break; 3919 default: 3920 if (auto II = DN.getAsIdentifierInfo()) { 3921 if (II->isStr("max")) 3922 BOK = BO_GT; 3923 else if (II->isStr("min")) 3924 BOK = BO_LT; 3925 } 3926 break; 3927 } 3928 SourceRange ReductionIdRange; 3929 if (ReductionIdScopeSpec.isValid()) { 3930 ReductionIdRange.setBegin(ReductionIdScopeSpec.getBeginLoc()); 3931 } 3932 ReductionIdRange.setEnd(ReductionId.getEndLoc()); 3933 if (BOK == BO_Comma) { 3934 // Not allowed reduction identifier is found. 3935 Diag(ReductionId.getLocStart(), diag::err_omp_unknown_reduction_identifier) 3936 << ReductionIdRange; 3937 return nullptr; 3938 } 3939 3940 SmallVector<Expr *, 8> Vars; 3941 for (auto RefExpr : VarList) { 3942 assert(RefExpr && "nullptr expr in OpenMP reduction clause."); 3943 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 3944 // It will be analyzed later. 3945 Vars.push_back(RefExpr); 3946 continue; 3947 } 3948 3949 if (RefExpr->isTypeDependent() || RefExpr->isValueDependent() || 3950 RefExpr->isInstantiationDependent() || 3951 RefExpr->containsUnexpandedParameterPack()) { 3952 // It will be analyzed later. 3953 Vars.push_back(RefExpr); 3954 continue; 3955 } 3956 3957 auto ELoc = RefExpr->getExprLoc(); 3958 auto ERange = RefExpr->getSourceRange(); 3959 // OpenMP [2.1, C/C++] 3960 // A list item is a variable or array section, subject to the restrictions 3961 // specified in Section 2.4 on page 42 and in each of the sections 3962 // describing clauses and directives for which a list appears. 3963 // OpenMP [2.14.3.3, Restrictions, p.1] 3964 // A variable that is part of another variable (as an array or 3965 // structure element) cannot appear in a private clause. 3966 auto DE = dyn_cast<DeclRefExpr>(RefExpr); 3967 if (!DE || !isa<VarDecl>(DE->getDecl())) { 3968 Diag(ELoc, diag::err_omp_expected_var_name) << ERange; 3969 continue; 3970 } 3971 auto D = DE->getDecl(); 3972 auto VD = cast<VarDecl>(D); 3973 auto Type = VD->getType(); 3974 // OpenMP [2.9.3.3, Restrictions, C/C++, p.3] 3975 // A variable that appears in a private clause must not have an incomplete 3976 // type or a reference type. 3977 if (RequireCompleteType(ELoc, Type, 3978 diag::err_omp_reduction_incomplete_type)) 3979 continue; 3980 // OpenMP [2.14.3.6, reduction clause, Restrictions] 3981 // Arrays may not appear in a reduction clause. 3982 if (Type.getNonReferenceType()->isArrayType()) { 3983 Diag(ELoc, diag::err_omp_reduction_type_array) << Type << ERange; 3984 bool IsDecl = 3985 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 3986 Diag(VD->getLocation(), 3987 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 3988 << VD; 3989 continue; 3990 } 3991 // OpenMP [2.14.3.6, reduction clause, Restrictions] 3992 // A list item that appears in a reduction clause must not be 3993 // const-qualified. 3994 if (Type.getNonReferenceType().isConstant(Context)) { 3995 Diag(ELoc, diag::err_omp_const_variable) 3996 << getOpenMPClauseName(OMPC_reduction) << Type << ERange; 3997 bool IsDecl = 3998 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 3999 Diag(VD->getLocation(), 4000 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4001 << VD; 4002 continue; 4003 } 4004 // OpenMP [2.9.3.6, Restrictions, C/C++, p.4] 4005 // If a list-item is a reference type then it must bind to the same object 4006 // for all threads of the team. 4007 VarDecl *VDDef = VD->getDefinition(); 4008 if (Type->isReferenceType() && VDDef) { 4009 DSARefChecker Check(DSAStack); 4010 if (Check.Visit(VDDef->getInit())) { 4011 Diag(ELoc, diag::err_omp_reduction_ref_type_arg) << ERange; 4012 Diag(VDDef->getLocation(), diag::note_defined_here) << VDDef; 4013 continue; 4014 } 4015 } 4016 // OpenMP [2.14.3.6, reduction clause, Restrictions] 4017 // The type of a list item that appears in a reduction clause must be valid 4018 // for the reduction-identifier. For a max or min reduction in C, the type 4019 // of the list item must be an allowed arithmetic data type: char, int, 4020 // float, double, or _Bool, possibly modified with long, short, signed, or 4021 // unsigned. For a max or min reduction in C++, the type of the list item 4022 // must be an allowed arithmetic data type: char, wchar_t, int, float, 4023 // double, or bool, possibly modified with long, short, signed, or unsigned. 4024 if ((BOK == BO_GT || BOK == BO_LT) && 4025 !(Type->isScalarType() || 4026 (getLangOpts().CPlusPlus && Type->isArithmeticType()))) { 4027 Diag(ELoc, diag::err_omp_clause_not_arithmetic_type_arg) 4028 << getLangOpts().CPlusPlus; 4029 bool IsDecl = 4030 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4031 Diag(VD->getLocation(), 4032 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4033 << VD; 4034 continue; 4035 } 4036 if ((BOK == BO_OrAssign || BOK == BO_AndAssign || BOK == BO_XorAssign) && 4037 !getLangOpts().CPlusPlus && Type->isFloatingType()) { 4038 Diag(ELoc, diag::err_omp_clause_floating_type_arg); 4039 bool IsDecl = 4040 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4041 Diag(VD->getLocation(), 4042 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4043 << VD; 4044 continue; 4045 } 4046 bool Suppress = getDiagnostics().getSuppressAllDiagnostics(); 4047 getDiagnostics().setSuppressAllDiagnostics(true); 4048 ExprResult ReductionOp = 4049 BuildBinOp(DSAStack->getCurScope(), ReductionId.getLocStart(), BOK, 4050 RefExpr, RefExpr); 4051 getDiagnostics().setSuppressAllDiagnostics(Suppress); 4052 if (ReductionOp.isInvalid()) { 4053 Diag(ELoc, diag::err_omp_reduction_id_not_compatible) << Type 4054 << ReductionIdRange; 4055 bool IsDecl = 4056 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4057 Diag(VD->getLocation(), 4058 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4059 << VD; 4060 continue; 4061 } 4062 4063 // OpenMP [2.14.1.1, Data-sharing Attribute Rules for Variables Referenced 4064 // in a Construct] 4065 // Variables with the predetermined data-sharing attributes may not be 4066 // listed in data-sharing attributes clauses, except for the cases 4067 // listed below. For these exceptions only, listing a predetermined 4068 // variable in a data-sharing attribute clause is allowed and overrides 4069 // the variable's predetermined data-sharing attributes. 4070 // OpenMP [2.14.3.6, Restrictions, p.3] 4071 // Any number of reduction clauses can be specified on the directive, 4072 // but a list item can appear only once in the reduction clauses for that 4073 // directive. 4074 DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false); 4075 if (DVar.CKind == OMPC_reduction) { 4076 Diag(ELoc, diag::err_omp_once_referenced) 4077 << getOpenMPClauseName(OMPC_reduction); 4078 if (DVar.RefExpr) { 4079 Diag(DVar.RefExpr->getExprLoc(), diag::note_omp_referenced); 4080 } 4081 } else if (DVar.CKind != OMPC_unknown) { 4082 Diag(ELoc, diag::err_omp_wrong_dsa) 4083 << getOpenMPClauseName(DVar.CKind) 4084 << getOpenMPClauseName(OMPC_reduction); 4085 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4086 continue; 4087 } 4088 4089 // OpenMP [2.14.3.6, Restrictions, p.1] 4090 // A list item that appears in a reduction clause of a worksharing 4091 // construct must be shared in the parallel regions to which any of the 4092 // worksharing regions arising from the worksharing construct bind. 4093 OpenMPDirectiveKind CurrDir = DSAStack->getCurrentDirective(); 4094 if (isOpenMPWorksharingDirective(CurrDir) && 4095 !isOpenMPParallelDirective(CurrDir)) { 4096 DVar = DSAStack->getImplicitDSA(VD, true); 4097 if (DVar.CKind != OMPC_shared) { 4098 Diag(ELoc, diag::err_omp_required_access) 4099 << getOpenMPClauseName(OMPC_reduction) 4100 << getOpenMPClauseName(OMPC_shared); 4101 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4102 continue; 4103 } 4104 } 4105 4106 CXXRecordDecl *RD = getLangOpts().CPlusPlus 4107 ? Type.getNonReferenceType()->getAsCXXRecordDecl() 4108 : nullptr; 4109 // FIXME This code must be replaced by actual constructing/destructing of 4110 // the reduction variable. 4111 if (RD) { 4112 CXXConstructorDecl *CD = LookupDefaultConstructor(RD); 4113 PartialDiagnostic PD = 4114 PartialDiagnostic(PartialDiagnostic::NullDiagnostic()); 4115 if (!CD || 4116 CheckConstructorAccess(ELoc, CD, 4117 InitializedEntity::InitializeTemporary(Type), 4118 CD->getAccess(), PD) == AR_inaccessible || 4119 CD->isDeleted()) { 4120 Diag(ELoc, diag::err_omp_required_method) 4121 << getOpenMPClauseName(OMPC_reduction) << 0; 4122 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 4123 VarDecl::DeclarationOnly; 4124 Diag(VD->getLocation(), 4125 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4126 << VD; 4127 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 4128 continue; 4129 } 4130 MarkFunctionReferenced(ELoc, CD); 4131 DiagnoseUseOfDecl(CD, ELoc); 4132 4133 CXXDestructorDecl *DD = RD->getDestructor(); 4134 if (DD) { 4135 if (CheckDestructorAccess(ELoc, DD, PD) == AR_inaccessible || 4136 DD->isDeleted()) { 4137 Diag(ELoc, diag::err_omp_required_method) 4138 << getOpenMPClauseName(OMPC_reduction) << 4; 4139 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 4140 VarDecl::DeclarationOnly; 4141 Diag(VD->getLocation(), 4142 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4143 << VD; 4144 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 4145 continue; 4146 } 4147 MarkFunctionReferenced(ELoc, DD); 4148 DiagnoseUseOfDecl(DD, ELoc); 4149 } 4150 } 4151 4152 DSAStack->addDSA(VD, DE, OMPC_reduction); 4153 Vars.push_back(DE); 4154 } 4155 4156 if (Vars.empty()) 4157 return nullptr; 4158 4159 return OMPReductionClause::Create( 4160 Context, StartLoc, LParenLoc, ColonLoc, EndLoc, Vars, 4161 ReductionIdScopeSpec.getWithLocInContext(Context), ReductionId); 4162 } 4163 4164 OMPClause *Sema::ActOnOpenMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step, 4165 SourceLocation StartLoc, 4166 SourceLocation LParenLoc, 4167 SourceLocation ColonLoc, 4168 SourceLocation EndLoc) { 4169 SmallVector<Expr *, 8> Vars; 4170 for (auto &RefExpr : VarList) { 4171 assert(RefExpr && "NULL expr in OpenMP linear clause."); 4172 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 4173 // It will be analyzed later. 4174 Vars.push_back(RefExpr); 4175 continue; 4176 } 4177 4178 // OpenMP [2.14.3.7, linear clause] 4179 // A list item that appears in a linear clause is subject to the private 4180 // clause semantics described in Section 2.14.3.3 on page 159 except as 4181 // noted. In addition, the value of the new list item on each iteration 4182 // of the associated loop(s) corresponds to the value of the original 4183 // list item before entering the construct plus the logical number of 4184 // the iteration times linear-step. 4185 4186 SourceLocation ELoc = RefExpr->getExprLoc(); 4187 // OpenMP [2.1, C/C++] 4188 // A list item is a variable name. 4189 // OpenMP [2.14.3.3, Restrictions, p.1] 4190 // A variable that is part of another variable (as an array or 4191 // structure element) cannot appear in a private clause. 4192 DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr); 4193 if (!DE || !isa<VarDecl>(DE->getDecl())) { 4194 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 4195 continue; 4196 } 4197 4198 VarDecl *VD = cast<VarDecl>(DE->getDecl()); 4199 4200 // OpenMP [2.14.3.7, linear clause] 4201 // A list-item cannot appear in more than one linear clause. 4202 // A list-item that appears in a linear clause cannot appear in any 4203 // other data-sharing attribute clause. 4204 DSAStackTy::DSAVarData DVar = DSAStack->getTopDSA(VD, false); 4205 if (DVar.RefExpr) { 4206 Diag(ELoc, diag::err_omp_wrong_dsa) << getOpenMPClauseName(DVar.CKind) 4207 << getOpenMPClauseName(OMPC_linear); 4208 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4209 continue; 4210 } 4211 4212 QualType QType = VD->getType(); 4213 if (QType->isDependentType() || QType->isInstantiationDependentType()) { 4214 // It will be analyzed later. 4215 Vars.push_back(DE); 4216 continue; 4217 } 4218 4219 // A variable must not have an incomplete type or a reference type. 4220 if (RequireCompleteType(ELoc, QType, 4221 diag::err_omp_linear_incomplete_type)) { 4222 continue; 4223 } 4224 if (QType->isReferenceType()) { 4225 Diag(ELoc, diag::err_omp_clause_ref_type_arg) 4226 << getOpenMPClauseName(OMPC_linear) << QType; 4227 bool IsDecl = 4228 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4229 Diag(VD->getLocation(), 4230 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4231 << VD; 4232 continue; 4233 } 4234 4235 // A list item must not be const-qualified. 4236 if (QType.isConstant(Context)) { 4237 Diag(ELoc, diag::err_omp_const_variable) 4238 << getOpenMPClauseName(OMPC_linear); 4239 bool IsDecl = 4240 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4241 Diag(VD->getLocation(), 4242 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4243 << VD; 4244 continue; 4245 } 4246 4247 // A list item must be of integral or pointer type. 4248 QType = QType.getUnqualifiedType().getCanonicalType(); 4249 const Type *Ty = QType.getTypePtrOrNull(); 4250 if (!Ty || (!Ty->isDependentType() && !Ty->isIntegralType(Context) && 4251 !Ty->isPointerType())) { 4252 Diag(ELoc, diag::err_omp_linear_expected_int_or_ptr) << QType; 4253 bool IsDecl = 4254 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4255 Diag(VD->getLocation(), 4256 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4257 << VD; 4258 continue; 4259 } 4260 4261 DSAStack->addDSA(VD, DE, OMPC_linear); 4262 Vars.push_back(DE); 4263 } 4264 4265 if (Vars.empty()) 4266 return nullptr; 4267 4268 Expr *StepExpr = Step; 4269 if (Step && !Step->isValueDependent() && !Step->isTypeDependent() && 4270 !Step->isInstantiationDependent() && 4271 !Step->containsUnexpandedParameterPack()) { 4272 SourceLocation StepLoc = Step->getLocStart(); 4273 ExprResult Val = PerformOpenMPImplicitIntegerConversion(StepLoc, Step); 4274 if (Val.isInvalid()) 4275 return nullptr; 4276 StepExpr = Val.get(); 4277 4278 // Warn about zero linear step (it would be probably better specified as 4279 // making corresponding variables 'const'). 4280 llvm::APSInt Result; 4281 if (StepExpr->isIntegerConstantExpr(Result, Context) && 4282 !Result.isNegative() && !Result.isStrictlyPositive()) 4283 Diag(StepLoc, diag::warn_omp_linear_step_zero) << Vars[0] 4284 << (Vars.size() > 1); 4285 } 4286 4287 return OMPLinearClause::Create(Context, StartLoc, LParenLoc, ColonLoc, EndLoc, 4288 Vars, StepExpr); 4289 } 4290 4291 OMPClause *Sema::ActOnOpenMPAlignedClause( 4292 ArrayRef<Expr *> VarList, Expr *Alignment, SourceLocation StartLoc, 4293 SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc) { 4294 4295 SmallVector<Expr *, 8> Vars; 4296 for (auto &RefExpr : VarList) { 4297 assert(RefExpr && "NULL expr in OpenMP aligned clause."); 4298 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 4299 // It will be analyzed later. 4300 Vars.push_back(RefExpr); 4301 continue; 4302 } 4303 4304 SourceLocation ELoc = RefExpr->getExprLoc(); 4305 // OpenMP [2.1, C/C++] 4306 // A list item is a variable name. 4307 DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr); 4308 if (!DE || !isa<VarDecl>(DE->getDecl())) { 4309 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 4310 continue; 4311 } 4312 4313 VarDecl *VD = cast<VarDecl>(DE->getDecl()); 4314 4315 // OpenMP [2.8.1, simd construct, Restrictions] 4316 // The type of list items appearing in the aligned clause must be 4317 // array, pointer, reference to array, or reference to pointer. 4318 QualType QType = DE->getType() 4319 .getNonReferenceType() 4320 .getUnqualifiedType() 4321 .getCanonicalType(); 4322 const Type *Ty = QType.getTypePtrOrNull(); 4323 if (!Ty || (!Ty->isDependentType() && !Ty->isArrayType() && 4324 !Ty->isPointerType())) { 4325 Diag(ELoc, diag::err_omp_aligned_expected_array_or_ptr) 4326 << QType << getLangOpts().CPlusPlus << RefExpr->getSourceRange(); 4327 bool IsDecl = 4328 VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly; 4329 Diag(VD->getLocation(), 4330 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4331 << VD; 4332 continue; 4333 } 4334 4335 // OpenMP [2.8.1, simd construct, Restrictions] 4336 // A list-item cannot appear in more than one aligned clause. 4337 if (DeclRefExpr *PrevRef = DSAStack->addUniqueAligned(VD, DE)) { 4338 Diag(ELoc, diag::err_omp_aligned_twice) << RefExpr->getSourceRange(); 4339 Diag(PrevRef->getExprLoc(), diag::note_omp_explicit_dsa) 4340 << getOpenMPClauseName(OMPC_aligned); 4341 continue; 4342 } 4343 4344 Vars.push_back(DE); 4345 } 4346 4347 // OpenMP [2.8.1, simd construct, Description] 4348 // The parameter of the aligned clause, alignment, must be a constant 4349 // positive integer expression. 4350 // If no optional parameter is specified, implementation-defined default 4351 // alignments for SIMD instructions on the target platforms are assumed. 4352 if (Alignment != nullptr) { 4353 ExprResult AlignResult = 4354 VerifyPositiveIntegerConstantInClause(Alignment, OMPC_aligned); 4355 if (AlignResult.isInvalid()) 4356 return nullptr; 4357 Alignment = AlignResult.get(); 4358 } 4359 if (Vars.empty()) 4360 return nullptr; 4361 4362 return OMPAlignedClause::Create(Context, StartLoc, LParenLoc, ColonLoc, 4363 EndLoc, Vars, Alignment); 4364 } 4365 4366 OMPClause *Sema::ActOnOpenMPCopyinClause(ArrayRef<Expr *> VarList, 4367 SourceLocation StartLoc, 4368 SourceLocation LParenLoc, 4369 SourceLocation EndLoc) { 4370 SmallVector<Expr *, 8> Vars; 4371 for (auto &RefExpr : VarList) { 4372 assert(RefExpr && "NULL expr in OpenMP copyin clause."); 4373 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 4374 // It will be analyzed later. 4375 Vars.push_back(RefExpr); 4376 continue; 4377 } 4378 4379 SourceLocation ELoc = RefExpr->getExprLoc(); 4380 // OpenMP [2.1, C/C++] 4381 // A list item is a variable name. 4382 // OpenMP [2.14.4.1, Restrictions, p.1] 4383 // A list item that appears in a copyin clause must be threadprivate. 4384 DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr); 4385 if (!DE || !isa<VarDecl>(DE->getDecl())) { 4386 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 4387 continue; 4388 } 4389 4390 Decl *D = DE->getDecl(); 4391 VarDecl *VD = cast<VarDecl>(D); 4392 4393 QualType Type = VD->getType(); 4394 if (Type->isDependentType() || Type->isInstantiationDependentType()) { 4395 // It will be analyzed later. 4396 Vars.push_back(DE); 4397 continue; 4398 } 4399 4400 // OpenMP [2.14.4.1, Restrictions, C/C++, p.1] 4401 // A list item that appears in a copyin clause must be threadprivate. 4402 if (!DSAStack->isThreadPrivate(VD)) { 4403 Diag(ELoc, diag::err_omp_required_access) 4404 << getOpenMPClauseName(OMPC_copyin) 4405 << getOpenMPDirectiveName(OMPD_threadprivate); 4406 continue; 4407 } 4408 4409 // OpenMP [2.14.4.1, Restrictions, C/C++, p.2] 4410 // A variable of class type (or array thereof) that appears in a 4411 // copyin clause requires an accessible, unambiguous copy assignment 4412 // operator for the class type. 4413 Type = Context.getBaseElementType(Type); 4414 CXXRecordDecl *RD = 4415 getLangOpts().CPlusPlus ? Type->getAsCXXRecordDecl() : nullptr; 4416 // FIXME This code must be replaced by actual assignment of the 4417 // threadprivate variable. 4418 if (RD) { 4419 CXXMethodDecl *MD = LookupCopyingAssignment(RD, 0, false, 0); 4420 DeclAccessPair FoundDecl = DeclAccessPair::make(MD, MD->getAccess()); 4421 if (MD) { 4422 if (CheckMemberAccess(ELoc, RD, FoundDecl) == AR_inaccessible || 4423 MD->isDeleted()) { 4424 Diag(ELoc, diag::err_omp_required_method) 4425 << getOpenMPClauseName(OMPC_copyin) << 2; 4426 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 4427 VarDecl::DeclarationOnly; 4428 Diag(VD->getLocation(), 4429 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4430 << VD; 4431 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 4432 continue; 4433 } 4434 MarkFunctionReferenced(ELoc, MD); 4435 DiagnoseUseOfDecl(MD, ELoc); 4436 } 4437 } 4438 4439 DSAStack->addDSA(VD, DE, OMPC_copyin); 4440 Vars.push_back(DE); 4441 } 4442 4443 if (Vars.empty()) 4444 return nullptr; 4445 4446 return OMPCopyinClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars); 4447 } 4448 4449 OMPClause *Sema::ActOnOpenMPCopyprivateClause(ArrayRef<Expr *> VarList, 4450 SourceLocation StartLoc, 4451 SourceLocation LParenLoc, 4452 SourceLocation EndLoc) { 4453 SmallVector<Expr *, 8> Vars; 4454 for (auto &RefExpr : VarList) { 4455 assert(RefExpr && "NULL expr in OpenMP copyprivate clause."); 4456 if (isa<DependentScopeDeclRefExpr>(RefExpr)) { 4457 // It will be analyzed later. 4458 Vars.push_back(RefExpr); 4459 continue; 4460 } 4461 4462 SourceLocation ELoc = RefExpr->getExprLoc(); 4463 // OpenMP [2.1, C/C++] 4464 // A list item is a variable name. 4465 // OpenMP [2.14.4.1, Restrictions, p.1] 4466 // A list item that appears in a copyin clause must be threadprivate. 4467 DeclRefExpr *DE = dyn_cast<DeclRefExpr>(RefExpr); 4468 if (!DE || !isa<VarDecl>(DE->getDecl())) { 4469 Diag(ELoc, diag::err_omp_expected_var_name) << RefExpr->getSourceRange(); 4470 continue; 4471 } 4472 4473 Decl *D = DE->getDecl(); 4474 VarDecl *VD = cast<VarDecl>(D); 4475 4476 QualType Type = VD->getType(); 4477 if (Type->isDependentType() || Type->isInstantiationDependentType()) { 4478 // It will be analyzed later. 4479 Vars.push_back(DE); 4480 continue; 4481 } 4482 4483 // OpenMP [2.14.4.2, Restrictions, p.2] 4484 // A list item that appears in a copyprivate clause may not appear in a 4485 // private or firstprivate clause on the single construct. 4486 if (!DSAStack->isThreadPrivate(VD)) { 4487 auto DVar = DSAStack->getTopDSA(VD, false); 4488 if (DVar.CKind != OMPC_copyprivate && DVar.CKind != OMPC_unknown && 4489 !(DVar.CKind == OMPC_private && !DVar.RefExpr)) { 4490 Diag(ELoc, diag::err_omp_wrong_dsa) 4491 << getOpenMPClauseName(DVar.CKind) 4492 << getOpenMPClauseName(OMPC_copyprivate); 4493 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4494 continue; 4495 } 4496 4497 // OpenMP [2.11.4.2, Restrictions, p.1] 4498 // All list items that appear in a copyprivate clause must be either 4499 // threadprivate or private in the enclosing context. 4500 if (DVar.CKind == OMPC_unknown) { 4501 DVar = DSAStack->getImplicitDSA(VD, false); 4502 if (DVar.CKind == OMPC_shared) { 4503 Diag(ELoc, diag::err_omp_required_access) 4504 << getOpenMPClauseName(OMPC_copyprivate) 4505 << "threadprivate or private in the enclosing context"; 4506 ReportOriginalDSA(*this, DSAStack, VD, DVar); 4507 continue; 4508 } 4509 } 4510 } 4511 4512 // OpenMP [2.14.4.1, Restrictions, C/C++, p.2] 4513 // A variable of class type (or array thereof) that appears in a 4514 // copyin clause requires an accessible, unambiguous copy assignment 4515 // operator for the class type. 4516 Type = Context.getBaseElementType(Type); 4517 CXXRecordDecl *RD = 4518 getLangOpts().CPlusPlus ? Type->getAsCXXRecordDecl() : nullptr; 4519 // FIXME This code must be replaced by actual assignment of the 4520 // threadprivate variable. 4521 if (RD) { 4522 CXXMethodDecl *MD = LookupCopyingAssignment(RD, 0, false, 0); 4523 DeclAccessPair FoundDecl = DeclAccessPair::make(MD, MD->getAccess()); 4524 if (MD) { 4525 if (CheckMemberAccess(ELoc, RD, FoundDecl) == AR_inaccessible || 4526 MD->isDeleted()) { 4527 Diag(ELoc, diag::err_omp_required_method) 4528 << getOpenMPClauseName(OMPC_copyprivate) << 2; 4529 bool IsDecl = VD->isThisDeclarationADefinition(Context) == 4530 VarDecl::DeclarationOnly; 4531 Diag(VD->getLocation(), 4532 IsDecl ? diag::note_previous_decl : diag::note_defined_here) 4533 << VD; 4534 Diag(RD->getLocation(), diag::note_previous_decl) << RD; 4535 continue; 4536 } 4537 MarkFunctionReferenced(ELoc, MD); 4538 DiagnoseUseOfDecl(MD, ELoc); 4539 } 4540 } 4541 4542 // No need to mark vars as copyprivate, they are already threadprivate or 4543 // implicitly private. 4544 Vars.push_back(DE); 4545 } 4546 4547 if (Vars.empty()) 4548 return nullptr; 4549 4550 return OMPCopyprivateClause::Create(Context, StartLoc, LParenLoc, EndLoc, Vars); 4551 } 4552 4553 OMPClause *Sema::ActOnOpenMPFlushClause(ArrayRef<Expr *> VarList, 4554 SourceLocation StartLoc, 4555 SourceLocation LParenLoc, 4556 SourceLocation EndLoc) { 4557 if (VarList.empty()) 4558 return nullptr; 4559 4560 return OMPFlushClause::Create(Context, StartLoc, LParenLoc, EndLoc, VarList); 4561 } 4562 4563