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());
typedef basic_iterator<T> iterator;
iterator begin();
iterator end();
- T *data();
+ const T *data() const;
T &at(int n);
};
};
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.
+}