[llvm] r278251 - [ADT] Add make_scope_exit().

Yung, Douglas via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 10 12:31:06 PDT 2016


Hi Tim,

I don't know if you have been notified of this already, but your change does not seem to build on Windows using Visual Studio 2013. When I sync to your change and build, I get the following build error:

C:\src\upstream\llvm\include\llvm/ADT/ScopeExit.h(34): error C2610: 'llvm::detail::scope_exit<Callable>::scope_exit(llvm::detail::scope_exit<Callable> &&)' : is not a special member function which can be defaulted
          C:\src\upstream\llvm\include\llvm/ADT/ScopeExit.h(37) : see reference to class template instantiation 'llvm::detail::scope_exit<Callable>' being compiled
C:\src\upstream\llvm\unittests\ADT\ScopeExitTest.cpp(26): error C2264: 'llvm::detail::scope_exit<`anonymous-namespace'::ScopeExitTest_Basic_Test::TestBody::Callable>::scope_exit' : error in function definition or declaration; function not called

Can you please look into this?

Douglas Yung

> -----Original Message-----
> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On
> Behalf Of Tim Shen via llvm-commits
> Sent: Wednesday, August 10, 2016 10:52
> To: llvm-commits at lists.llvm.org
> Subject: [llvm] r278251 - [ADT] Add make_scope_exit().
> 
> Author: timshen
> Date: Wed Aug 10 12:52:09 2016
> New Revision: 278251
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=278251&view=rev
> Log:
> [ADT] Add make_scope_exit().
> 
> Summary: make_scope_exit() is described in C++ proposal p0052r2, which
> uses RAII to do cleanup works at scope exit.
> 
> Reviewers: chandlerc
> 
> Subscribers: llvm-commits
> 
> Differential Revision: https://reviews.llvm.org/D22796
> 
> Added:
>     llvm/trunk/include/llvm/ADT/ScopeExit.h
>     llvm/trunk/unittests/ADT/ScopeExitTest.cpp
> Modified:
>     llvm/trunk/unittests/ADT/CMakeLists.txt
> 
> Added: llvm/trunk/include/llvm/ADT/ScopeExit.h
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/include/llvm/ADT/ScopeExit.h?rev=278251&view=auto
> =======================================================================
> =======
> --- llvm/trunk/include/llvm/ADT/ScopeExit.h (added)
> +++ llvm/trunk/include/llvm/ADT/ScopeExit.h Wed Aug 10 12:52:09 2016
> @@ -0,0 +1,55 @@
> +//===- llvm/ADT/ScopeExit.h - Execute code at scope exit --------*-
> C++
> +-*-===// //
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open
> +Source // License. See LICENSE.TXT for details.
> +//
> +//===-----------------------------------------------------------------
> -
> +----===//
> +//
> +// This file defines the make_scope_exit function, which executes
> +user-defined // cleanup logic at scope exit.
> +//
> +//===-----------------------------------------------------------------
> -
> +----===//
> +
> +#ifndef LLVM_ADT_SCOPE_EXIT_H
> +#define LLVM_ADT_SCOPE_EXIT_H
> +
> +#include "llvm/Support/Compiler.h"
> +
> +#include <type_traits>
> +#include <utility>
> +
> +namespace llvm {
> +namespace detail {
> +
> +template <typename Callable> class LLVM_ATTRIBUTE_UNUSED_RESULT
> +scope_exit {
> +  Callable ExitFunction;
> +
> +public:
> +  template <typename Fp>
> +  explicit scope_exit(Fp &&F) : ExitFunction(std::forward<Fp>(F)) {}
> +
> +  scope_exit(const scope_exit &) = default;  scope_exit(scope_exit &&)
> + = default;
> +
> +  ~scope_exit() { ExitFunction(); }
> +};
> +
> +} // end namespace detail
> +
> +// Keeps the callable object that is passed in, and execute it at the
> +// destruction of the returned object (usually at the scope exit where
> +the // returned object is kept).
> +//
> +// Interface is specified by p0052r2.
> +template <typename Callable>
> +detail::scope_exit<typename std::decay<Callable>::type>
> +make_scope_exit(Callable &&F) {
> +  return detail::scope_exit<typename std::decay<Callable>::type>(
> +      std::forward<Callable>(F));
> +}
> +
> +} // end namespace llvm
> +
> +#endif
> 
> Modified: llvm/trunk/unittests/ADT/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/unittests/ADT/CMakeLists.txt?rev=278251&r1=278250&r2
> =278251&view=diff
> =======================================================================
> =======
> --- llvm/trunk/unittests/ADT/CMakeLists.txt (original)
> +++ llvm/trunk/unittests/ADT/CMakeLists.txt Wed Aug 10 12:52:09 2016
> @@ -34,6 +34,7 @@ set(ADTSources
>    PriorityWorklistTest.cpp
>    RangeAdapterTest.cpp
>    SCCIteratorTest.cpp
> +  ScopeExitTest.cpp
>    SequenceTest.cpp
>    SetVectorTest.cpp
>    SmallPtrSetTest.cpp
> 
> Added: llvm/trunk/unittests/ADT/ScopeExitTest.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/unittests/ADT/ScopeExitTest.cpp?rev=278251&view=auto
> =======================================================================
> =======
> --- llvm/trunk/unittests/ADT/ScopeExitTest.cpp (added)
> +++ llvm/trunk/unittests/ADT/ScopeExitTest.cpp Wed Aug 10 12:52:09 2016
> @@ -0,0 +1,32 @@
> +//===- llvm/unittest/ADT/ScopeExit.cpp - Scope exit unit tests --*-
> C++
> +-*-===// //
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open
> +Source // License. See LICENSE.TXT for details.
> +//
> +//===-----------------------------------------------------------------
> -
> +----===//
> +
> +#include "llvm/ADT/ScopeExit.h"
> +#include "gtest/gtest.h"
> +
> +using namespace llvm;
> +
> +namespace {
> +
> +TEST(ScopeExitTest, Basic) {
> +  struct Callable {
> +    bool &Called;
> +    Callable(bool &Called) : Called(Called) {}
> +    Callable(Callable &&RHS) : Called(RHS.Called) {}
> +    void operator()() { Called = true; }
> +  };
> +  bool Called = false;
> +  {
> +    auto g = make_scope_exit(Callable(Called));
> +    EXPECT_FALSE(Called);
> +  }
> +  EXPECT_TRUE(Called);
> +}
> +
> +} // end anonymous namespace
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list