ErrorOrTest.cpp revision 37ed9c199ca639565f6ce88105f9e39e898d82d0
101812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer//===- unittests/ErrorOrTest.cpp - ErrorOr.h tests ------------------------===// 201812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer// 301812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer// The LLVM Compiler Infrastructure 401812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer// 501812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer// This file is distributed under the University of Illinois Open Source 601812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer// License. See LICENSE.TXT for details. 701812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer// 801812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer//===----------------------------------------------------------------------===// 901812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer 1001812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer#include "llvm/Support/ErrorOr.h" 11c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "llvm/Support/Errc.h" 1201812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer#include "gtest/gtest.h" 1301812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer#include <memory> 1401812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer 1501812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencerusing namespace llvm; 1601812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer 1701812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencernamespace { 1801812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer 1901812bebcc345b09ce261317b6fdefde8f097642Michael J. SpencerErrorOr<int> t1() {return 1;} 209b4886ee55c4d13cf0f663fe0ee5e0cfacb39667Michael J. SpencerErrorOr<int> t2() { return errc::invalid_argument; } 2101812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer 2201812bebcc345b09ce261317b6fdefde8f097642Michael J. SpencerTEST(ErrorOr, SimpleValue) { 2301812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer ErrorOr<int> a = t1(); 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // FIXME: This is probably a bug in gtest. EXPECT_TRUE should expand to 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // include the !! to make it friendly to explicit bool operators. 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_TRUE(!!a); 2701812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer EXPECT_EQ(1, *a); 2801812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines ErrorOr<int> b = a; 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines EXPECT_EQ(1, *b); 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3201812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer a = t2(); 3301812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer EXPECT_FALSE(a); 34c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines EXPECT_EQ(a.getError(), errc::invalid_argument); 3593d61374f3a12251aa6cc24bea0e0829ad23cdd0NAKAMURA Takumi#ifdef EXPECT_DEBUG_DEATH 3601812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer EXPECT_DEBUG_DEATH(*a, "Cannot get value when an error exists"); 3793d61374f3a12251aa6cc24bea0e0829ad23cdd0NAKAMURA Takumi#endif 3801812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer} 3901812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer 4001812bebcc345b09ce261317b6fdefde8f097642Michael J. SpencerErrorOr<std::unique_ptr<int> > t3() { 4101812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer return std::unique_ptr<int>(new int(3)); 4201812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer} 4301812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer 4401812bebcc345b09ce261317b6fdefde8f097642Michael J. SpencerTEST(ErrorOr, Types) { 4501812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer int x; 4601812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer ErrorOr<int&> a(x); 4701812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer *a = 42; 4801812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer EXPECT_EQ(42, x); 4901812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer 5001812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer // Move only types. 5101812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer EXPECT_EQ(3, **t3()); 5201812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer} 53780e9004c85ee33a0bdd592aebe9b959f29c4fb2Michael J. Spencer 54780e9004c85ee33a0bdd592aebe9b959f29c4fb2Michael J. Spencerstruct B {}; 55780e9004c85ee33a0bdd592aebe9b959f29c4fb2Michael J. Spencerstruct D : B {}; 56780e9004c85ee33a0bdd592aebe9b959f29c4fb2Michael J. Spencer 57780e9004c85ee33a0bdd592aebe9b959f29c4fb2Michael J. SpencerTEST(ErrorOr, Covariant) { 58c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines ErrorOr<B*> b(ErrorOr<D*>(nullptr)); 59c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines b = ErrorOr<D*>(nullptr); 60780e9004c85ee33a0bdd592aebe9b959f29c4fb2Michael J. Spencer 61c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines ErrorOr<std::unique_ptr<B> > b1(ErrorOr<std::unique_ptr<D> >(nullptr)); 62c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines b1 = ErrorOr<std::unique_ptr<D> >(nullptr); 6337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 6437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ErrorOr<std::unique_ptr<int>> b2(ErrorOr<int *>(nullptr)); 6537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ErrorOr<int *> b3(nullptr); 6637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ErrorOr<std::unique_ptr<int>> b4(b3); 67780e9004c85ee33a0bdd592aebe9b959f29c4fb2Michael J. Spencer} 6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 6937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// ErrorOr<int*> x(nullptr); 7037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// ErrorOr<std::unique_ptr<int>> y = x; // invalid conversion 7137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic_assert( 7237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines !std::is_convertible<const ErrorOr<int *> &, 7337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ErrorOr<std::unique_ptr<int>>>::value, 7437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines "do not invoke explicit ctors in implicit conversion from lvalue"); 7537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 7637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// ErrorOr<std::unique_ptr<int>> y = ErrorOr<int*>(nullptr); // invalid 7737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// // conversion 7837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic_assert( 7937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines !std::is_convertible<ErrorOr<int *> &&, 8037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ErrorOr<std::unique_ptr<int>>>::value, 8137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines "do not invoke explicit ctors in implicit conversion from rvalue"); 8237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 8337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// ErrorOr<int*> x(nullptr); 8437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// ErrorOr<std::unique_ptr<int>> y; 8537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// y = x; // invalid conversion 8637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic_assert(!std::is_assignable<ErrorOr<std::unique_ptr<int>>, 8737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const ErrorOr<int *> &>::value, 8837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines "do not invoke explicit ctors in assignment"); 8937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 9037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// ErrorOr<std::unique_ptr<int>> x; 9137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// x = ErrorOr<int*>(nullptr); // invalid conversion 9237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesstatic_assert(!std::is_assignable<ErrorOr<std::unique_ptr<int>>, 9337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines ErrorOr<int *> &&>::value, 9437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines "do not invoke explicit ctors in assignment"); 9501812bebcc345b09ce261317b6fdefde8f097642Michael J. Spencer} // end anon namespace 96