summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2008-11-19 03:25:36 +0000
committerDouglas Gregor <dgregor@apple.com>2008-11-19 03:25:36 +0000
commitca63811b396757f97c84a7965eba6a4a8c26417e (patch)
treed9bd6845bb908704cd84aacb5512bc0ef65e8286 /clang/test
parent2dd5aa4f1177b4b4c99dc20d630033082ac471aa (diff)
downloadbcm5719-llvm-ca63811b396757f97c84a7965eba6a4a8c26417e.tar.gz
bcm5719-llvm-ca63811b396757f97c84a7965eba6a4a8c26417e.zip
Built-in equality and relational operators have return type "bool" in C++,
not "int". Fix a typo in the promotion of enumeration types that was causing some integral promotions to look like integral conversions (leading to extra ambiguities in overload resolution). Check for "acceptable" overloaded operators based on the types of the arguments. This is a somewhat odd check that is specified by the standard, but I can't see why it actually matters: the overload candidates it suppresses don't seem like they would ever be picked as the best candidates. llvm-svn: 59583
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/SemaCXX/overloaded-builtin-operators.cpp15
-rw-r--r--clang/test/SemaCXX/overloaded-operator.cpp21
2 files changed, 35 insertions, 1 deletions
diff --git a/clang/test/SemaCXX/overloaded-builtin-operators.cpp b/clang/test/SemaCXX/overloaded-builtin-operators.cpp
index aabe8dde1b1..af328da212b 100644
--- a/clang/test/SemaCXX/overloaded-builtin-operators.cpp
+++ b/clang/test/SemaCXX/overloaded-builtin-operators.cpp
@@ -10,10 +10,21 @@ struct Long {
operator long();
};
+enum E1 { };
+struct Enum1 {
+ operator E1();
+};
+
+enum E2 { };
+struct Enum2 {
+ operator E2();
+};
+
yes& islong(long);
+yes& islong(unsigned long); // FIXME: shouldn't be needed
no& islong(int);
-void f(Short s, Long l) {
+void f(Short s, Long l, Enum1 e1, Enum2 e2) {
// C++ [over.built]p12
(void)static_cast<yes&>(islong(s + l));
(void)static_cast<no&>(islong(s + s));
@@ -22,6 +33,8 @@ void f(Short s, Long l) {
(void)static_cast<yes&>(islong(s % l));
(void)static_cast<yes&>(islong(l << s));
(void)static_cast<no&>(islong(s << l));
+ (void)static_cast<yes&>(islong(e1 % l));
+ // FIXME: should pass (void)static_cast<no&>(islong(e1 % e2));
}
struct ShortRef {
diff --git a/clang/test/SemaCXX/overloaded-operator.cpp b/clang/test/SemaCXX/overloaded-operator.cpp
index 71d949d750a..c540c2dafcb 100644
--- a/clang/test/SemaCXX/overloaded-operator.cpp
+++ b/clang/test/SemaCXX/overloaded-operator.cpp
@@ -48,3 +48,24 @@ struct B {
make_A() == z;
}
};
+
+enum Enum1 { };
+enum Enum2 { };
+
+struct E1 {
+ E1(Enum1) { }
+};
+
+struct E2 {
+ E2(Enum2);
+};
+
+// C++ [over.match.oper]p3 - enum restriction.
+float& operator==(E1, E2);
+
+void enum_test(Enum1 enum1, Enum2 enum2, E1 e1, E2 e2) {
+ float &f1 = (e1 == e2);
+ float &f2 = (enum1 == e2);
+ float &f3 = (e1 == enum2);
+ float &f4 = (enum1 == enum2); // expected-error{{non-const reference to type 'float' cannot be initialized with a temporary of type '_Bool'}}
+}
OpenPOWER on IntegriCloud