// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/no_destructor.h" #include #include #include "base/logging.h" #include "build/build_config.h" #include "testing/gtest/include/gtest/gtest.h" namespace base { namespace { struct CheckOnDestroy { ~CheckOnDestroy() { CHECK(false); } }; TEST(NoDestructorTest, SkipsDestructors) { NoDestructor destructor_should_not_run; } struct CopyOnly { CopyOnly() = default; CopyOnly(const CopyOnly&) = default; CopyOnly& operator=(const CopyOnly&) = default; CopyOnly(CopyOnly&&) = delete; CopyOnly& operator=(CopyOnly&&) = delete; }; struct MoveOnly { MoveOnly() = default; MoveOnly(const MoveOnly&) = delete; MoveOnly& operator=(const MoveOnly&) = delete; MoveOnly(MoveOnly&&) = default; MoveOnly& operator=(MoveOnly&&) = default; }; struct ForwardingTestStruct { ForwardingTestStruct(const CopyOnly&, MoveOnly&&) {} }; TEST(NoDestructorTest, ForwardsArguments) { CopyOnly copy_only; MoveOnly move_only; static NoDestructor test_forwarding( copy_only, std::move(move_only)); } TEST(NoDestructorTest, Accessors) { static NoDestructor awesome("awesome"); EXPECT_EQ("awesome", *awesome); EXPECT_EQ(0, awesome->compare("awesome")); EXPECT_EQ(0, awesome.get()->compare("awesome")); } // Passing initializer list to a NoDestructor like in this test // is ambiguous in GCC. // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84849 #if !defined(COMPILER_GCC) && !defined(__clang__) TEST(NoDestructorTest, InitializerList) { static NoDestructor> vector({"a", "b", "c"}); } #endif } // namespace } // namespace base