xref: /llvm-project/llvm/unittests/ADT/PointerSumTypeTest.cpp (revision 2946cd701067404b99c39fb29dc9c74bd7193eb3)
1 //===- llvm/unittest/ADT/PointerSumTypeTest.cpp ---------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "llvm/ADT/PointerSumType.h"
10 #include "gtest/gtest.h"
11 using namespace llvm;
12 
13 namespace {
14 
15 struct PointerSumTypeTest : public testing::Test {
16   enum Kinds { Float, Int1, Int2 };
17   float f;
18   int i1, i2;
19 
20   typedef PointerSumType<Kinds, PointerSumTypeMember<Float, float *>,
21                          PointerSumTypeMember<Int1, int *>,
22                          PointerSumTypeMember<Int2, int *>>
23       SumType;
24   SumType a, b, c, n;
25 
PointerSumTypeTest__anonb04e23ff0111::PointerSumTypeTest26   PointerSumTypeTest()
27       : f(3.14f), i1(42), i2(-1), a(SumType::create<Float>(&f)),
28         b(SumType::create<Int1>(&i1)), c(SumType::create<Int2>(&i2)), n() {}
29 };
30 
TEST_F(PointerSumTypeTest,NullTest)31 TEST_F(PointerSumTypeTest, NullTest) {
32   EXPECT_TRUE(a);
33   EXPECT_TRUE(b);
34   EXPECT_TRUE(c);
35   EXPECT_FALSE(n);
36 }
37 
TEST_F(PointerSumTypeTest,GetTag)38 TEST_F(PointerSumTypeTest, GetTag) {
39   EXPECT_EQ(Float, a.getTag());
40   EXPECT_EQ(Int1, b.getTag());
41   EXPECT_EQ(Int2, c.getTag());
42   EXPECT_EQ((Kinds)0, n.getTag());
43 }
44 
TEST_F(PointerSumTypeTest,Is)45 TEST_F(PointerSumTypeTest, Is) {
46   EXPECT_TRUE(a.is<Float>());
47   EXPECT_FALSE(a.is<Int1>());
48   EXPECT_FALSE(a.is<Int2>());
49   EXPECT_FALSE(b.is<Float>());
50   EXPECT_TRUE(b.is<Int1>());
51   EXPECT_FALSE(b.is<Int2>());
52   EXPECT_FALSE(c.is<Float>());
53   EXPECT_FALSE(c.is<Int1>());
54   EXPECT_TRUE(c.is<Int2>());
55 }
56 
TEST_F(PointerSumTypeTest,Get)57 TEST_F(PointerSumTypeTest, Get) {
58   EXPECT_EQ(&f, a.get<Float>());
59   EXPECT_EQ(nullptr, a.get<Int1>());
60   EXPECT_EQ(nullptr, a.get<Int2>());
61   EXPECT_EQ(nullptr, b.get<Float>());
62   EXPECT_EQ(&i1, b.get<Int1>());
63   EXPECT_EQ(nullptr, b.get<Int2>());
64   EXPECT_EQ(nullptr, c.get<Float>());
65   EXPECT_EQ(nullptr, c.get<Int1>());
66   EXPECT_EQ(&i2, c.get<Int2>());
67 
68   // Note that we can use .get even on a null sum type. It just always produces
69   // a null pointer, even if one of the discriminants is null.
70   EXPECT_EQ(nullptr, n.get<Float>());
71   EXPECT_EQ(nullptr, n.get<Int1>());
72   EXPECT_EQ(nullptr, n.get<Int2>());
73 }
74 
TEST_F(PointerSumTypeTest,Cast)75 TEST_F(PointerSumTypeTest, Cast) {
76   EXPECT_EQ(&f, a.cast<Float>());
77   EXPECT_EQ(&i1, b.cast<Int1>());
78   EXPECT_EQ(&i2, c.cast<Int2>());
79 }
80 
TEST_F(PointerSumTypeTest,Assignment)81 TEST_F(PointerSumTypeTest, Assignment) {
82   b = SumType::create<Int2>(&i2);
83   EXPECT_EQ(nullptr, b.get<Float>());
84   EXPECT_EQ(nullptr, b.get<Int1>());
85   EXPECT_EQ(&i2, b.get<Int2>());
86 
87   b = SumType::create<Int2>(&i1);
88   EXPECT_EQ(nullptr, b.get<Float>());
89   EXPECT_EQ(nullptr, b.get<Int1>());
90   EXPECT_EQ(&i1, b.get<Int2>());
91 
92   float Local = 1.616f;
93   b = SumType::create<Float>(&Local);
94   EXPECT_EQ(&Local, b.get<Float>());
95   EXPECT_EQ(nullptr, b.get<Int1>());
96   EXPECT_EQ(nullptr, b.get<Int2>());
97 
98   n = SumType::create<Int1>(&i2);
99   EXPECT_TRUE(n);
100   EXPECT_EQ(nullptr, n.get<Float>());
101   EXPECT_EQ(&i2, n.get<Int1>());
102   EXPECT_EQ(nullptr, n.get<Int2>());
103 
104   n = SumType::create<Float>(nullptr);
105   EXPECT_FALSE(n);
106   EXPECT_EQ(nullptr, n.get<Float>());
107   EXPECT_EQ(nullptr, n.get<Int1>());
108   EXPECT_EQ(nullptr, n.get<Int2>());
109 }
110 
111 
112 } // end anonymous namespace
113