Author: xazax Date: Sun Aug 11 07:39:42 2019 New Revision: 368534 URL: http://llvm.org/viewvc/llvm-project?rev=368534&view=rev Log: Properly detect temporary gsl::Owners through reference initialization chains.
Modified: cfe/trunk/lib/Sema/SemaInit.cpp cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp Modified: cfe/trunk/lib/Sema/SemaInit.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=368534&r1=368533&r2=368534&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaInit.cpp (original) +++ cfe/trunk/lib/Sema/SemaInit.cpp Sun Aug 11 07:39:42 2019 @@ -7104,7 +7104,8 @@ void Sema::checkInitializerLifetime(cons SourceLocation DiagLoc = DiagRange.getBegin(); auto *MTE = dyn_cast<MaterializeTemporaryExpr>(L); - bool IsTempGslOwner = MTE && isRecordWithAttr<OwnerAttr>(MTE->getType()); + bool IsTempGslOwner = MTE && !MTE->getExtendingDecl() && + isRecordWithAttr<OwnerAttr>(MTE->getType()); bool IsLocalGslOwner = isa<DeclRefExpr>(L) && isRecordWithAttr<OwnerAttr>(L->getType()); Modified: cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp?rev=368534&r1=368533&r2=368534&view=diff ============================================================================== --- cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp (original) +++ cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp Sun Aug 11 07:39:42 2019 @@ -141,7 +141,7 @@ struct vector { typedef basic_iterator<T> iterator; iterator begin(); iterator end(); - T *data(); + const T *data() const; T &at(int n); }; @@ -235,8 +235,14 @@ struct X { }; std::vector<int>::iterator getIt(); +std::vector<int> getVec(); -const int &handleGslPtrInitsThroughReference(const std::vector<int> &v) { +const int &handleGslPtrInitsThroughReference() { const auto &it = getIt(); // Ok, it is lifetime extended. return *it; } + +void handleGslPtrInitsThroughReference2() { + const std::vector<int> &v = getVec(); + const int *val = v.data(); // Ok, it is lifetime extended. +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits