r368501 - Fix a false positive warning when initializing members with gsl::Owners.

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 9 17:50:41 PDT 2019


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 at 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 at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190809/ab7b0d13/attachment.html>


More information about the cfe-commits mailing list