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