value_const.pass.cpp revision 0cdbe6048173c1f05628dbc85430acf191a3e173
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//===----------------------------------------------------------------------===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// This file is dual licensed under the MIT and the University of Illinois Open
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Source Licenses. See LICENSE.TXT for details.
768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <optional>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// constexpr const T& optional<T>::value() const;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <experimental/optional>
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <type_traits>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cassert>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if _LIBCPP_STD_VER > 11
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::experimental::optional;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::experimental::in_place_t;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::experimental::in_place;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::experimental::bad_optional_access;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)struct X
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles){
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    X() = default;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    X(const X&) = delete;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   constexpr int test() const {return 3;}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int test() {return 4;}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif  // _LIBCPP_STD_VER > 11
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main()
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if _LIBCPP_STD_VER > 11
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        constexpr optional<X> opt(in_place);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_assert(opt.value().test() == 3, "");
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        const optional<X> opt(in_place);
4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        assert(opt.value().test() == 3);
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    {
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        const optional<X> opt;
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        try
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        {
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            opt.value();
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            assert(false);
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        }
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        catch (const bad_optional_access&)
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        {
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        }
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // _LIBCPP_STD_VER > 11
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)