1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // UNSUPPORTED: c++03, c++11, c++14
10 // <optional>
11 
12 // T shall be an object type and shall satisfy the requirements of Destructible
13 
14 #include <optional>
15 
16 using std::optional;
17 
18 struct X
19 {
20 private:
~XX21     ~X() {}
22 };
23 
main(int,char **)24 int main(int, char**)
25 {
26     using std::optional;
27     {
28         // expected-error-re@optional:* 2 {{static assertion failed{{.*}}instantiation of optional with a reference type is ill-formed}}
29         optional<int&> opt1;
30         optional<int&&> opt2;
31     }
32     {
33         // expected-error-re@optional:* {{static assertion failed{{.*}}instantiation of optional with a non-destructible type is ill-formed}}
34         optional<X> opt3;
35     }
36     {
37         // expected-error-re@optional:* {{static assertion failed{{.*}}instantiation of optional with a non-object type is undefined behavior}}
38         // expected-error-re@optional:* {{static assertion failed{{.*}}instantiation of optional with a non-destructible type is ill-formed}}
39         optional<void()> opt4;
40     }
41     {
42         // expected-error-re@optional:* {{static assertion failed{{.*}}instantiation of optional with a non-object type is undefined behavior}}
43         // expected-error-re@optional:* {{static assertion failed{{.*}}instantiation of optional with a non-destructible type is ill-formed}}
44         // expected-error@optional:* 1+ {{cannot form a reference to 'void'}}
45         optional<const void> opt4;
46     }
47     // FIXME these are garbage diagnostics that Clang should not produce
48     // expected-error@optional:* 0+ {{is not a base class}}
49 
50   return 0;
51 }
52