diff options
-rw-r--r-- | test/SemaCXX/convert-to-bool.cpp | 67 | ||||
-rw-r--r-- | test/SemaCXX/member-expr.cpp | 4 |
2 files changed, 69 insertions, 2 deletions
diff --git a/test/SemaCXX/convert-to-bool.cpp b/test/SemaCXX/convert-to-bool.cpp new file mode 100644 index 0000000000..1b57214d08 --- /dev/null +++ b/test/SemaCXX/convert-to-bool.cpp @@ -0,0 +1,67 @@ +// RUN: clang -fsyntax-only -verify %s +struct ConvToBool { + operator bool() const; +}; + +struct ConvToInt { + operator int(); +}; + +struct ExplicitConvToBool { + explicit operator bool(); // expected-warning{{explicit conversion functions are a C++0x extension}} +}; + +void test_conv_to_bool(ConvToBool ctb, ConvToInt cti, ExplicitConvToBool ecb) { + if (ctb) { } + if (cti) { } + if (ecb) { } + for (; ctb; ) { } + for (; cti; ) { } + for (; ecb; ) { } + while (ctb) { }; + while (cti) { } + while (ecb) { } + do { } while (ctb); + do { } while (cti); + do { } while (ecb); + + if (!ctb) { } + if (!cti) { } + if (!ecb) { } + + bool b1 = !ecb; + if (ctb && ecb) { } + bool b2 = ctb && ecb; + if (ctb || ecb) { } + bool b3 = ctb || ecb; +} + +void accepts_bool(bool) { } + +struct ExplicitConvToRef { + explicit operator int&(); // expected-warning{{explicit conversion functions are a C++0x extension}} +}; + +void test_explicit_bool(ExplicitConvToBool ecb) { + bool b1(ecb); // okay + bool b2 = ecb; // expected-error{{incompatible type initializing 'struct ExplicitConvToBool', expected '_Bool'}} + accepts_bool(ecb); // expected-error{{incompatible type passing 'struct ExplicitConvToBool', expected '_Bool'}} +} + +void test_explicit_conv_to_ref(ExplicitConvToRef ecr) { + int& i1 = ecr; // expected-error{{non-const reference to type 'int' cannot be initialized with a value of type 'struct ExplicitConvToRef'}} + int& i2(ecr); // okay +} + +struct A { }; +struct B { }; +struct C { + explicit operator A&(); // expected-warning{{explicit conversion functions are a C++0x extension}} + operator B&(); +}; + +void test_copy_init_conversions(C c) { + A &a = c; // expected-error{{non-const reference to type 'struct A' cannot be initialized with a value of type 'struct C'}} + B &b = b; // okay +} + diff --git a/test/SemaCXX/member-expr.cpp b/test/SemaCXX/member-expr.cpp index 0175bd6f13..d5f9347ece 100644 --- a/test/SemaCXX/member-expr.cpp +++ b/test/SemaCXX/member-expr.cpp @@ -13,8 +13,8 @@ void test(X* xp, X x) { int i2 = xp->f(); x.E; // expected-error{{cannot refer to type member 'E' with '.'}} xp->E; // expected-error{{cannot refer to type member 'E' with '->'}} - // FIXME: lookup needs to find enumerators int i3 = x.Enumerator; - // FIXME: int i4 = xp->Enumerator; + int i3 = x.Enumerator; + int i4 = xp->Enumerator; x.mem = 1; xp->mem = 2; float f1 = x.g(); |