r368534 - Properly detect temporary gsl::Owners through reference initialization chains.
Gabor Horvath via cfe-commits
cfe-commits at lists.llvm.org
Sun Aug 11 07:39:42 PDT 2019
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.
+}
More information about the cfe-commits
mailing list