• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // <optional>
11 // UNSUPPORTED: c++98, c++03, c++11, c++14
12 // UNSUPPORTED: clang-5
13 // UNSUPPORTED: libcpp-no-deduction-guides
14 // Clang 5 will generate bad implicit deduction guides
15 //  Specifically, for the copy constructor.
16 
17 
18 // template<class T>
19 //   optional(T) -> optional<T>;
20 
21 
22 #include <optional>
23 #include <cassert>
24 
25 struct A {};
26 
main()27 int main()
28 {
29 //  Test the explicit deduction guides
30 
31 //  Test the implicit deduction guides
32     {
33 //  optional()
34     std::optional opt;   // expected-error-re {{{{declaration of variable 'opt' with deduced type 'std::optional' requires an initializer|no viable constructor or deduction guide for deduction of template arguments of 'optional'}}}}
35 //  clang-6 gives a bogus error here:
36 //      declaration of variable 'opt' with deduced type 'std::optional' requires an initializer
37 //  clang-7 (and later) give a better message:
38 //      no viable constructor or deduction guide for deduction of template arguments of 'optional'
39 //  So we check for one or the other.
40     }
41 
42     {
43 //  optional(nullopt_t)
44     std::optional opt(std::nullopt);   // expected-error-re@optional:* {{static_assert failed{{.*}} "instantiation of optional with nullopt_t is ill-formed"}}
45     }
46 }
47