diff options
author | Douglas Gregor <dgregor@apple.com> | 2008-11-19 15:42:04 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2008-11-19 15:42:04 +0000 |
commit | d08452f60a2731c279f3b845d84a4a8940844d99 (patch) | |
tree | fef20a1d72fc923018c89ab9a49977455bace01b /clang/test/SemaCXX/overloaded-builtin-operators.cpp | |
parent | 3462c8ecdaf8bb18138c2ee2a99b213f7fd7cff9 (diff) | |
download | bcm5719-llvm-d08452f60a2731c279f3b845d84a4a8940844d99.tar.gz bcm5719-llvm-d08452f60a2731c279f3b845d84a4a8940844d99.zip |
Added operator overloading for unary operators, post-increment, and
post-decrement, including support for generating all of the built-in
operator candidates for these operators.
C++ and C have different rules for the arguments to the builtin unary
'+' and '-'. Implemented both variants in Sema::ActOnUnaryOp.
In C++, pre-increment and pre-decrement return lvalues. Update
Expr::isLvalue accordingly.
llvm-svn: 59638
Diffstat (limited to 'clang/test/SemaCXX/overloaded-builtin-operators.cpp')
-rw-r--r-- | clang/test/SemaCXX/overloaded-builtin-operators.cpp | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/clang/test/SemaCXX/overloaded-builtin-operators.cpp b/clang/test/SemaCXX/overloaded-builtin-operators.cpp index af328da212b..29d721c45bb 100644 --- a/clang/test/SemaCXX/overloaded-builtin-operators.cpp +++ b/clang/test/SemaCXX/overloaded-builtin-operators.cpp @@ -25,6 +25,14 @@ yes& islong(unsigned long); // FIXME: shouldn't be needed no& islong(int); void f(Short s, Long l, Enum1 e1, Enum2 e2) { + // C++ [over.built]p8 + int i1 = +e1; + int i2 = -e2; + + // C++ [over.built]p10: + int i3 = ~s; + bool b1 = !s; + // C++ [over.built]p12 (void)static_cast<yes&>(islong(s + l)); (void)static_cast<no&>(islong(s + s)); @@ -46,6 +54,12 @@ struct LongRef { }; void g(ShortRef sr, LongRef lr) { + // C++ [over.built]p3 + short s1 = sr++; + + // C++ [over.built]p3 + long l1 = lr--; + // C++ [over.built]p18 short& sr1 = (sr *= lr); volatile long& lr1 = (lr *= sr); @@ -65,7 +79,16 @@ struct ConstIntPtr { operator int const *(); }; -void test_with_ptrs(VolatileIntPtr vip, ConstIntPtr cip, ShortRef sr) { +struct VolatileIntPtrRef { + operator int volatile *&(); +}; + +struct ConstIntPtrRef { + operator int const *&(); +}; + +void test_with_ptrs(VolatileIntPtr vip, ConstIntPtr cip, ShortRef sr, + VolatileIntPtrRef vipr, ConstIntPtrRef cipr) { #if 0 // FIXME: Enable these tests once we have operator overloading for // operator[]. @@ -76,4 +99,19 @@ void test_with_ptrs(VolatileIntPtr vip, ConstIntPtr cip, ShortRef sr) { #endif bool b1 = (vip == cip); long p1 = vip - cip; + + // C++ [over.built]p5: + int volatile *vip1 = vipr++; + int const *cip1 = cipr++; + int volatile *&vipr1 = ++vipr; + int const *&cipr1 = --cipr; + + // C++ [over.built]p6: + int volatile &ivr = *vip; + + // C++ [over.built]p8: + int volatile *vip2 = +vip; + int i1 = +sr; + int i2 = -sr; } + |