1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
27a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlssonnamespace Constructor {
37a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlssonstruct A {
47a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson  A(int);
57a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson};
67a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson
7b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smithstruct B { // expected-note+ {{candidate}}
87a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson  explicit B(int);
97a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson};
107a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson
11b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithB::B(int) { } // expected-note+ {{here}}
127a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson
137a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlssonstruct C {
147a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson  void f(const A&);
157a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson  void f(const B&);
167a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson};
177a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson
187a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlssonvoid f(C c) {
197a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson  c.f(10);
207a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson}
21b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith
22b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithA a0 = 0;
23b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithA a1(0);
24b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithA &&a2 = 0;
25b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithA &&a3(0);
26b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithA a4{0};
27b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithA &&a5 = {0};
28b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithA &&a6{0};
29b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith
30b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithB b0 = 0; // expected-error {{no viable conversion}}
31b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithB b1(0);
32b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithB &&b2 = 0; // expected-error {{could not bind}}
33b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithB &&b3(0); // expected-error {{could not bind}}
34b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithB b4{0};
35b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithB &&b5 = {0}; // expected-error {{chosen constructor is explicit}}
36b390e49da4f140fab12732a1c99f4074f5f351a2Richard SmithB &&b6{0};
377a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson}
387a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson
397a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlssonnamespace Conversion {
407a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson  struct A {
417a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson    operator int();
427a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson    explicit operator bool();
437a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson  };
447a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson
457a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson  A::operator bool() { return false; }
467a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson
477a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson  struct B {
487a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson    void f(int);
497a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson    void f(bool);
507a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson  };
517a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson
527a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson  void f(A a, B b) {
537a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson    b.f(a);
547a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson  }
55bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
56bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor  void testExplicit()
57bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor  {
58bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // Taken from 12.3.2p2
590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    class X { X(); };
60b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    class Y { }; // expected-note+ {{candidate constructor (the implicit}}
61ed878af7914df535b32d64f555fa118413186672Douglas Gregor
62bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    struct Z {
63b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith      explicit operator X() const;
64bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor      explicit operator Y() const;
65bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor      explicit operator int() const;
66bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    };
67bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
68bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    Z z;
69bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 13.3.1.4p1 & 8.5p16:
709dd686d2be3c3785a089ff12a3d3eb64e9b32dc0Eli Friedman    Y y2 = z; // expected-error {{no viable conversion from 'Z' to 'Y'}}
71b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    Y y2b(z);
72ed878af7914df535b32d64f555fa118413186672Douglas Gregor    Y y3 = (Y)z;
73ed878af7914df535b32d64f555fa118413186672Douglas Gregor    Y y4 = Y(z);
74ed878af7914df535b32d64f555fa118413186672Douglas Gregor    Y y5 = static_cast<Y>(z);
75bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 13.3.1.5p1 & 8.5p16:
76bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    int i1 = (int)z;
77bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    int i2 = int(z);
78bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    int i3 = static_cast<int>(z);
79bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    int i4(z);
80bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 13.3.1.6p1 & 8.5.3p5:
819dd686d2be3c3785a089ff12a3d3eb64e9b32dc0Eli Friedman    const Y& y6 = z; // expected-error {{no viable conversion from 'Z' to 'const Y'}}
82b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const int& y7 = z; // expected-error {{no viable conversion from 'Z' to 'const int'}}
83b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const Y& y8(z);
84b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const int& y9(z);
85b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith
86b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    // Y is an aggregate, so aggregate-initialization is performed and the
87b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    // conversion function is not considered.
88b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const Y y10{z}; // expected-error {{excess elements}}
89176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    const Y& y11{z}; // expected-error {{excess elements}} expected-note {{in initialization of temporary of type 'const Y'}}
90b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const int& y12{z};
91b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith
920e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    // X is not an aggregate, so constructors are considered,
930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    // per 13.3.3.1/4 & DR1467.
940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    const X x1{z};
950e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    const X& x2{z};
96bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor  }
97bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
98bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor  void testBool() {
99bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    struct Bool {
100bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor      operator bool();
101bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    };
102bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
103bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    struct NotBool {
104bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor      explicit operator bool(); // expected-note {{conversion to integral type 'bool'}}
105bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    };
106bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    Bool    b;
107bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    NotBool n;
108bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
109bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    (void) (1 + b);
1109dd686d2be3c3785a089ff12a3d3eb64e9b32dc0Eli Friedman    (void) (1 + n); // expected-error {{invalid operands to binary expression ('int' and 'NotBool')}}
111bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
112bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 5.3.1p9:
113bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    (void) (!b);
114bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    (void) (!n);
115bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
116bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 5.14p1:
117bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    (void) (b && true);
118bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    (void) (n && true);
119bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
120bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 5.15p1:
121bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    (void) (b || true);
122bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    (void) (n || true);
123bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
124bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 5.16p1:
125bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    (void) (b ? 0 : 1);
126bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    (void) (n ? 0: 1);
127bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
128bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 5.19p5:
129bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // TODO: After constexpr has been implemented
130bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
131bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 6.4p4:
132bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    if (b) {}
133bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    if (n) {}
134bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
135bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 6.4.2p2:
136bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    switch (b) {} // expected-warning {{switch condition has boolean value}}
1379dd686d2be3c3785a089ff12a3d3eb64e9b32dc0Eli Friedman    switch (n) {} // expected-error {{switch condition type 'NotBool' requires explicit conversion to 'bool'}} \
138bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor                     expected-warning {{switch condition has boolean value}}
139bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
140bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 6.5.1:
141bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    while (b) {}
142bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    while (n) {}
143bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
144bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 6.5.2p1:
145bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    do {} while (b);
146bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    do {} while (n);
147bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
148bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 6.5.3:
149bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    for (;b;) {}
150bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    for (;n;) {}
151b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith
152b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    // 13.3.1.5p1:
153b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    bool direct1(b);
154b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    bool direct2(n);
155b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    int direct3(b);
156b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    int direct4(n); // expected-error {{no viable conversion}}
157b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const bool &direct5(b);
158b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const bool &direct6(n);
159b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const int &direct7(b);
160b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const int &direct8(n); // expected-error {{no viable conversion}}
161b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    bool directList1{b};
162b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    bool directList2{n};
163b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    int directList3{b};
164b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    int directList4{n}; // expected-error {{no viable conversion}}
165b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const bool &directList5{b};
166b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const bool &directList6{n};
167b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const int &directList7{b};
168b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const int &directList8{n}; // expected-error {{no viable conversion}}
169b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    bool copy1 = b;
170b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    bool copy2 = n; // expected-error {{no viable conversion}}
171b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    int copy3 = b;
172b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    int copy4 = n; // expected-error {{no viable conversion}}
173b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const bool &copy5 = b;
174b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const bool &copy6 = n; // expected-error {{no viable conversion}}
175b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const int &copy7 = b;
176b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const int &copy8 = n; // expected-error {{no viable conversion}}
177b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    bool copyList1 = {b};
178b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    bool copyList2 = {n}; // expected-error {{no viable conversion}}
179b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    int copyList3 = {b};
180b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    int copyList4 = {n}; // expected-error {{no viable conversion}}
181b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const bool &copyList5 = {b};
182b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const bool &copyList6 = {n}; // expected-error {{no viable conversion}}
183b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const int &copyList7 = {b};
184b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith    const int &copyList8 = {n}; // expected-error {{no viable conversion}}
185bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor  }
186bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
187bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor  void testNew()
188bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor  {
189bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 5.3.4p6:
190bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    struct Int {
191bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor      operator int();
192bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    };
193bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    struct NotInt {
194bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor      explicit operator int(); // expected-note {{conversion to integral type 'int' declared here}}
195bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    };
196bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
197bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    Int    i;
198bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    NotInt ni;
199bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
200bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    new int[i];
2019dd686d2be3c3785a089ff12a3d3eb64e9b32dc0Eli Friedman    new int[ni]; // expected-error {{array size expression of type 'NotInt' requires explicit conversion to type 'int'}}
202bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor  }
203bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
204bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor  void testDelete()
205bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor  {
206bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 5.3.5pp2:
207bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    struct Ptr {
208bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor      operator int*();
209bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    };
210bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    struct NotPtr {
211097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith      explicit operator int*(); // expected-note {{conversion}}
212bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    };
213bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
214bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    Ptr    p;
215bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    NotPtr np;
216bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
217bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    delete p;
218097e0a2cb08c8244a6923489acc8f890e6a99b59Richard Smith    delete np; // expected-error {{converting delete expression from type 'NotPtr' to type 'int *' invokes an explicit conversion function}}
219bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor  }
220bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
221bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor  void testFunctionPointer()
222bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor  {
223bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    // 13.3.1.1.2p2:
224bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    using Func = void(*)(int);
225bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
226bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    struct FP {
227bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor      operator Func();
228bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    };
229bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    struct NotFP {
230bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor      explicit operator Func();
231bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    };
232bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor
233bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    FP    fp;
234bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    NotFP nfp;
235bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor    fp(1);
2369dd686d2be3c3785a089ff12a3d3eb64e9b32dc0Eli Friedman    nfp(1); // expected-error {{type 'NotFP' does not provide a call operator}}
237bf6e3179eaf66b3eca43cbdbd09b71db40fa85fcDouglas Gregor  }
2387a6e13aa2e3874fecf45043ed1a26900b8c13b98Anders Carlsson}
239d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov
240d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlovnamespace pr8264 {
241d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  struct Test {
242d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  explicit explicit Test(int x);  // expected-warning{{duplicate 'explicit' declaration specifier}}
243d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  };
244d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov}
245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace PR18777 {
247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct S { explicit operator bool() const; } s;
248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int *p = new int(s); // expected-error {{no viable conversion}}
249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
250