diff options
author | Marshall Clow <mclow.lists@gmail.com> | 2019-03-25 16:35:59 +0000 |
---|---|---|
committer | Marshall Clow <mclow.lists@gmail.com> | 2019-03-25 16:35:59 +0000 |
commit | 36db4898740f21ddb9761815729266c2f5f3672b (patch) | |
tree | b16ee30302eab546593a672a6968aefeb62ae5d2 /libcxx/test | |
parent | 524e5e901947d4c2fe56f7ed412d949ca453a7f6 (diff) | |
download | bcm5719-llvm-36db4898740f21ddb9761815729266c2f5f3672b.tar.gz bcm5719-llvm-36db4898740f21ddb9761815729266c2f5f3672b.zip |
Cleaup of requirements for optional. While researching LWG3196, I realized that optional did not reject 'const in_place_t' like it should. Added a test as well, and a check for arrays (which were already disallowed, but now we get a better error message). Should not affect anyone's code.
llvm-svn: 356918
Diffstat (limited to 'libcxx/test')
-rw-r--r-- | libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.fail.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.fail.cpp b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.fail.cpp new file mode 100644 index 00000000000..9a646a18154 --- /dev/null +++ b/libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.fail.cpp @@ -0,0 +1,47 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14 +// <optional> + +// T shall be an object type other than cv in_place_t or cv nullopt_t +// and shall satisfy the Cpp17Destructible requirements. +// Note: array types do not satisfy the Cpp17Destructible requirements. + +#include <optional> +#include <type_traits> +#include <cassert> + +#include "test_macros.h" + +struct NonDestructible { ~NonDestructible() = delete; }; + +int main(int, char**) +{ + { + std::optional<char &> o1; // expected-error-re@optional:* {{static_assert failed{{.*}} "instantiation of optional with a reference type is ill-formed"}} + std::optional<NonDestructible> o2; // expected-error-re@optional:* {{static_assert failed{{.*}} "instantiation of optional with a non-destructible type is ill-formed"}} + std::optional<char[20]> o3; // expected-error-re@optional:* {{static_assert failed{{.*}} "instantiation of optional with an array type is ill-formed"}} + } + + { + std::optional< std::in_place_t> o1; // expected-error-re@optional:* {{static_assert failed{{.*}} "instantiation of optional with in_place_t is ill-formed"}} + std::optional<const std::in_place_t> o2; // expected-error-re@optional:* {{static_assert failed{{.*}} "instantiation of optional with in_place_t is ill-formed"}} + std::optional< volatile std::in_place_t> o3; // expected-error-re@optional:* {{static_assert failed{{.*}} "instantiation of optional with in_place_t is ill-formed"}} + std::optional<const volatile std::in_place_t> o4; // expected-error-re@optional:* {{static_assert failed{{.*}} "instantiation of optional with in_place_t is ill-formed"}} + } + + { + std::optional< std::nullopt_t> o1; // expected-error-re@optional:* {{static_assert failed{{.*}} "instantiation of optional with nullopt_t is ill-formed"}} + std::optional<const std::nullopt_t> o2; // expected-error-re@optional:* {{static_assert failed{{.*}} "instantiation of optional with nullopt_t is ill-formed"}} + std::optional< volatile std::nullopt_t> o3; // expected-error-re@optional:* {{static_assert failed{{.*}} "instantiation of optional with nullopt_t is ill-formed"}} + std::optional<const volatile std::nullopt_t> o4; // expected-error-re@optional:* {{static_assert failed{{.*}} "instantiation of optional with nullopt_t is ill-formed"}} + } + + return 0; +} |