This fixes `+ X(std::unique_ptr<int> up) : pointee(up.get()), pointer(std::move(up)) {}` as well, right?
On Fri, Aug 9, 2019 at 8:31 PM Gabor Horvath via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: xazax > Date: Fri Aug 9 17:32:29 2019 > New Revision: 368501 > > URL: http://llvm.org/viewvc/llvm-project?rev=368501&view=rev > Log: > Fix a false positive warning when initializing members with gsl::Owners. > > 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=368501&r1=368500&r2=368501&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaInit.cpp (original) > +++ cfe/trunk/lib/Sema/SemaInit.cpp Fri Aug 9 17:32:29 2019 > @@ -7217,6 +7217,11 @@ void Sema::checkInitializerLifetime(cons > if (pathContainsInit(Path)) > return false; > > + // Suppress false positives for code like the below: > + // Ctor(unique_ptr<T> up) : member(*up), member2(move(up)) {} > + if (IsLocalGslOwner && pathOnlyInitializesGslPointer(Path)) > + return false; > + > auto *DRE = dyn_cast<DeclRefExpr>(L); > auto *VD = DRE ? dyn_cast<VarDecl>(DRE->getDecl()) : nullptr; > if (!VD) { > > 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=368501&r1=368500&r2=368501&view=diff > > ============================================================================== > --- cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp (original) > +++ cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp Fri Aug 9 > 17:32:29 2019 > @@ -120,6 +120,13 @@ void initLocalGslPtrWithTempOwner() { > } > > namespace std { > +template<class T> struct remove_reference { typedef T type; }; > +template<class T> struct remove_reference<T &> { typedef T type; }; > +template<class T> struct remove_reference<T &&> { typedef T type; }; > + > +template<class T> > +typename remove_reference<T>::type &&move(T &&t) noexcept; > + > template <typename T> > struct basic_iterator { > basic_iterator operator++(); > @@ -153,6 +160,7 @@ struct basic_string { > > template<typename T> > struct unique_ptr { > + T &operator*(); > T *get() const; > }; > > @@ -217,3 +225,10 @@ int &doNotFollowReferencesForLocalOwner( > const char *trackThroughMultiplePointer() { > return std::basic_string_view<char>(std::basic_string<char>()).begin(); > // expected-warning {{returning address of local temporary object}} > } > + > +struct X { > + X(std::unique_ptr<int> up) : pointee(*up), pointer(std::move(up)) {} > + > + int &pointee; > + std::unique_ptr<int> pointer; > +}; > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits