llvm/clang/test/CXX/dcl.dcl/dcl.spec/dcl.type/dcl.type.decltype/p1.cpp

// RUN: %clang_cc1 -std=c++20 -verify %s
// expected-no-diagnostics

// bullet 2: decltype(x) where x is a non-type template parameter gives the
// type of X, after deduction, if any.
namespace ClassNTTP {
  template<decltype(auto) v, typename ParamT, typename ExprT> void f() {
    using U = decltype(v);
    using U = ParamT;

    using V = decltype((v));
    using V = ExprT;
  }

  // The names of most non-reference NTTPs are prvalues.
  template void f<0, int, int>();

  // The name of a class NTTP of type T is an lvalue of type 'const T'.
  struct X {};
  template void f<X{}, X, const X&>();

  // Ensure we get this right for references to classes too.
  template<auto x> auto &TempParamObject = x;
  template void f<TempParamObject<X{}>, const X&, const X&>();

  struct Y {} y;
  template void f<(y), Y&, Y&>();
  template void f<y, Y, const Y&>();
}