1*31bb8efdSRiver Riddle //===- StorageUniquerTest.cpp - StorageUniquer Tests ----------------------===//
2*31bb8efdSRiver Riddle //
3*31bb8efdSRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*31bb8efdSRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
5*31bb8efdSRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*31bb8efdSRiver Riddle //
7*31bb8efdSRiver Riddle //===----------------------------------------------------------------------===//
8*31bb8efdSRiver Riddle
9*31bb8efdSRiver Riddle #include "mlir/Support/StorageUniquer.h"
10*31bb8efdSRiver Riddle #include "gmock/gmock.h"
11*31bb8efdSRiver Riddle
12*31bb8efdSRiver Riddle using namespace mlir;
13*31bb8efdSRiver Riddle
14*31bb8efdSRiver Riddle namespace {
15*31bb8efdSRiver Riddle /// Simple storage class used for testing.
16*31bb8efdSRiver Riddle template <typename ConcreteT, typename... Args>
17*31bb8efdSRiver Riddle struct SimpleStorage : public StorageUniquer::BaseStorage {
18*31bb8efdSRiver Riddle using Base = SimpleStorage<ConcreteT, Args...>;
19*31bb8efdSRiver Riddle using KeyTy = std::tuple<Args...>;
20*31bb8efdSRiver Riddle
SimpleStorage__anon4a5492a20111::SimpleStorage21*31bb8efdSRiver Riddle SimpleStorage(KeyTy key) : key(key) {}
22*31bb8efdSRiver Riddle
23*31bb8efdSRiver Riddle /// Get an instance of this storage instance.
24*31bb8efdSRiver Riddle template <typename... ParamsT>
get__anon4a5492a20111::SimpleStorage25*31bb8efdSRiver Riddle static ConcreteT *get(StorageUniquer &uniquer, ParamsT &&...params) {
26*31bb8efdSRiver Riddle return uniquer.get<ConcreteT>(
27*31bb8efdSRiver Riddle /*initFn=*/{}, std::make_tuple(std::forward<ParamsT>(params)...));
28*31bb8efdSRiver Riddle }
29*31bb8efdSRiver Riddle
30*31bb8efdSRiver Riddle /// Construct an instance with the given storage allocator.
construct__anon4a5492a20111::SimpleStorage31*31bb8efdSRiver Riddle static ConcreteT *construct(StorageUniquer::StorageAllocator &alloc,
32*31bb8efdSRiver Riddle KeyTy key) {
33*31bb8efdSRiver Riddle return new (alloc.allocate<ConcreteT>())
34*31bb8efdSRiver Riddle ConcreteT(std::forward<KeyTy>(key));
35*31bb8efdSRiver Riddle }
operator ==__anon4a5492a20111::SimpleStorage36*31bb8efdSRiver Riddle bool operator==(const KeyTy &key) const { return this->key == key; }
37*31bb8efdSRiver Riddle
38*31bb8efdSRiver Riddle KeyTy key;
39*31bb8efdSRiver Riddle };
40*31bb8efdSRiver Riddle } // namespace
41*31bb8efdSRiver Riddle
TEST(StorageUniquerTest,NonTrivialDestructor)42*31bb8efdSRiver Riddle TEST(StorageUniquerTest, NonTrivialDestructor) {
43*31bb8efdSRiver Riddle struct NonTrivialStorage : public SimpleStorage<NonTrivialStorage, bool *> {
44*31bb8efdSRiver Riddle using Base::Base;
45*31bb8efdSRiver Riddle ~NonTrivialStorage() {
46*31bb8efdSRiver Riddle bool *wasDestructed = std::get<0>(key);
47*31bb8efdSRiver Riddle *wasDestructed = true;
48*31bb8efdSRiver Riddle }
49*31bb8efdSRiver Riddle };
50*31bb8efdSRiver Riddle
51*31bb8efdSRiver Riddle // Verify that the storage instance destructor was properly called.
52*31bb8efdSRiver Riddle bool wasDestructed = false;
53*31bb8efdSRiver Riddle {
54*31bb8efdSRiver Riddle StorageUniquer uniquer;
55*31bb8efdSRiver Riddle uniquer.registerParametricStorageType<NonTrivialStorage>();
56*31bb8efdSRiver Riddle NonTrivialStorage::get(uniquer, &wasDestructed);
57*31bb8efdSRiver Riddle }
58*31bb8efdSRiver Riddle
59*31bb8efdSRiver Riddle EXPECT_TRUE(wasDestructed);
60*31bb8efdSRiver Riddle }
61