diff options
Diffstat (limited to 'clang/test/SemaCXX')
| -rw-r--r-- | clang/test/SemaCXX/overloaded-builtin-operators.cpp | 40 | ||||
| -rw-r--r-- | clang/test/SemaCXX/overloaded-operator.cpp | 28 | 
2 files changed, 67 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;  } + diff --git a/clang/test/SemaCXX/overloaded-operator.cpp b/clang/test/SemaCXX/overloaded-operator.cpp index c540c2dafcb..29486568185 100644 --- a/clang/test/SemaCXX/overloaded-operator.cpp +++ b/clang/test/SemaCXX/overloaded-operator.cpp @@ -69,3 +69,31 @@ void enum_test(Enum1 enum1, Enum2 enum2, E1 e1, E2 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'}}  } + + +struct PostInc { +  PostInc operator++(int); +  PostInc& operator++(); +}; + +struct PostDec { +  PostDec operator--(int); +  PostDec& operator--(); +}; + +void incdec_test(PostInc pi, PostDec pd) { +  const PostInc& pi1 = pi++; +  const PostDec& pd1 = pd--; +  PostInc &pi2 = ++pi; +  PostDec &pd2 = --pd; +} + +struct SmartPtr { +  int& operator*(); +  // FIXME: spurious error:  long& operator*() const; +}; + +void test_smartptr(SmartPtr ptr, const SmartPtr cptr) { +  int &ir = *ptr; +  // FIXME: reinstate long &lr = *cptr; +}  | 

