blob: cd6e980e9a261159d9bf0734e88f704159a09b87 [file] [log] [blame]
David Blaikiee2760b72013-08-21 21:30:23 +00001//===- llvm/unittest/ADT/PointerUnionTest.cpp - Optional unit tests -------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
David Blaikiee2760b72013-08-21 21:30:23 +00006//
7//===----------------------------------------------------------------------===//
8
David Blaikiee2760b72013-08-21 21:30:23 +00009#include "llvm/ADT/PointerUnion.h"
Chandler Carruth9a67b072017-06-06 11:06:56 +000010#include "gtest/gtest.h"
David Blaikiee2760b72013-08-21 21:30:23 +000011using namespace llvm;
12
13namespace {
14
Chandler Carruth1284df12014-04-28 23:37:53 +000015typedef PointerUnion<int *, float *> PU;
David Blaikiee2760b72013-08-21 21:30:23 +000016
Chandler Carruth275c5fc2014-04-28 23:42:22 +000017struct PointerUnionTest : public testing::Test {
18 float f;
19 int i;
David Blaikiee2760b72013-08-21 21:30:23 +000020
Chandler Carrutha468b8e2014-04-28 23:44:14 +000021 PU a, b, c, n;
David Blaikiee2760b72013-08-21 21:30:23 +000022
Chandler Carrutha468b8e2014-04-28 23:44:14 +000023 PointerUnionTest() : f(3.14f), i(42), a(&f), b(&i), c(&i), n() {}
Chandler Carruth275c5fc2014-04-28 23:42:22 +000024};
David Blaikiee2760b72013-08-21 21:30:23 +000025
26TEST_F(PointerUnionTest, Comparison) {
Chandler Carrutha468b8e2014-04-28 23:44:14 +000027 EXPECT_TRUE(a == a);
28 EXPECT_FALSE(a != a);
David Blaikiee2760b72013-08-21 21:30:23 +000029 EXPECT_TRUE(a != b);
30 EXPECT_FALSE(a == b);
Chandler Carrutha468b8e2014-04-28 23:44:14 +000031 EXPECT_TRUE(b == c);
32 EXPECT_FALSE(b != c);
David Blaikiee2760b72013-08-21 21:30:23 +000033 EXPECT_TRUE(b != n);
34 EXPECT_FALSE(b == n);
35}
36
37TEST_F(PointerUnionTest, Null) {
38 EXPECT_FALSE(a.isNull());
39 EXPECT_FALSE(b.isNull());
40 EXPECT_TRUE(n.isNull());
41 EXPECT_FALSE(!a);
42 EXPECT_FALSE(!b);
43 EXPECT_TRUE(!n);
44 // workaround an issue with EXPECT macros and explicit bool
45 EXPECT_TRUE((bool)a);
46 EXPECT_TRUE((bool)b);
47 EXPECT_FALSE(n);
Chandler Carruthd24465f2014-04-29 00:14:27 +000048
49 EXPECT_NE(n, b);
50 EXPECT_EQ(b, c);
51 b = nullptr;
52 EXPECT_EQ(n, b);
53 EXPECT_NE(b, c);
David Blaikiee2760b72013-08-21 21:30:23 +000054}
55
56TEST_F(PointerUnionTest, Is) {
Chandler Carruth1284df12014-04-28 23:37:53 +000057 EXPECT_FALSE(a.is<int *>());
58 EXPECT_TRUE(a.is<float *>());
59 EXPECT_TRUE(b.is<int *>());
60 EXPECT_FALSE(b.is<float *>());
61 EXPECT_TRUE(n.is<int *>());
62 EXPECT_FALSE(n.is<float *>());
David Blaikiee2760b72013-08-21 21:30:23 +000063}
64
65TEST_F(PointerUnionTest, Get) {
Chandler Carruth1284df12014-04-28 23:37:53 +000066 EXPECT_EQ(a.get<float *>(), &f);
67 EXPECT_EQ(b.get<int *>(), &i);
Craig Topper66f09ad2014-06-08 22:29:17 +000068 EXPECT_EQ(n.get<int *>(), (int *)nullptr);
David Blaikiee2760b72013-08-21 21:30:23 +000069}
70
Richard Smith9b928752019-05-17 00:39:38 +000071template<int I> struct alignas(8) Aligned {};
72
73typedef PointerUnion<Aligned<0> *, Aligned<1> *, Aligned<2> *, Aligned<3> *,
74 Aligned<4> *, Aligned<5> *, Aligned<6> *, Aligned<7> *>
75 PU8;
76
77TEST_F(PointerUnionTest, ManyElements) {
78 Aligned<0> a0;
79 Aligned<7> a7;
80
81 PU8 a = &a0;
82 EXPECT_TRUE(a.is<Aligned<0>*>());
83 EXPECT_FALSE(a.is<Aligned<1>*>());
84 EXPECT_FALSE(a.is<Aligned<2>*>());
85 EXPECT_FALSE(a.is<Aligned<3>*>());
86 EXPECT_FALSE(a.is<Aligned<4>*>());
87 EXPECT_FALSE(a.is<Aligned<5>*>());
88 EXPECT_FALSE(a.is<Aligned<6>*>());
89 EXPECT_FALSE(a.is<Aligned<7>*>());
Richard Trieua9a92652019-05-17 01:17:32 +000090 EXPECT_EQ(a.dyn_cast<Aligned<0>*>(), &a0);
91 EXPECT_EQ(*a.getAddrOfPtr1(), &a0);
Richard Smith9b928752019-05-17 00:39:38 +000092
93 a = &a7;
94 EXPECT_FALSE(a.is<Aligned<0>*>());
95 EXPECT_FALSE(a.is<Aligned<1>*>());
96 EXPECT_FALSE(a.is<Aligned<2>*>());
97 EXPECT_FALSE(a.is<Aligned<3>*>());
98 EXPECT_FALSE(a.is<Aligned<4>*>());
99 EXPECT_FALSE(a.is<Aligned<5>*>());
100 EXPECT_FALSE(a.is<Aligned<6>*>());
101 EXPECT_TRUE(a.is<Aligned<7>*>());
Richard Trieua9a92652019-05-17 01:17:32 +0000102 EXPECT_EQ(a.dyn_cast<Aligned<7>*>(), &a7);
Richard Smith9b928752019-05-17 00:39:38 +0000103
104 EXPECT_TRUE(a == PU8(&a7));
105 EXPECT_TRUE(a != PU8(&a0));
106}
107
David Blaikiee2760b72013-08-21 21:30:23 +0000108} // end anonymous namespace