Author: rnk Date: Mon Mar 12 14:43:02 2018 New Revision: 327334 URL: http://llvm.org/viewvc/llvm-project?rev=327334&view=rev Log: Re-land "[Sema] Make getCurFunction() return null outside function parsing"
This relands r326965. There was a null dereference in typo correction that was triggered in Sema/diagnose_if.c. We are not always in a function scope when doing typo correction. The fix is to add a null check. LLVM's optimizer made it hard to find this bug. I wrote it up in a not-very-well-editted blog post here: http://qinsb.blogspot.com/2018/03/ub-will-delete-your-null-checks.html Modified: cfe/trunk/include/clang/Sema/Sema.h cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp cfe/trunk/lib/Sema/Sema.cpp cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/lib/Sema/SemaExprCXX.cpp cfe/trunk/lib/Sema/SemaLookup.cpp cfe/trunk/lib/Sema/SemaOpenMP.cpp cfe/trunk/lib/Sema/SemaStmt.cpp cfe/trunk/lib/Sema/SemaStmtAsm.cpp Modified: cfe/trunk/include/clang/Sema/Sema.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/Sema.h?rev=327334&r1=327333&r2=327334&view=diff ============================================================================== --- cfe/trunk/include/clang/Sema/Sema.h (original) +++ cfe/trunk/include/clang/Sema/Sema.h Mon Mar 12 14:43:02 2018 @@ -528,12 +528,10 @@ public: /// full expression. llvm::SmallPtrSet<Expr*, 2> MaybeODRUseExprs; + std::unique_ptr<sema::FunctionScopeInfo> PreallocatedFunctionScope; + /// \brief Stack containing information about each of the nested /// function, block, and method scopes that are currently active. - /// - /// This array is never empty. Clients should ignore the first - /// element, which is used to cache a single FunctionScopeInfo - /// that's used to parse every top-level function. SmallVector<sema::FunctionScopeInfo *, 4> FunctionScopes; typedef LazyVector<TypedefNameDecl *, ExternalSemaSource, @@ -1318,11 +1316,15 @@ public: const BlockExpr *blkExpr = nullptr); sema::FunctionScopeInfo *getCurFunction() const { - return FunctionScopes.back(); + return FunctionScopes.empty() ? nullptr : FunctionScopes.back(); } sema::FunctionScopeInfo *getEnclosingFunction() const; + void setFunctionHasBranchIntoScope(); + void setFunctionHasBranchProtectedScope(); + void setFunctionHasIndirectGoto(); + void PushCompoundScope(bool IsStmtExpr); void PopCompoundScope(); Modified: cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp?rev=327334&r1=327333&r2=327334&view=diff ============================================================================== --- cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp (original) +++ cfe/trunk/lib/Sema/AnalysisBasedWarnings.cpp Mon Mar 12 14:43:02 2018 @@ -632,18 +632,19 @@ struct CheckFallThroughDiagnostics { } // anonymous namespace -/// CheckFallThroughForFunctionDef - Check that we don't fall off the end of a +/// CheckFallThroughForBody - Check that we don't fall off the end of a /// function that should return a value. Check that we don't fall off the end /// of a noreturn function. We assume that functions and blocks not marked /// noreturn will return. static void CheckFallThroughForBody(Sema &S, const Decl *D, const Stmt *Body, const BlockExpr *blkExpr, - const CheckFallThroughDiagnostics& CD, - AnalysisDeclContext &AC) { + const CheckFallThroughDiagnostics &CD, + AnalysisDeclContext &AC, + sema::FunctionScopeInfo *FSI) { bool ReturnsVoid = false; bool HasNoReturn = false; - bool IsCoroutine = S.getCurFunction() && S.getCurFunction()->isCoroutine(); + bool IsCoroutine = FSI->isCoroutine(); if (const auto *FD = dyn_cast<FunctionDecl>(D)) { if (const auto *CBody = dyn_cast<CoroutineBodyStmt>(Body)) @@ -675,7 +676,7 @@ static void CheckFallThroughForBody(Sema SourceLocation LBrace = Body->getLocStart(), RBrace = Body->getLocEnd(); auto EmitDiag = [&](SourceLocation Loc, unsigned DiagID) { if (IsCoroutine) - S.Diag(Loc, DiagID) << S.getCurFunction()->CoroutinePromise->getType(); + S.Diag(Loc, DiagID) << FSI->CoroutinePromise->getType(); else S.Diag(Loc, DiagID); }; @@ -2143,7 +2144,7 @@ AnalysisBasedWarnings::IssueWarnings(sem : (fscope->isCoroutine() ? CheckFallThroughDiagnostics::MakeForCoroutine(D) : CheckFallThroughDiagnostics::MakeForFunction(D))); - CheckFallThroughForBody(S, D, Body, blkExpr, CD, AC); + CheckFallThroughForBody(S, D, Body, blkExpr, CD, AC, fscope); } // Warning: check for unreachable code Modified: cfe/trunk/lib/Sema/Sema.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=327334&r1=327333&r2=327334&view=diff ============================================================================== --- cfe/trunk/lib/Sema/Sema.cpp (original) +++ cfe/trunk/lib/Sema/Sema.cpp Mon Mar 12 14:43:02 2018 @@ -162,7 +162,7 @@ Sema::Sema(Preprocessor &pp, ASTContext ExpressionEvaluationContext::PotentiallyEvaluated, 0, CleanupInfo{}, nullptr, false); - FunctionScopes.push_back(new FunctionScopeInfo(Diags)); + PreallocatedFunctionScope.reset(new FunctionScopeInfo(Diags)); // Initilization of data sharing attributes stack for OpenMP InitDataSharingAttributesStack(); @@ -332,11 +332,11 @@ void Sema::Initialize() { Sema::~Sema() { if (VisContext) FreeVisContext(); + // Kill all the active scopes. - for (unsigned I = 1, E = FunctionScopes.size(); I != E; ++I) - delete FunctionScopes[I]; - if (FunctionScopes.size() == 1) - delete FunctionScopes[0]; + for (sema::FunctionScopeInfo *FSI : FunctionScopes) + if (FSI != PreallocatedFunctionScope.get()) + delete FSI; // Tell the SemaConsumer to forget about us; we're going out of scope. if (SemaConsumer *SC = dyn_cast<SemaConsumer>(&Consumer)) @@ -1340,17 +1340,13 @@ Scope *Sema::getScopeForContext(DeclCont /// \brief Enter a new function scope void Sema::PushFunctionScope() { - if (FunctionScopes.size() == 1) { - // Use the "top" function scope rather than having to allocate - // memory for a new scope. - FunctionScopes.back()->Clear(); - FunctionScopes.push_back(FunctionScopes.back()); - if (LangOpts.OpenMP) - pushOpenMPFunctionRegion(); - return; + if (FunctionScopes.empty()) { + // Use PreallocatedFunctionScope to avoid allocating memory when possible. + PreallocatedFunctionScope->Clear(); + FunctionScopes.push_back(PreallocatedFunctionScope.get()); + } else { + FunctionScopes.push_back(new FunctionScopeInfo(getDiagnostics())); } - - FunctionScopes.push_back(new FunctionScopeInfo(getDiagnostics())); if (LangOpts.OpenMP) pushOpenMPFunctionRegion(); } @@ -1370,15 +1366,15 @@ void Sema::RecordParsingTemplateParamete if (LambdaScopeInfo *const LSI = getCurLambda()) { LSI->AutoTemplateParameterDepth = Depth; return; - } - llvm_unreachable( + } + llvm_unreachable( "Remove assertion if intentionally called in a non-lambda context."); } void Sema::PopFunctionScopeInfo(const AnalysisBasedWarnings::Policy *WP, const Decl *D, const BlockExpr *blkExpr) { - FunctionScopeInfo *Scope = FunctionScopes.pop_back_val(); assert(!FunctionScopes.empty() && "mismatched push/pop!"); + FunctionScopeInfo *Scope = FunctionScopes.pop_back_val(); if (LangOpts.OpenMP) popOpenMPFunctionRegion(Scope); @@ -1390,7 +1386,8 @@ void Sema::PopFunctionScopeInfo(const An for (const auto &PUD : Scope->PossiblyUnreachableDiags) Diag(PUD.Loc, PUD.PD); - if (FunctionScopes.back() != Scope) + // Delete the scope unless its our preallocated scope. + if (Scope != PreallocatedFunctionScope.get()) delete Scope; } @@ -1411,6 +1408,21 @@ bool Sema::hasAnyUnrecoverableErrorsInTh return getCurFunction()->ErrorTrap.hasUnrecoverableErrorOccurred(); } +void Sema::setFunctionHasBranchIntoScope() { + if (!FunctionScopes.empty()) + FunctionScopes.back()->setHasBranchIntoScope(); +} + +void Sema::setFunctionHasBranchProtectedScope() { + if (!FunctionScopes.empty()) + FunctionScopes.back()->setHasBranchProtectedScope(); +} + +void Sema::setFunctionHasIndirectGoto() { + if (!FunctionScopes.empty()) + FunctionScopes.back()->setHasIndirectGoto(); +} + BlockScopeInfo *Sema::getCurBlock() { if (FunctionScopes.empty()) return nullptr; Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=327334&r1=327333&r2=327334&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Mar 12 14:43:02 2018 @@ -5747,7 +5747,7 @@ Sema::CheckTypedefForVariablyModifiedTyp TypeSourceInfo *TInfo = NewTD->getTypeSourceInfo(); QualType T = TInfo->getType(); if (T->isVariablyModifiedType()) { - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); if (S->getFnParent() == nullptr) { bool SizeIsNegative; @@ -7407,7 +7407,7 @@ void Sema::CheckVariableDeclarationType( bool isVM = T->isVariablyModifiedType(); if (isVM || NewVD->hasAttr<CleanupAttr>() || NewVD->hasAttr<BlocksAttr>()) - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); if ((isVM && NewVD->hasLinkage()) || (T->isVariableArrayType() && NewVD->hasGlobalStorage())) { @@ -10644,7 +10644,7 @@ void Sema::AddInitializerToDecl(Decl *Re } if (VDecl->hasLocalStorage()) - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); if (DiagnoseUnexpandedParameterPack(Init, UPPC_Initializer)) { VDecl->setInvalidDecl(); @@ -11178,11 +11178,11 @@ void Sema::ActOnUninitializedDecl(Decl * if (const RecordType *Record = Context.getBaseElementType(Type)->getAs<RecordType>()) { CXXRecordDecl *CXXRecord = cast<CXXRecordDecl>(Record->getDecl()); - // Mark the function for further checking even if the looser rules of - // C++11 do not require such checks, so that we can diagnose - // incompatibilities with C++98. + // Mark the function (if we're in one) for further checking even if the + // looser rules of C++11 do not require such checks, so that we can + // diagnose incompatibilities with C++98. if (!CXXRecord->isPOD()) - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); } } @@ -11318,13 +11318,14 @@ void Sema::CheckCompleteVariableDeclarat case Qualifiers::OCL_Weak: case Qualifiers::OCL_Strong: - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); break; } } - if (var->getType().isDestructedType() == QualType::DK_nontrivial_c_struct) - getCurFunction()->setHasBranchProtectedScope(); + if (var->hasLocalStorage() && + var->getType().isDestructedType() == QualType::DK_nontrivial_c_struct) + setFunctionHasBranchProtectedScope(); // Warn about externally-visible variables being defined without a // prior declaration. We only want to do this for global Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=327334&r1=327333&r2=327334&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Mar 12 14:43:02 2018 @@ -13126,7 +13126,7 @@ ExprResult Sema::ActOnBlockStmtExpr(Sour for (const auto &CI : Result->getBlockDecl()->captures()) { const VarDecl *var = CI.getVariable(); if (var->getType().isDestructedType() != QualType::DK_none) { - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); break; } } Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=327334&r1=327333&r2=327334&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Mon Mar 12 14:43:02 2018 @@ -1114,8 +1114,9 @@ bool Sema::CheckCXXThisCapture(SourceLoc assert((!ByCopy || Explicit) && "cannot implicitly capture *this by value"); - const unsigned MaxFunctionScopesIndex = FunctionScopeIndexToStopAt ? - *FunctionScopeIndexToStopAt : FunctionScopes.size() - 1; + const int MaxFunctionScopesIndex = FunctionScopeIndexToStopAt + ? *FunctionScopeIndexToStopAt + : FunctionScopes.size() - 1; // Check that we can capture the *enclosing object* (referred to by '*this') // by the capturing-entity/closure (lambda/block/etc) at @@ -1141,7 +1142,7 @@ bool Sema::CheckCXXThisCapture(SourceLoc unsigned NumCapturingClosures = 0; - for (unsigned idx = MaxFunctionScopesIndex; idx != 0; idx--) { + for (int idx = MaxFunctionScopesIndex; idx >= 0; idx--) { if (CapturingScopeInfo *CSI = dyn_cast<CapturingScopeInfo>(FunctionScopes[idx])) { if (CSI->CXXThisCaptureIndex != 0) { @@ -1196,8 +1197,8 @@ bool Sema::CheckCXXThisCapture(SourceLoc // FIXME: We need to delay this marking in PotentiallyPotentiallyEvaluated // contexts. QualType ThisTy = getCurrentThisType(); - for (unsigned idx = MaxFunctionScopesIndex; NumCapturingClosures; - --idx, --NumCapturingClosures) { + for (int idx = MaxFunctionScopesIndex; NumCapturingClosures; + --idx, --NumCapturingClosures) { CapturingScopeInfo *CSI = cast<CapturingScopeInfo>(FunctionScopes[idx]); Expr *ThisExpr = nullptr; @@ -7176,9 +7177,6 @@ static void CheckIfAnyEnclosingLambdasMu const bool IsFullExprInstantiationDependent = FE->isInstantiationDependent(); - ArrayRef<const FunctionScopeInfo *> FunctionScopesArrayRef( - S.FunctionScopes.data(), S.FunctionScopes.size()); - // All the potentially captureable variables in the current nested // lambda (within a generic outer lambda), must be captured by an // outer lambda that is enclosed within a non-dependent context. @@ -7207,7 +7205,7 @@ static void CheckIfAnyEnclosingLambdasMu // capture the variable in that lambda (and all its enclosing lambdas). if (const Optional<unsigned> Index = getStackIndexOfNearestEnclosingCaptureCapableLambda( - FunctionScopesArrayRef, Var, S)) { + S.FunctionScopes, Var, S)) { const unsigned FunctionScopeIndexOfCapturableLambda = Index.getValue(); MarkVarDeclODRUsed(Var, VarExpr->getExprLoc(), S, &FunctionScopeIndexOfCapturableLambda); @@ -7243,7 +7241,7 @@ static void CheckIfAnyEnclosingLambdasMu // 'this' in that lambda (and all its enclosing lambdas). if (const Optional<unsigned> Index = getStackIndexOfNearestEnclosingCaptureCapableLambda( - FunctionScopesArrayRef, /*0 is 'this'*/ nullptr, S)) { + S.FunctionScopes, /*0 is 'this'*/ nullptr, S)) { const unsigned FunctionScopeIndexOfCapturableLambda = Index.getValue(); S.CheckCXXThisCapture(CurrentLSI->PotentialThisCaptureLocation, /*Explicit*/ false, /*BuildAndDiagnose*/ true, Modified: cfe/trunk/lib/Sema/SemaLookup.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaLookup.cpp?rev=327334&r1=327333&r2=327334&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaLookup.cpp (original) +++ cfe/trunk/lib/Sema/SemaLookup.cpp Mon Mar 12 14:43:02 2018 @@ -4529,7 +4529,8 @@ static void AddKeywordsToConsumer(Sema & if (S && S->getContinueParent()) Consumer.addKeywordResult("continue"); - if (!SemaRef.getCurFunction()->SwitchStack.empty()) { + if (SemaRef.getCurFunction() && + !SemaRef.getCurFunction()->SwitchStack.empty()) { Consumer.addKeywordResult("case"); Consumer.addKeywordResult("default"); } Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=327334&r1=327333&r2=327334&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original) +++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Mon Mar 12 14:43:02 2018 @@ -3572,7 +3572,7 @@ StmtResult Sema::ActOnOpenMPParallelDire // longjmp() and throw() must not violate the entry/exit criteria. CS->getCapturedDecl()->setNothrow(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPParallelDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt, DSAStack->isCancelRegion()); @@ -5281,7 +5281,7 @@ StmtResult Sema::ActOnOpenMPSimdDirectiv if (checkSimdlenSafelenSpecified(*this, Clauses)) return StmtError(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPSimdDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -5317,7 +5317,7 @@ StmtResult Sema::ActOnOpenMPForDirective } } - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPForDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, DSAStack->isCancelRegion()); } @@ -5357,7 +5357,7 @@ StmtResult Sema::ActOnOpenMPForSimdDirec if (checkSimdlenSafelenSpecified(*this, Clauses)) return StmtError(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPForSimdDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -5394,7 +5394,7 @@ StmtResult Sema::ActOnOpenMPSectionsDire return StmtError(); } - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPSectionsDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt, DSAStack->isCancelRegion()); @@ -5408,7 +5408,7 @@ StmtResult Sema::ActOnOpenMPSectionDirec assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); DSAStack->setParentCancelRegion(DSAStack->isCancelRegion()); return OMPSectionDirective::Create(Context, StartLoc, EndLoc, AStmt, @@ -5424,7 +5424,7 @@ StmtResult Sema::ActOnOpenMPSingleDirect assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); // OpenMP [2.7.3, single Construct, Restrictions] // The copyprivate clause must not be used with the nowait clause. @@ -5454,7 +5454,7 @@ StmtResult Sema::ActOnOpenMPMasterDirect assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPMasterDirective::Create(Context, StartLoc, EndLoc, AStmt); } @@ -5508,7 +5508,7 @@ StmtResult Sema::ActOnOpenMPCriticalDire } } - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); auto *Dir = OMPCriticalDirective::Create(Context, DirName, StartLoc, EndLoc, Clauses, AStmt); @@ -5556,7 +5556,7 @@ StmtResult Sema::ActOnOpenMPParallelForD } } - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPParallelForDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, DSAStack->isCancelRegion()); @@ -5601,7 +5601,7 @@ StmtResult Sema::ActOnOpenMPParallelForS if (checkSimdlenSafelenSpecified(*this, Clauses)) return StmtError(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPParallelForSimdDirective::Create( Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -5639,7 +5639,7 @@ Sema::ActOnOpenMPParallelSectionsDirecti return StmtError(); } - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPParallelSectionsDirective::Create( Context, StartLoc, EndLoc, Clauses, AStmt, DSAStack->isCancelRegion()); @@ -5659,7 +5659,7 @@ StmtResult Sema::ActOnOpenMPTaskDirectiv // longjmp() and throw() must not violate the entry/exit criteria. CS->getCapturedDecl()->setNothrow(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTaskDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt, DSAStack->isCancelRegion()); @@ -5689,7 +5689,7 @@ StmtResult Sema::ActOnOpenMPTaskgroupDir assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTaskgroupDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt, @@ -5772,7 +5772,7 @@ StmtResult Sema::ActOnOpenMPOrderedDirec if (AStmt) { assert(isa<CapturedStmt>(AStmt) && "Captured statement expected"); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); } return OMPOrderedDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); @@ -6442,7 +6442,7 @@ StmtResult Sema::ActOnOpenMPAtomicDirect } } - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPAtomicDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt, X, V, E, UE, IsXLHSInRHSPart, @@ -6507,7 +6507,7 @@ StmtResult Sema::ActOnOpenMPTargetDirect } } - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTargetDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); } @@ -6537,7 +6537,7 @@ Sema::ActOnOpenMPTargetParallelDirective CS->getCapturedDecl()->setNothrow(); } - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTargetParallelDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); @@ -6592,7 +6592,7 @@ StmtResult Sema::ActOnOpenMPTargetParall } } - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTargetParallelForDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, DSAStack->isCancelRegion()); @@ -6629,7 +6629,7 @@ StmtResult Sema::ActOnOpenMPTargetDataDi return StmtError(); } - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTargetDataDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); @@ -6756,7 +6756,7 @@ StmtResult Sema::ActOnOpenMPTeamsDirecti // longjmp() and throw() must not violate the entry/exit criteria. CS->getCapturedDecl()->setNothrow(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); DSAStack->setParentTeamsRegionLoc(StartLoc); @@ -6879,7 +6879,7 @@ StmtResult Sema::ActOnOpenMPTaskLoopDire if (checkReductionClauseWithNogroup(*this, Clauses)) return StmtError(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTaskLoopDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -6929,7 +6929,7 @@ StmtResult Sema::ActOnOpenMPTaskLoopSimd if (checkSimdlenSafelenSpecified(*this, Clauses)) return StmtError(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTaskLoopSimdDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -6955,7 +6955,7 @@ StmtResult Sema::ActOnOpenMPDistributeDi assert((CurContext->isDependentContext() || B.builtAll()) && "omp for loop exprs were not built"); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPDistributeDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -6999,7 +6999,7 @@ StmtResult Sema::ActOnOpenMPDistributePa assert((CurContext->isDependentContext() || B.builtAll()) && "omp for loop exprs were not built"); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPDistributeParallelForDirective::Create( Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, DSAStack->isCancelRegion()); @@ -7058,7 +7058,7 @@ StmtResult Sema::ActOnOpenMPDistributePa if (checkSimdlenSafelenSpecified(*this, Clauses)) return StmtError(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPDistributeParallelForSimdDirective::Create( Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -7115,7 +7115,7 @@ StmtResult Sema::ActOnOpenMPDistributeSi if (checkSimdlenSafelenSpecified(*this, Clauses)) return StmtError(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPDistributeSimdDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -7171,7 +7171,7 @@ StmtResult Sema::ActOnOpenMPTargetParall if (checkSimdlenSafelenSpecified(*this, Clauses)) return StmtError(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTargetParallelForSimdDirective::Create( Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -7228,7 +7228,7 @@ StmtResult Sema::ActOnOpenMPTargetSimdDi if (checkSimdlenSafelenSpecified(*this, Clauses)) return StmtError(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTargetSimdDirective::Create(Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -7271,7 +7271,7 @@ StmtResult Sema::ActOnOpenMPTeamsDistrib assert((CurContext->isDependentContext() || B.builtAll()) && "omp teams distribute loop exprs were not built"); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); DSAStack->setParentTeamsRegionLoc(StartLoc); @@ -7334,7 +7334,7 @@ StmtResult Sema::ActOnOpenMPTeamsDistrib if (checkSimdlenSafelenSpecified(*this, Clauses)) return StmtError(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); DSAStack->setParentTeamsRegionLoc(StartLoc); @@ -7397,7 +7397,7 @@ StmtResult Sema::ActOnOpenMPTeamsDistrib if (checkSimdlenSafelenSpecified(*this, Clauses)) return StmtError(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); DSAStack->setParentTeamsRegionLoc(StartLoc); @@ -7446,7 +7446,7 @@ StmtResult Sema::ActOnOpenMPTeamsDistrib assert((CurContext->isDependentContext() || B.builtAll()) && "omp for loop exprs were not built"); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); DSAStack->setParentTeamsRegionLoc(StartLoc); @@ -7480,7 +7480,7 @@ StmtResult Sema::ActOnOpenMPTargetTeamsD // longjmp() and throw() must not violate the entry/exit criteria. CS->getCapturedDecl()->setNothrow(); } - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTargetTeamsDirective::Create(Context, StartLoc, EndLoc, Clauses, AStmt); @@ -7525,7 +7525,7 @@ StmtResult Sema::ActOnOpenMPTargetTeamsD assert((CurContext->isDependentContext() || B.builtAll()) && "omp target teams distribute loop exprs were not built"); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTargetTeamsDistributeDirective::Create( Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -7580,7 +7580,7 @@ StmtResult Sema::ActOnOpenMPTargetTeamsD } } - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTargetTeamsDistributeParallelForDirective::Create( Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B, DSAStack->isCancelRegion()); @@ -7641,7 +7641,7 @@ StmtResult Sema::ActOnOpenMPTargetTeamsD if (checkSimdlenSafelenSpecified(*this, Clauses)) return StmtError(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTargetTeamsDistributeParallelForSimdDirective::Create( Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -7699,7 +7699,7 @@ StmtResult Sema::ActOnOpenMPTargetTeamsD if (checkSimdlenSafelenSpecified(*this, Clauses)) return StmtError(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return OMPTargetTeamsDistributeSimdDirective::Create( Context, StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } @@ -12450,7 +12450,7 @@ void Sema::ActOnOpenMPDeclareReductionCo // Enter new function scope. PushFunctionScope(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); getCurFunction()->setHasOMPDeclareReductionCombiner(); if (S != nullptr) @@ -12506,7 +12506,7 @@ VarDecl *Sema::ActOnOpenMPDeclareReducti // Enter new function scope. PushFunctionScope(); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); if (S != nullptr) PushDeclContext(S, DRD); Modified: cfe/trunk/lib/Sema/SemaStmt.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=327334&r1=327333&r2=327334&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaStmt.cpp (original) +++ cfe/trunk/lib/Sema/SemaStmt.cpp Mon Mar 12 14:43:02 2018 @@ -557,7 +557,7 @@ StmtResult Sema::BuildIfStmt(SourceLocat return StmtError(); if (IsConstexpr || isa<ObjCAvailabilityCheckExpr>(Cond.get().second)) - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); DiagnoseUnusedExprResult(thenStmt); DiagnoseUnusedExprResult(elseStmt); @@ -688,7 +688,7 @@ StmtResult Sema::ActOnStartOfSwitchStmt( if (Cond.isInvalid()) return StmtError(); - getCurFunction()->setHasBranchIntoScope(); + setFunctionHasBranchIntoScope(); SwitchStmt *SS = new (Context) SwitchStmt(Context, InitStmt, Cond.get().first, Cond.get().second); @@ -1873,7 +1873,7 @@ StmtResult Sema::ActOnObjCForCollectionStmt(SourceLocation ForLoc, Stmt *First, Expr *collection, SourceLocation RParenLoc) { - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); ExprResult CollectionExprResult = CheckObjCForCollectionOperand(ForLoc, collection); @@ -2784,7 +2784,7 @@ StmtResult Sema::FinishCXXForRangeStmt(S StmtResult Sema::ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, LabelDecl *TheDecl) { - getCurFunction()->setHasBranchIntoScope(); + setFunctionHasBranchIntoScope(); TheDecl->markUsed(Context); return new (Context) GotoStmt(TheDecl, GotoLoc, LabelLoc); } @@ -2811,7 +2811,7 @@ Sema::ActOnIndirectGotoStmt(SourceLocati return StmtError(); E = ExprRes.get(); - getCurFunction()->setHasIndirectGoto(); + setFunctionHasIndirectGoto(); return new (Context) IndirectGotoStmt(GotoLoc, StarLoc, E); } @@ -3607,7 +3607,7 @@ Sema::ActOnObjCAtTryStmt(SourceLocation if (!getLangOpts().ObjCExceptions) Diag(AtLoc, diag::err_objc_exceptions_disabled) << "@try"; - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); unsigned NumCatchStmts = CatchStmts.size(); return ObjCAtTryStmt::Create(Context, AtLoc, Try, CatchStmts.data(), NumCatchStmts, Finally); @@ -3698,7 +3698,7 @@ StmtResult Sema::ActOnObjCAtSynchronizedStmt(SourceLocation AtLoc, Expr *SyncExpr, Stmt *SyncBody) { // We can't jump into or indirect-jump out of a @synchronized block. - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return new (Context) ObjCAtSynchronizedStmt(AtLoc, SyncExpr, SyncBody); } @@ -3714,7 +3714,7 @@ Sema::ActOnCXXCatchBlock(SourceLocation StmtResult Sema::ActOnObjCAutoreleasePoolStmt(SourceLocation AtLoc, Stmt *Body) { - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); return new (Context) ObjCAutoreleasePoolStmt(AtLoc, Body); } Modified: cfe/trunk/lib/Sema/SemaStmtAsm.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmtAsm.cpp?rev=327334&r1=327333&r2=327334&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaStmtAsm.cpp (original) +++ cfe/trunk/lib/Sema/SemaStmtAsm.cpp Mon Mar 12 14:43:02 2018 @@ -793,7 +793,7 @@ StmtResult Sema::ActOnMSAsmStmt(SourceLo ArrayRef<Expr*> Exprs, SourceLocation EndLoc) { bool IsSimple = (NumOutputs != 0 || NumInputs != 0); - getCurFunction()->setHasBranchProtectedScope(); + setFunctionHasBranchProtectedScope(); MSAsmStmt *NS = new (Context) MSAsmStmt(Context, AsmLoc, LBraceLoc, IsSimple, /*IsVolatile*/ true, AsmToks, NumOutputs, NumInputs, _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits