// ensure that assert contracts can be turned into compile time assumptions
// and that they can be used for optimization.
//
// Even though x == -1, the assert contract tells the compiler that it is
// safe to assume the x <= 0 branch is never taken fun can be transformed into
// just
//   printf("%d: test x>0\n", x);
//   return 0;
// we ensure this by matching on the output and expecting a 0 return code from
// main -- unlike contracts-ignore2 which expects a failing return code
// { dg-do run }
// { dg-options "-std=c++2a -fcontracts -fcontract-role=default:never,assume,ignore -O1" }
// { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } }
#include <cstdio>

int fun(int x) {
  [[assert audit: x > 0]];
  if(x <= 0)
  {
    printf("%d: test x<=0 opt out\n", x);
    return -1;
  }
  else
  {
    printf("%d: test x>0\n", x);
    return 0;
  }
}

int main(int, char**) {
  volatile int x = -1;
  return fun(x);
}

// { dg-output "-1: test x>0(\n|\r\n|\r)" }