From 5d5cc59cc77afe655b3707cb0e69e0827b444cad Mon Sep 17 00:00:00 2001 From: dim Date: Fri, 17 Sep 2010 15:48:55 +0000 Subject: Vendor import of llvm r114020 (from the release_28 branch): http://llvm.org/svn/llvm-project/llvm/branches/release_28@114020 Approved by: rpaulo (mentor) --- unittests/Support/Casting.cpp | 154 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 unittests/Support/Casting.cpp (limited to 'unittests/Support/Casting.cpp') diff --git a/unittests/Support/Casting.cpp b/unittests/Support/Casting.cpp new file mode 100644 index 0000000..ae84693 --- /dev/null +++ b/unittests/Support/Casting.cpp @@ -0,0 +1,154 @@ +//===---------- llvm/unittest/Support/Casting.cpp - Casting tests ---------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Support/Casting.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/raw_ostream.h" + +#include "gtest/gtest.h" +#include + +namespace llvm { + +// set up two example classes +// with conversion facility +// +struct bar { + bar() {} + struct foo *baz(); + struct foo *caz(); + struct foo *daz(); + struct foo *naz(); +private: + bar(const bar &); +}; +struct foo { + void ext() const; + /* static bool classof(const bar *X) { + cerr << "Classof: " << X << "\n"; + return true; + }*/ +}; + +template <> struct isa_impl { + static inline bool doit(const bar &Val) { + dbgs() << "Classof: " << &Val << "\n"; + return true; + } +}; + +foo *bar::baz() { + return cast(this); +} + +foo *bar::caz() { + return cast_or_null(this); +} + +foo *bar::daz() { + return dyn_cast(this); +} + +foo *bar::naz() { + return dyn_cast_or_null(this); +} + + +bar *fub(); +} // End llvm namespace + +using namespace llvm; + +namespace { + +const foo *null_foo = NULL; + +extern bar &B1; +extern const bar *B2; +// test various configurations of const +const bar &B3 = B1; +const bar *const B4 = B2; + +TEST(CastingTest, isa) { + EXPECT_TRUE(isa(B1)); + EXPECT_TRUE(isa(B2)); + EXPECT_TRUE(isa(B3)); + EXPECT_TRUE(isa(B4)); +} + +TEST(CastingTest, cast) { + foo &F1 = cast(B1); + EXPECT_NE(&F1, null_foo); + const foo *F3 = cast(B2); + EXPECT_NE(F3, null_foo); + const foo *F4 = cast(B2); + EXPECT_NE(F4, null_foo); + const foo &F5 = cast(B3); + EXPECT_NE(&F5, null_foo); + const foo *F6 = cast(B4); + EXPECT_NE(F6, null_foo); + foo *F7 = cast(fub()); + EXPECT_EQ(F7, null_foo); + foo *F8 = B1.baz(); + EXPECT_NE(F8, null_foo); +} + +TEST(CastingTest, cast_or_null) { + const foo *F11 = cast_or_null(B2); + EXPECT_NE(F11, null_foo); + const foo *F12 = cast_or_null(B2); + EXPECT_NE(F12, null_foo); + const foo *F13 = cast_or_null(B4); + EXPECT_NE(F13, null_foo); + const foo *F14 = cast_or_null(fub()); // Shouldn't print. + EXPECT_EQ(F14, null_foo); + foo *F15 = B1.caz(); + EXPECT_NE(F15, null_foo); +} + +TEST(CastingTest, dyn_cast) { + const foo *F1 = dyn_cast(B2); + EXPECT_NE(F1, null_foo); + const foo *F2 = dyn_cast(B2); + EXPECT_NE(F2, null_foo); + const foo *F3 = dyn_cast(B4); + EXPECT_NE(F3, null_foo); + // foo *F4 = dyn_cast(fub()); // not permittible + // EXPECT_EQ(F4, null_foo); + foo *F5 = B1.daz(); + EXPECT_NE(F5, null_foo); +} + +TEST(CastingTest, dyn_cast_or_null) { + const foo *F1 = dyn_cast_or_null(B2); + EXPECT_NE(F1, null_foo); + const foo *F2 = dyn_cast_or_null(B2); + EXPECT_NE(F2, null_foo); + const foo *F3 = dyn_cast_or_null(B4); + EXPECT_NE(F3, null_foo); + foo *F4 = dyn_cast_or_null(fub()); + EXPECT_EQ(F4, null_foo); + foo *F5 = B1.naz(); + EXPECT_NE(F5, null_foo); +} + +// These lines are errors... +//foo *F20 = cast(B2); // Yields const foo* +//foo &F21 = cast(B3); // Yields const foo& +//foo *F22 = cast(B4); // Yields const foo* +//foo &F23 = cast_or_null(B1); +//const foo &F24 = cast_or_null(B3); + + +bar B; +bar &B1 = B; +const bar *B2 = &B; +} // anonymous namespace + +bar *llvm::fub() { return 0; } -- cgit v1.1