diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 8 | ||||
| -rw-r--r-- | clang/test/SemaCXX/overloaded-builtin-operators.cpp | 18 | 
2 files changed, 21 insertions, 5 deletions
| diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index bae2783bea5..7905f5e6228 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/lib/Sema/SemaOverload.cpp @@ -7796,10 +7796,12 @@ public:      if (!HasArithmeticOrEnumeralCandidateType)        return; -    for (unsigned Arith = (Op == OO_PlusPlus? 0 : 1); -         Arith < NumArithmeticTypes; ++Arith) { +    for (unsigned Arith = 0; Arith < NumArithmeticTypes; ++Arith) { +      const auto TypeOfT = ArithmeticTypes[Arith]; +      if (Op == OO_MinusMinus && TypeOfT == S.Context.BoolTy) +        continue;        addPlusPlusMinusMinusStyleOverloads( -        ArithmeticTypes[Arith], +        TypeOfT,          VisibleTypeConversionsQuals.hasVolatile(),          VisibleTypeConversionsQuals.hasRestrict());      } diff --git a/clang/test/SemaCXX/overloaded-builtin-operators.cpp b/clang/test/SemaCXX/overloaded-builtin-operators.cpp index 7a99a898e20..4fa376aed03 100644 --- a/clang/test/SemaCXX/overloaded-builtin-operators.cpp +++ b/clang/test/SemaCXX/overloaded-builtin-operators.cpp @@ -62,6 +62,10 @@ void f(Short s, Long l, Enum1 e1, Enum2 e2, Xpmf pmf) {    // FIXME: should pass (void)static_cast<no&>(islong(e1 % e2));  } +struct BoolRef { +  operator bool&(); +}; +  struct ShortRef { // expected-note{{candidate function (the implicit copy assignment operator) not viable}}  #if __cplusplus >= 201103L // C++11 or later  // expected-note@-2 {{candidate function (the implicit move assignment operator) not viable}} @@ -73,6 +77,10 @@ struct LongRef {    operator volatile long&();  }; +struct FloatRef { +  operator float&(); +}; +  struct XpmfRef { // expected-note{{candidate function (the implicit copy assignment operator) not viable}}  #if __cplusplus >= 201103L // C++11 or later  // expected-note@-2 {{candidate function (the implicit move assignment operator) not viable}} @@ -84,13 +92,19 @@ struct E2Ref {    operator E2&();  }; -void g(ShortRef sr, LongRef lr, E2Ref e2_ref, XpmfRef pmf_ref) { +void g(BoolRef br, ShortRef sr, LongRef lr, FloatRef fr, E2Ref e2_ref, XpmfRef pmf_ref) {    // C++ [over.built]p3    short s1 = sr++; -  // C++ [over.built]p3 +  // C++ [over.built]p4    long l1 = lr--; +  // C++ [over.built]p4 +  float f1 = fr--; + +  // C++ [over.built]p4 +  bool b2 = br--; // expected-error{{cannot decrement value of type 'BoolRef'}} +    // C++ [over.built]p18    short& sr1 = (sr *= lr);    volatile long& lr1 = (lr *= sr); | 

