diff --git a/include/optional b/include/optional index 1f8e491da..a76f8d189 100644 --- a/include/optional +++ b/include/optional @@ -139,6 +139,10 @@ namespace std { private: T *val; // exposition only }; + +template + optional(T) -> optional; + } // namespace std */ @@ -1003,6 +1007,11 @@ private: } }; +#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES +template + optional(T) -> optional; +#endif + // Comparisons between optionals template _LIBCPP_INLINE_VISIBILITY constexpr diff --git a/test/std/utilities/optional/optional.object/optional.object.ctor/deduct.fail.cpp b/test/std/utilities/optional/optional.object/optional.object.ctor/deduct.fail.cpp new file mode 100644 index 000000000..4ebafad6b --- /dev/null +++ b/test/std/utilities/optional/optional.object/optional.object.ctor/deduct.fail.cpp @@ -0,0 +1,38 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// +// UNSUPPORTED: c++98, c++03, c++11, c++14 +// UNSUPPORTED: libcpp-no-deduction-guides + + +// template +// optional(T) -> optional; + + +#include +#include + +struct A {}; + +int main() +{ +// Test the explicit deduction guides + +// Test the implicit deduction guides + { +// optional() + std::optional opt; // expected-error {{no viable constructor or deduction guide for deduction of template arguments of 'optional'}} + } + + { +// optional(nullopt_t) + std::optional opt(std::nullopt); // expected-error-re@optional:* {{static_assert failed{{.*}} "instantiation of optional with nullopt_t is ill-formed"}} + } +} diff --git a/test/std/utilities/optional/optional.object/optional.object.ctor/deduct.pass.cpp b/test/std/utilities/optional/optional.object/optional.object.ctor/deduct.pass.cpp new file mode 100644 index 000000000..1ef7a3a34 --- /dev/null +++ b/test/std/utilities/optional/optional.object/optional.object.ctor/deduct.pass.cpp @@ -0,0 +1,44 @@ +//===----------------------------------------------------------------------===// +// +// 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. +// +//===----------------------------------------------------------------------===// + +// +// UNSUPPORTED: c++98, c++03, c++11, c++14 +// UNSUPPORTED: libcpp-no-deduction-guides + + +// template +// optional(T) -> optional; + + +#include +#include + +struct A {}; + +int main() +{ +// Test the explicit deduction guides + { +// optional(T) + std::optional opt(5); + static_assert(std::is_same_v>, ""); + assert(static_cast(opt)); + assert(*opt == 5); + } + + { +// optional(T) + std::optional opt(A{}); + static_assert(std::is_same_v>, ""); + assert(static_cast(opt)); + } + +// Test the implicit deduction guides + +}