@@ -373,4 +373,94 @@ struct HasNoDereferenceOperator {
373373 }
374374};
375375
376+ // MARK: Types that claim to be random access iterators, but actually aren't.
377+
378+ struct HasNoMinusOperator {
379+ int value;
380+
381+ using iterator_category = std::random_access_iterator_tag;
382+ using value_type = int ;
383+ using pointer = int *;
384+ using reference = const int &;
385+ using difference_type = int ;
386+
387+ HasNoMinusOperator (int value) : value(value) {}
388+ HasNoMinusOperator (const HasNoMinusOperator &other) = default ;
389+
390+ const int &operator *() const { return value; }
391+
392+ HasNoMinusOperator &operator ++() {
393+ value++;
394+ return *this ;
395+ }
396+ void operator +=(difference_type v) { value += v; }
397+ void operator -=(difference_type v) { value -= v; }
398+ HasNoMinusOperator operator +(difference_type v) const {
399+ return HasNoMinusOperator (value + v);
400+ }
401+ HasNoMinusOperator operator -(difference_type v) const {
402+ return HasNoMinusOperator (value - v);
403+ }
404+ friend HasNoMinusOperator operator +(difference_type v,
405+ const HasNoMinusOperator &it) {
406+ return it + v;
407+ }
408+
409+ bool operator <(const HasNoMinusOperator &other) const {
410+ return value < other.value ;
411+ }
412+
413+ bool operator ==(const HasNoMinusOperator &other) const {
414+ return value == other.value ;
415+ }
416+ bool operator !=(const HasNoMinusOperator &other) const {
417+ return value != other.value ;
418+ }
419+ };
420+
421+ struct HasNoPlusEqualOperator {
422+ int value;
423+
424+ using iterator_category = std::random_access_iterator_tag;
425+ using value_type = int ;
426+ using pointer = int *;
427+ using reference = const int &;
428+ using difference_type = int ;
429+
430+ HasNoPlusEqualOperator (int value) : value(value) {}
431+ HasNoPlusEqualOperator (const HasNoPlusEqualOperator &other) = default ;
432+
433+ const int &operator *() const { return value; }
434+
435+ HasNoPlusEqualOperator &operator ++() {
436+ value++;
437+ return *this ;
438+ }
439+ void operator -=(difference_type v) { value -= v; }
440+ HasNoPlusEqualOperator operator +(difference_type v) const {
441+ return HasNoPlusEqualOperator (value + v);
442+ }
443+ HasNoPlusEqualOperator operator -(difference_type v) const {
444+ return HasNoPlusEqualOperator (value - v);
445+ }
446+ friend HasNoPlusEqualOperator operator +(difference_type v,
447+ const HasNoPlusEqualOperator &it) {
448+ return it + v;
449+ }
450+ int operator -(const HasNoPlusEqualOperator &other) const {
451+ return value - other.value ;
452+ }
453+
454+ bool operator <(const HasNoPlusEqualOperator &other) const {
455+ return value < other.value ;
456+ }
457+
458+ bool operator ==(const HasNoPlusEqualOperator &other) const {
459+ return value == other.value ;
460+ }
461+ bool operator !=(const HasNoPlusEqualOperator &other) const {
462+ return value != other.value ;
463+ }
464+ };
465+
376466#endif // TEST_INTEROP_CXX_STDLIB_INPUTS_CUSTOM_ITERATOR_H
0 commit comments