[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