From 2bf522aea62e4fb653cacb68072167d25149099e Mon Sep 17 00:00:00 2001 From: Gabor Horvath Date: Fri, 9 Aug 2019 17:42:41 +0000 Subject: [PATCH] Fix a build bot failure and multiple warnings instances for range base for loops llvm-svn: 368459 --- clang/lib/Sema/SemaInit.cpp | 9 ++++++--- clang/test/Sema/warn-lifetime-analysis-nocfg.cpp | 7 +++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index dfc12e9..3ac45e2 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -6616,7 +6616,7 @@ static void handleGslAnnotatedTypes(IndirectLocalPath &Path, Expr *Call, return; } else if (auto *OCE = dyn_cast(Call)) { FunctionDecl *Callee = OCE->getDirectCallee(); - if (Callee->isCXXInstanceMember() && + if (Callee && Callee->isCXXInstanceMember() && shouldTrackImplicitObjectArg(cast(Callee))) VisitPointerArg(Callee, OCE->getArg(0)); return; @@ -7070,8 +7070,11 @@ static SourceRange nextPathEntryRange(const IndirectLocalPath &Path, unsigned I, // supporting lifetime extension. break; - case IndirectLocalPathEntry::DefaultInit: case IndirectLocalPathEntry::VarInit: + if (cast(Path[I].D)->isImplicit()) + return SourceRange(); + LLVM_FALLTHROUGH; + case IndirectLocalPathEntry::DefaultInit: return Path[I].E->getSourceRange(); } } @@ -7133,7 +7136,7 @@ void Sema::checkInitializerLifetime(const InitializedEntity &Entity, return false; } - if (IsGslPtrInitWithGslTempOwner) { + if (IsGslPtrInitWithGslTempOwner && DiagLoc.isValid()) { Diag(DiagLoc, diag::warn_dangling_lifetime_pointer) << DiagRange; return false; } diff --git a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp index efa54fe..eaddb74 100644 --- a/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp +++ b/clang/test/Sema/warn-lifetime-analysis-nocfg.cpp @@ -201,6 +201,13 @@ void danglingReferenceFromTempOwner() { std::vector getTempVec(); std::optional> getTempOptVec(); +void testLoops() { + for (auto i : getTempVec()) // ok + ; + for (auto i : *getTempOptVec()) // expected-warning {{object backing the pointer will be destroyed at the end of the full-expression}} + ; +} + int &usedToBeFalsePositive(std::vector &v) { std::vector::iterator it = v.begin(); int& value = *it; -- 2.7.4