Eric Fiselier 031a3d203a [libcxx] Mark most test/std/future tests as UNSUPPORTED in C++03
Summary:
This patch marks *most* tests for `std::promise`, `std::future` and `std::shared_future` as unsupported in C++03. These tests fail in C++03 mode because they attempt to copy a `std::future` even though it is a `MoveOnly` type. AFAIK the missing move-semantics in `std::future` is the only reason these tests fail but without move semantics these classes are useless. For example even though `std::promise::set_value` and `std::promise::set_exception(...)` work in C++03 `std::promise` is still useless because we cannot call `std::promise::get_future(...)`.

It might be possible to hack `std::move(...)` like we do for `std::unique_ptr` to make the move semantics work but I don't think it is worth the effort. Instead I think we should leave the `<future>` header as-is and mark the failing tests as `UNSUPPORTED`. I don't believe there are any users of `std::future` or `std::promise` in C++03 because they are so unusable. Therefore I am not concerned about losing test coverage and possibly breaking users. However because there are still parts of `<future>` that work in C++03 it would be wrong to `#ifdef` out the entire header.

@mclow.lists Should we take further steps to prevent the use of `std::promise`, `std::future` and `std::shared_future` in C++03?


Note: This patch also cleans up the tests and converts them to use `support/test_allocator.h` instead of a duplicate class in `test/std/futures/test_allocator.h`.

Reviewers: mclow.lists

Subscribers: vsk, mclow.lists, cfe-commits

Differential Revision: http://reviews.llvm.org/D12135

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@246271 91177308-0d34-0410-b5e6-96231b3b80d8
2015-08-28 05:06:04 +00:00

50 lines
1.3 KiB
C++

//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <future>
// class future<R>
// future& operator=(const future&) = delete;
#include <future>
#include "test_macros.h"
int main()
{
#if TEST_STD_VER >= 11
{
std::future<int> f0, f;
f = f0; // expected-error {{overload resolution selected deleted operator '='}}
}
{
std::future<int &> f0, f;
f = f0; // expected-error {{overload resolution selected deleted operator '='}}
}
{
std::future<void> f0, f;
f = f0; // expected-error {{overload resolution selected deleted operator '='}}
}
#else
{
std::future<int> f0, f;
f = f0; // expected-error {{'operator=' is a private member of 'std::__1::future<int>'}}
}
{
std::future<int &> f0, f;
f = f0; // expected-error {{'operator=' is a private member of 'std::__1::future<int &>'}}
}
{
std::future<void> f0, f;
f = f0; // expected-error {{'operator=' is a private member of 'std::__1::future<void>'}}
}
#endif
}