[llvm] r174357 - [Support][ErrorOr] Add support for convertable types.
Andrew Trick
atrick at apple.com
Tue Feb 5 14:53:01 PST 2013
On Feb 5, 2013, at 12:22 AM, Michael J. Spencer <bigcheesegs at gmail.com> wrote:
> Author: mspencer
> Date: Tue Feb 5 02:22:27 2013
> New Revision: 174357
>
> URL: http://llvm.org/viewvc/llvm-project?rev=174357&view=rev
> Log:
> [Support][ErrorOr] Add support for convertable types.
>
> Modified:
> llvm/trunk/include/llvm/Support/ErrorOr.h
> llvm/trunk/unittests/Support/ErrorOrTest.cpp
I temporarily reverted this because it's crashing a unit test and blocking the buildbots. I'm not sure yet what the proper workaround should be.
-Andy
ErrorOr.SimpleValue
[ OK ] ErrorOr.SimpleValueSupportTests(65303) malloc: *** error for object 0x100416988: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
0 SupportTests 0x0000000100253195 llvm::sys::PrintStackTrace(__sFILE*) + 37
1 SupportTests 0x0000000100253754 SignalHandler(int) + 676
2 libSystem.B.dylib 0x00007fff870631ba _sigtramp + 26
3 libSystem.B.dylib 0x0000000000004000 _sigtramp + 2029653600
4 libSystem.B.dylib 0x00007fff870e062d szone_error + 519
5 libSystem.B.dylib 0x00007fff87007a46 tiny_malloc_from_free_list + 715
6 libSystem.B.dylib 0x00007fff87006abd szone_malloc_should_clear + 242
7 libSystem.B.dylib 0x00007fff8700698a malloc_zone_malloc + 82
8 libSystem.B.dylib 0x00007fff87004c88 malloc + 44
9 libstdc++.6.dylib 0x00007fff84046f05 operator new(unsigned long) + 97
10 libstdc++.6.dylib 0x00007fff8402c4d1 std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) + 121
11 libstdc++.6.dylib 0x00007fff8402d052 std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long) + 44
12 libstdc++.6.dylib 0x00007fff8402d1d5 std::string::reserve(unsigned long) + 71
13 libstdc++.6.dylib 0x00007fff8402ae56 std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::overflow(int) + 188
14 libstdc++.6.dylib 0x00007fff84025a19 std::ostream::put(char) + 97
15 SupportTests 0x0000000100132104 testing::internal::StringStreamToString(std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >*) + 500
16 SupportTests 0x0000000100145b9a testing::internal::String testing::internal::StreamableToString<long long>(long long const&) + 698
17 SupportTests 0x000000010013bf0f testing::internal::PrettyUnitTestResultPrinter::OnTestEnd(testing::TestInfo const&) + 383
18 SupportTests 0x000000010013d294 testing::internal::TestEventRepeater::OnTestEnd(testing::TestInfo const&) + 84
-Andy
>
> Modified: llvm/trunk/include/llvm/Support/ErrorOr.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ErrorOr.h?rev=174357&r1=174356&r2=174357&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/ErrorOr.h (original)
> +++ llvm/trunk/include/llvm/Support/ErrorOr.h Tue Feb 5 02:22:27 2013
> @@ -162,6 +162,7 @@ public:
> /// T cannot be a rvalue reference.
> template<class T>
> class ErrorOr {
> + template <class OtherT> friend class ErrorOr;
> static const bool isRef = is_reference<T>::value;
> typedef ReferenceStorage<typename remove_reference<T>::type> wrap;
>
> @@ -198,7 +199,8 @@ public:
> new (get()) storage_type(moveIfMoveConstructible<storage_type>(Val));
> }
>
> - ErrorOr(const ErrorOr &Other) : IsValid(false) {
> + template <class OtherT>
> + ErrorOr(ErrorOr<OtherT> &Other) : IsValid(false) {
> // Construct an invalid ErrorOr if other is invalid.
> if (!Other.IsValid)
> return;
> @@ -227,7 +229,8 @@ public:
> }
>
> #if LLVM_HAS_RVALUE_REFERENCES
> - ErrorOr(ErrorOr &&Other) : IsValid(false) {
> + template <class OtherT>
> + ErrorOr(ErrorOr<OtherT> &&Other) : IsValid(false) {
> // Construct an invalid ErrorOr if other is invalid.
> if (!Other.IsValid)
> return;
> @@ -311,7 +314,6 @@ private:
> return &Val->get();
> }
>
> -protected:
> storage_type *get() {
> assert(IsValid && "Can't do anything on a default constructed ErrorOr!");
> assert(!HasError && "Cannot get value when an error exists!");
>
> Modified: llvm/trunk/unittests/Support/ErrorOrTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/ErrorOrTest.cpp?rev=174357&r1=174356&r2=174357&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/Support/ErrorOrTest.cpp (original)
> +++ llvm/trunk/unittests/Support/ErrorOrTest.cpp Tue Feb 5 02:22:27 2013
> @@ -53,6 +53,17 @@ TEST(ErrorOr, Types) {
> EXPECT_EQ(3, **t3());
> #endif
> }
> +
> +struct B {};
> +struct D : B {};
> +
> +TEST(ErrorOr, Covariant) {
> + ErrorOr<B*> b(ErrorOr<D*>(0));
> +
> +#if LLVM_HAS_CXX11_STDLIB
> + ErrorOr<std::unique_ptr<B> > b1(ErrorOr<std::unique_ptr<D> >(0));
> +#endif
> +}
> } // end anon namespace
>
> struct InvalidArgError {
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list