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 ©5 = b; 174b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith const bool ©6 = n; // expected-error {{no viable conversion}} 175b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith const int ©7 = b; 176b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith const int ©8 = 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 ©List5 = {b}; 182b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith const bool ©List6 = {n}; // expected-error {{no viable conversion}} 183b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith const int ©List7 = {b}; 184b390e49da4f140fab12732a1c99f4074f5f351a2Richard Smith const int ©List8 = {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