diff options
author | Gabor Horvath <xazax.hun@gmail.com> | 2019-09-03 16:17:24 +0000 |
---|---|---|
committer | Gabor Horvath <xazax.hun@gmail.com> | 2019-09-03 16:17:24 +0000 |
commit | 6f98400189a68e4d880bc6d4d88dd930a4650d00 (patch) | |
tree | dfa907d2363bae6ecd197ac381f2c155aec9863a /clang/lib/Sema/SemaInit.cpp | |
parent | af7f1a1959eb888fb25ce32899bee94e794cac5f (diff) | |
download | llvm-6f98400189a68e4d880bc6d4d88dd930a4650d00.zip llvm-6f98400189a68e4d880bc6d4d88dd930a4650d00.tar.gz llvm-6f98400189a68e4d880bc6d4d88dd930a4650d00.tar.bz2 |
[LifetimeAnalysis] Fix some false positives
Differential Revision: https://reviews.llvm.org/D66806
llvm-svn: 370773
Diffstat (limited to 'clang/lib/Sema/SemaInit.cpp')
-rw-r--r-- | clang/lib/Sema/SemaInit.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index 51e9f3d..ff9b225 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -6775,6 +6775,10 @@ static bool shouldTrackFirstArgument(const FunctionDecl *FD) { static void handleGslAnnotatedTypes(IndirectLocalPath &Path, Expr *Call, LocalVisitor Visit) { auto VisitPointerArg = [&](const Decl *D, Expr *Arg) { + // We are not interested in the temporary base objects of gsl Pointers: + // Temp().ptr; // Here ptr might not dangle. + if (isa<MemberExpr>(Arg->IgnoreImpCasts())) + return; Path.push_back({IndirectLocalPathEntry::GslPointerInit, Arg, D}); if (Arg->isGLValue()) visitLocalsRetainedByReferenceBinding(Path, Arg, RK_ReferenceBinding, @@ -7295,6 +7299,8 @@ static bool pathOnlyInitializesGslPointer(IndirectLocalPath &Path) { for (auto It = Path.rbegin(), End = Path.rend(); It != End; ++It) { if (It->Kind == IndirectLocalPathEntry::VarInit) continue; + if (It->Kind == IndirectLocalPathEntry::AddressOf) + continue; return It->Kind == IndirectLocalPathEntry::GslPointerInit; } return false; |