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 // UNSUPPORTED: c++98, c++03
11 
12 // "support/test_convertible.hpp"
13 
14 #include "test_convertible.hpp"
15 
16 struct ImplicitDefault {
ImplicitDefaultImplicitDefault17   ImplicitDefault() {}
18 };
19 static_assert(test_convertible<ImplicitDefault>(), "Must be convertible");
20 
21 struct ExplicitDefault {
ExplicitDefaultExplicitDefault22   explicit ExplicitDefault() {}
23 };
24 static_assert(!test_convertible<ExplicitDefault>(), "Must not be convertible");
25 
26 struct ImplicitInt {
ImplicitIntImplicitInt27   ImplicitInt(int) {}
28 };
29 static_assert(test_convertible<ImplicitInt, int>(), "Must be convertible");
30 
31 struct ExplicitInt {
ExplicitIntExplicitInt32   explicit ExplicitInt(int) {}
33 };
34 static_assert(!test_convertible<ExplicitInt, int>(), "Must not be convertible");
35 
36 struct ImplicitCopy {
ImplicitCopyImplicitCopy37   ImplicitCopy(ImplicitCopy const&) {}
38 };
39 static_assert(test_convertible<ImplicitCopy, ImplicitCopy>(), "Must be convertible");
40 
41 struct ExplicitCopy {
ExplicitCopyExplicitCopy42   explicit ExplicitCopy(ExplicitCopy const&) {}
43 };
44 static_assert(!test_convertible<ExplicitCopy, ExplicitCopy>(), "Must not be convertible");
45 
46 struct ImplicitMove {
ImplicitMoveImplicitMove47   ImplicitMove(ImplicitMove&&) {}
48 };
49 static_assert(test_convertible<ImplicitMove, ImplicitMove>(), "Must be convertible");
50 
51 struct ExplicitMove {
ExplicitMoveExplicitMove52   explicit ExplicitMove(ExplicitMove&&) {}
53 };
54 static_assert(!test_convertible<ExplicitMove, ExplicitMove>(), "Must not be convertible");
55 
56 struct ImplicitArgs {
ImplicitArgsImplicitArgs57   ImplicitArgs(int, int, int) {}
58 };
59 static_assert(test_convertible<ImplicitArgs, int, int, int>(), "Must be convertible");
60 
61 struct ExplicitArgs {
ExplicitArgsExplicitArgs62   explicit ExplicitArgs(int, int, int) {}
63 };
64 static_assert(!test_convertible<ExplicitArgs, int, int, int>(), "Must not be convertible");
65 
main()66 int main() {
67     // Nothing to do
68 }
69