aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Sema/SemaInit.cpp
diff options
context:
space:
mode:
authorGabor Horvath <xazax.hun@gmail.com>2019-09-03 16:17:24 +0000
committerGabor Horvath <xazax.hun@gmail.com>2019-09-03 16:17:24 +0000
commit6f98400189a68e4d880bc6d4d88dd930a4650d00 (patch)
treedfa907d2363bae6ecd197ac381f2c155aec9863a /clang/lib/Sema/SemaInit.cpp
parentaf7f1a1959eb888fb25ce32899bee94e794cac5f (diff)
downloadllvm-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.cpp6
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;