llvm/clang/test/CXX/over/over.oper/over.oper.general/p1.cpp

// RUN: %clang_cc1 -std=c++20 -verify -Wno-unused %s

template<typename T, typename U>
void operator->*(T, U);

template<typename T, typename U>
void operator+(T, U);

template<typename T, typename U>
void operator-(T, U);

template<typename T, typename U>
void operator*(T, U);

template<typename T, typename U>
void operator/(T, U);

template<typename T, typename U>
void operator%(T, U);

template<typename T, typename U>
void operator^(T, U);

template<typename T, typename U>
void operator&(T, U);

template<typename T, typename U>
void operator|(T, U);

template<typename T, typename U>
void operator+=(T, U);

template<typename T, typename U>
void operator-=(T, U);

template<typename T, typename U>
void operator*=(T, U);

template<typename T, typename U>
void operator/=(T, U);

template<typename T, typename U>
void operator%=(T, U);

template<typename T, typename U>
void operator^=(T, U);

template<typename T, typename U>
void operator&=(T, U);

template<typename T, typename U>
void operator|=(T, U);

template<typename T, typename U>
void operator==(T, U);

template<typename T, typename U>
void operator!=(T, U);

template<typename T, typename U>
void operator<(T, U);

template<typename T, typename U>
void operator>(T, U);

template<typename T, typename U>
void operator<=(T, U);

template<typename T, typename U>
void operator>=(T, U);

template<typename T, typename U>
void operator<=>(T, U);

template<typename T, typename U>
void operator&&(T, U);

template<typename T, typename U>
void operator||(T, U);

template<typename T, typename U>
void operator<<(T, U);

template<typename T, typename U>
void operator>>(T, U);

template<typename T, typename U>
void operator<<=(T, U);

template<typename T, typename U>
void operator>>=(T, U);

template<typename T, typename U>
void operator,(T, U);

template<typename T>
void operator*(T);

template<typename T>
void operator&(T);

template<typename T>
void operator+(T);

template<typename T>
void operator-(T);

template<typename T>
void operator!(T);

template<typename T>
void operator~(T);

template<typename T>
void operator++(T);

template<typename T>
void operator--(T);

template<typename T>
void operator++(T, int);

template<typename T>
void operator--(T, int);

template<typename T>
void f(int *x) {
  [&](auto *y) {
    *y;
    &y;
    +y;
    -y; // expected-error {{invalid argument type 'auto *' to unary expression}}
    !y;
    ~y; // expected-error {{invalid argument type 'auto *' to unary expression}}
    ++y;
    --y;
    y++;
    y--;
    y->*x;
    y + x;
    y - x;
    y * x;
    y / x;
    y % x;
    y ^ x;
    y & x;
    y | x;
    y += x;
    y -= x;
    y *= x;
    y /= x;
    y %= x;
    y ^= x;
    y &= x;
    y |= x;
    y == x;
    y != x;
    y < x;
    y > x;
    y <= x;
    y >= x;
    y <=> x;
    y && x;
    y || x;
    y << x;
    y >> x;
    y <<= x;
    y >>= x;
    y, x;
  };
}

template void f<int>(int*);