// ensure that non-defined entities in assume contracts do not error
// { dg-do compile }
// { dg-options "-std=c++2a -fcontracts" }

template<typename T>
T id2(T n);

int fun(int n)
  [[ pre assume: id2(n) > 0 ]]
  [[ pre: n > 0 ]]
{
  return -n;
}

template<typename T>
T tfun(T n)
  [[ pre assume: id2(n) > 0 ]]
  [[ pre: n > 0 ]]
{
  return -n;
}

template<typename T>
constexpr T id(T n); // { dg-warning "used but never defined" }

template<typename T>
constexpr T cfun(T n)
  [[ pre assume: id(n) > 0 ]]
  [[ pre: id(n) > 0 ]] // { dg-error "used before its definition" }
{
  return -n;
}

template<typename T>
constexpr T id3(T n)
{
  return n;
}

template<typename T>
constexpr T cfun2(T n)
  [[ pre assume: id3(n) > 0 ]] // { dg-error "contract predicate" }
{
  return -n;
}

template<typename T>
constexpr T cfun3(T n)
  [[ pre: id3(n) > 0 ]] // { dg-error "contract predicate" }
{
  return -n;
}

int main() {
  constexpr int n = cfun(-5);
  constexpr int n2 = cfun2(-5);
  constexpr int n3 = cfun3(-5);
  fun(-5);
  tfun(-5);
}