blob: b52f11c93d39a40d0575796ad8d52ca53b186cfc [file] [log] [blame]
Daniel Dunbara5728872009-12-15 20:14:24 +00001// RUN: %clang_cc1 -fsyntax-only -verify %s
Douglas Gregor76f7d282009-01-16 03:02:29 +00002struct ConvToBool {
3 operator bool() const;
4};
5
6struct ConvToInt {
7 operator int();
8};
9
10struct ExplicitConvToBool {
Douglas Gregorb3df1382011-10-12 19:26:40 +000011 explicit operator bool(); // expected-warning{{explicit conversion functions are a C++11 extension}}
Douglas Gregor76f7d282009-01-16 03:02:29 +000012};
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
Douglas Gregorfa047642009-02-04 00:32:51 +000039void accepts_bool(bool) { } // expected-note{{candidate function}}
Douglas Gregor76f7d282009-01-16 03:02:29 +000040
41struct ExplicitConvToRef {
Douglas Gregorb3df1382011-10-12 19:26:40 +000042 explicit operator int&(); // expected-warning{{explicit conversion functions are a C++11 extension}}
Douglas Gregor76f7d282009-01-16 03:02:29 +000043};
44
45void test_explicit_bool(ExplicitConvToBool ecb) {
46 bool b1(ecb); // okay
John McCall7c2342d2010-03-10 11:27:22 +000047 bool b2 = ecb; // expected-error{{no viable conversion from 'ExplicitConvToBool' to 'bool'}}
Douglas Gregorfa047642009-02-04 00:32:51 +000048 accepts_bool(ecb); // expected-error{{no matching function for call to}}
Douglas Gregor76f7d282009-01-16 03:02:29 +000049}
50
51void test_explicit_conv_to_ref(ExplicitConvToRef ecr) {
John McCall7c2342d2010-03-10 11:27:22 +000052 int& i1 = ecr; // expected-error{{non-const lvalue reference to type 'int' cannot bind to a value of unrelated type 'ExplicitConvToRef'}}
Douglas Gregor76f7d282009-01-16 03:02:29 +000053 int& i2(ecr); // okay
54}
55
56struct A { };
57struct B { };
58struct C {
Douglas Gregorb3df1382011-10-12 19:26:40 +000059 explicit operator A&(); // expected-warning{{explicit conversion functions are a C++11 extension}}
Douglas Gregor20093b42009-12-09 23:02:17 +000060 operator B&(); // expected-note{{candidate}}
Douglas Gregor76f7d282009-01-16 03:02:29 +000061};
62
63void test_copy_init_conversions(C c) {
John McCall7c2342d2010-03-10 11:27:22 +000064 A &a = c; // expected-error{{no viable conversion from 'C' to 'A'}}
Hans Wennborg8be9e772012-08-17 10:12:33 +000065 B &b = c; // okay
Douglas Gregor76f7d282009-01-16 03:02:29 +000066}