112 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/ADT/PointerSumType.h"10#include "gtest/gtest.h"11using namespace llvm;12 13namespace {14 15struct PointerSumTypeTest : public testing::Test {16 enum Kinds { Float, Int1, Int2 };17 float f;18 int i1, i2;19 20 using SumType = PointerSumType<Kinds, PointerSumTypeMember<Float, float *>,21 PointerSumTypeMember<Int1, int *>,22 PointerSumTypeMember<Int2, int *>>;23 SumType a, b, c, n;24 25 PointerSumTypeTest()26 : f(3.14f), i1(42), i2(-1), a(SumType::create<Float>(&f)),27 b(SumType::create<Int1>(&i1)), c(SumType::create<Int2>(&i2)), n() {}28};29 30TEST_F(PointerSumTypeTest, NullTest) {31 EXPECT_TRUE(a);32 EXPECT_TRUE(b);33 EXPECT_TRUE(c);34 EXPECT_FALSE(n);35}36 37TEST_F(PointerSumTypeTest, GetTag) {38 EXPECT_EQ(Float, a.getTag());39 EXPECT_EQ(Int1, b.getTag());40 EXPECT_EQ(Int2, c.getTag());41 EXPECT_EQ((Kinds)0, n.getTag());42}43 44TEST_F(PointerSumTypeTest, Is) {45 EXPECT_TRUE(a.is<Float>());46 EXPECT_FALSE(a.is<Int1>());47 EXPECT_FALSE(a.is<Int2>());48 EXPECT_FALSE(b.is<Float>());49 EXPECT_TRUE(b.is<Int1>());50 EXPECT_FALSE(b.is<Int2>());51 EXPECT_FALSE(c.is<Float>());52 EXPECT_FALSE(c.is<Int1>());53 EXPECT_TRUE(c.is<Int2>());54}55 56TEST_F(PointerSumTypeTest, Get) {57 EXPECT_EQ(&f, a.get<Float>());58 EXPECT_EQ(nullptr, a.get<Int1>());59 EXPECT_EQ(nullptr, a.get<Int2>());60 EXPECT_EQ(nullptr, b.get<Float>());61 EXPECT_EQ(&i1, b.get<Int1>());62 EXPECT_EQ(nullptr, b.get<Int2>());63 EXPECT_EQ(nullptr, c.get<Float>());64 EXPECT_EQ(nullptr, c.get<Int1>());65 EXPECT_EQ(&i2, c.get<Int2>());66 67 // Note that we can use .get even on a null sum type. It just always produces68 // a null pointer, even if one of the discriminants is null.69 EXPECT_EQ(nullptr, n.get<Float>());70 EXPECT_EQ(nullptr, n.get<Int1>());71 EXPECT_EQ(nullptr, n.get<Int2>());72}73 74TEST_F(PointerSumTypeTest, Cast) {75 EXPECT_EQ(&f, a.cast<Float>());76 EXPECT_EQ(&i1, b.cast<Int1>());77 EXPECT_EQ(&i2, c.cast<Int2>());78}79 80TEST_F(PointerSumTypeTest, Assignment) {81 b = SumType::create<Int2>(&i2);82 EXPECT_EQ(nullptr, b.get<Float>());83 EXPECT_EQ(nullptr, b.get<Int1>());84 EXPECT_EQ(&i2, b.get<Int2>());85 86 b = SumType::create<Int2>(&i1);87 EXPECT_EQ(nullptr, b.get<Float>());88 EXPECT_EQ(nullptr, b.get<Int1>());89 EXPECT_EQ(&i1, b.get<Int2>());90 91 float Local = 1.616f;92 b = SumType::create<Float>(&Local);93 EXPECT_EQ(&Local, b.get<Float>());94 EXPECT_EQ(nullptr, b.get<Int1>());95 EXPECT_EQ(nullptr, b.get<Int2>());96 97 n = SumType::create<Int1>(&i2);98 EXPECT_TRUE(n);99 EXPECT_EQ(nullptr, n.get<Float>());100 EXPECT_EQ(&i2, n.get<Int1>());101 EXPECT_EQ(nullptr, n.get<Int2>());102 103 n = SumType::create<Float>(nullptr);104 EXPECT_FALSE(n);105 EXPECT_EQ(nullptr, n.get<Float>());106 EXPECT_EQ(nullptr, n.get<Int1>());107 EXPECT_EQ(nullptr, n.get<Int2>());108}109 110 111} // end anonymous namespace112