thrust / dependencies /libcudacxx /libcxx /test /std /utilities /optional /optional.object /optional.object.observe /dereference.pass.cpp
| //===----------------------------------------------------------------------===// | |
| // | |
| // 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> | |
| // constexpr T& optional<T>::operator*() &; | |
| using std::optional; | |
| struct X | |
| { | |
| constexpr int test() const& {return 3;} | |
| int test() & {return 4;} | |
| constexpr int test() const&& {return 5;} | |
| int test() && {return 6;} | |
| }; | |
| struct Y | |
| { | |
| constexpr int test() {return 7;} | |
| }; | |
| constexpr int | |
| test() | |
| { | |
| optional<Y> opt{Y{}}; | |
| return (*opt).test(); | |
| } | |
| int main(int, char**) | |
| { | |
| { | |
| optional<X> opt; ((void)opt); | |
| ASSERT_SAME_TYPE(decltype(*opt), X&); | |
| // ASSERT_NOT_NOEXCEPT(*opt); | |
| // FIXME: This assertion fails with GCC because it can see that | |
| // (A) operator*() is constexpr, and | |
| // (B) there is no path through the function that throws. | |
| // It's arguable if this is the correct behavior for the noexcept | |
| // operator. | |
| // Regardless this function should still be noexcept(false) because | |
| // it has a narrow contract. | |
| } | |
| { | |
| optional<X> opt(X{}); | |
| assert((*opt).test() == 4); | |
| } | |
| static_assert(test() == 7, ""); | |
| { | |
| optional<X> opt; | |
| assert((*opt).test() == 3); | |
| assert(false); | |
| } | |
| return 0; | |
| } | |