summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-08-24 17:42:35 +0000
committerDouglas Gregor <dgregor@apple.com>2009-08-24 17:42:35 +0000
commitb00b10eb2e3d058f3b0a8312b63bb1c3ae8bcc4a (patch)
tree5367681f6bb2f6d1862025353c013dfd6293f1db /clang/test
parente6434cb421b664f9be7ec2f5fd2f4975a2422f5e (diff)
downloadbcm5719-llvm-b00b10eb2e3d058f3b0a8312b63bb1c3ae8bcc4a.tar.gz
bcm5719-llvm-b00b10eb2e3d058f3b0a8312b63bb1c3ae8bcc4a.zip
Implement support for equality comparisons (!=, ==) of member
pointers, by extending the "composite pointer type" logic to include member pointer types. Introduce test cases for member pointer comparisons, including those that involve the builtin operator candidates implemented earlier. llvm-svn: 79925
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/SemaCXX/composite-pointer-type.cpp8
-rw-r--r--clang/test/SemaCXX/conditional-expr.cpp2
-rw-r--r--clang/test/SemaCXX/member-pointer.cpp8
-rw-r--r--clang/test/SemaCXX/overloaded-builtin-operators.cpp34
4 files changed, 49 insertions, 3 deletions
diff --git a/clang/test/SemaCXX/composite-pointer-type.cpp b/clang/test/SemaCXX/composite-pointer-type.cpp
index b4a5c884f75..ebc40c14b74 100644
--- a/clang/test/SemaCXX/composite-pointer-type.cpp
+++ b/clang/test/SemaCXX/composite-pointer-type.cpp
@@ -25,3 +25,11 @@ void f1(volatile Base *b, Derived1 *d1, const Derived2 *d2) {
if (d1 == d2) // expected-error{{comparison of distinct}}
return;
}
+
+// PR4691
+int ptrcmp1(void *a, int *b) {
+ return a < b;
+}
+int ptrcmp2(long *a, int *b) {
+ return a < b; // expected-error{{distinct}}
+} \ No newline at end of file
diff --git a/clang/test/SemaCXX/conditional-expr.cpp b/clang/test/SemaCXX/conditional-expr.cpp
index 3f4d7159a0f..65fbd83e6d2 100644
--- a/clang/test/SemaCXX/conditional-expr.cpp
+++ b/clang/test/SemaCXX/conditional-expr.cpp
@@ -170,7 +170,7 @@ void test()
i1 ? &MixedFields::ci : &MixedFieldsDerived::i;
const volatile int (MixedFields::*mp2) =
i1 ? &MixedFields::ci : &MixedFields::cvi;
- i1 ? &MixedFields::ci : &MixedFields::vi; // expected-error {{incompatible operand types}}
+ (void)(i1 ? &MixedFields::ci : &MixedFields::vi);
// Conversion of primitives does not result in an lvalue.
&(i1 ? i1 : d1); // expected-error {{address expression must be an lvalue or a function designator}}
diff --git a/clang/test/SemaCXX/member-pointer.cpp b/clang/test/SemaCXX/member-pointer.cpp
index 3b106d5576f..9e407a184c3 100644
--- a/clang/test/SemaCXX/member-pointer.cpp
+++ b/clang/test/SemaCXX/member-pointer.cpp
@@ -40,6 +40,14 @@ void f() {
// Conversion to member of base.
pdi1 = pdid; // expected-error {{incompatible type assigning 'int struct D::*', expected 'int struct A::*'}}
+
+ // Comparisons
+ int (A::*pf2)(int, int);
+ int (D::*pf3)(int, int) = 0;
+ bool b1 = (pf == pf2); (void)b1;
+ bool b2 = (pf != pf2); (void)b2;
+ bool b3 = (pf == pf3); (void)b3;
+ bool b4 = (pf != 0); (void)b4;
}
struct TheBase
diff --git a/clang/test/SemaCXX/overloaded-builtin-operators.cpp b/clang/test/SemaCXX/overloaded-builtin-operators.cpp
index 2a6c24a6778..a8c94f18222 100644
--- a/clang/test/SemaCXX/overloaded-builtin-operators.cpp
+++ b/clang/test/SemaCXX/overloaded-builtin-operators.cpp
@@ -20,11 +20,21 @@ struct Enum2 {
operator E2();
};
+
+struct X {
+ void f();
+};
+
+typedef void (X::*pmf)();
+struct Xpmf {
+ operator pmf();
+};
+
yes& islong(long);
yes& islong(unsigned long); // FIXME: shouldn't be needed
no& islong(int);
-void f(Short s, Long l, Enum1 e1, Enum2 e2) {
+void f(Short s, Long l, Enum1 e1, Enum2 e2, Xpmf pmf) {
// C++ [over.built]p8
int i1 = +e1;
int i2 = -e2;
@@ -37,6 +47,10 @@ void f(Short s, Long l, Enum1 e1, Enum2 e2) {
(void)static_cast<yes&>(islong(s + l));
(void)static_cast<no&>(islong(s + s));
+ // C++ [over.built]p16
+ (void)(pmf == &X::f);
+ (void)(pmf == 0);
+
// C++ [over.built]p17
(void)static_cast<yes&>(islong(s % l));
(void)static_cast<yes&>(islong(l << s));
@@ -53,7 +67,15 @@ struct LongRef {
operator volatile long&();
};
-void g(ShortRef sr, LongRef lr) {
+struct XpmfRef {
+ operator pmf&();
+};
+
+struct E2Ref {
+ operator E2&();
+};
+
+void g(ShortRef sr, LongRef lr, E2Ref e2_ref, XpmfRef pmf_ref) {
// C++ [over.built]p3
short s1 = sr++;
@@ -64,6 +86,14 @@ void g(ShortRef sr, LongRef lr) {
short& sr1 = (sr *= lr);
volatile long& lr1 = (lr *= sr);
+ // C++ [over.built]p20:
+ E2 e2r2;
+ e2r2 = e2_ref;
+
+ pmf &pmr = (pmf_ref = &X::f); // expected-error{{no viable overloaded '='}}
+ pmf pmr2;
+ pmr2 = pmf_ref;
+
// C++ [over.built]p22
short& sr2 = (sr %= lr);
volatile long& lr2 = (lr <<= sr);
OpenPOWER on IntegriCloud