1// RUN: %clang_cc1 -fsyntax-only -verify %s 2struct ConvToBool { 3 operator bool() const; 4}; 5 6struct ConvToInt { 7 operator int(); 8}; 9 10struct ExplicitConvToBool { 11 explicit operator bool(); // expected-warning{{explicit conversion functions are a C++11 extension}} 12}; 13 14void test_conv_to_bool(ConvToBool ctb, ConvToInt cti, ExplicitConvToBool ecb) { 15 if (ctb) { } 16 if (cti) { } 17 if (ecb) { } 18 for (; ctb; ) { } 19 for (; cti; ) { } 20 for (; ecb; ) { } 21 while (ctb) { }; 22 while (cti) { } 23 while (ecb) { } 24 do { } while (ctb); 25 do { } while (cti); 26 do { } while (ecb); 27 28 if (!ctb) { } 29 if (!cti) { } 30 if (!ecb) { } 31 32 bool b1 = !ecb; 33 if (ctb && ecb) { } 34 bool b2 = ctb && ecb; 35 if (ctb || ecb) { } 36 bool b3 = ctb || ecb; 37} 38 39void accepts_bool(bool) { } // expected-note{{candidate function}} 40 41struct ExplicitConvToRef { 42 explicit operator int&(); // expected-warning{{explicit conversion functions are a C++11 extension}} 43}; 44 45void test_explicit_bool(ExplicitConvToBool ecb) { 46 bool b1(ecb); // okay 47 bool b2 = ecb; // expected-error{{no viable conversion from 'ExplicitConvToBool' to 'bool'}} 48 accepts_bool(ecb); // expected-error{{no matching function for call to}} 49} 50 51void test_explicit_conv_to_ref(ExplicitConvToRef ecr) { 52 int& i1 = ecr; // expected-error{{non-const lvalue reference to type 'int' cannot bind to a value of unrelated type 'ExplicitConvToRef'}} 53 int& i2(ecr); // okay 54} 55 56struct A { }; 57struct B { }; 58struct C { 59 explicit operator A&(); // expected-warning{{explicit conversion functions are a C++11 extension}} 60 operator B&(); // expected-note{{candidate}} 61}; 62 63void test_copy_init_conversions(C c) { 64 A &a = c; // expected-error{{no viable conversion from 'C' to 'A'}} 65 B &b = c; // okay 66} 67