brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 11e657a Raw
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