(root)/
gcc-13.2.0/
gcc/
testsuite/
g++.dg/
contracts/
contracts8.C
// generic assert contract parsing checks
//   ensure that existing generalized attribute parsing is not intefered with
//   ensure that an assert contract cannot chain into an empty attribute list
//   ensure that an attribute list cannot chain into an assert contract
// { dg-do compile }
// { dg-options "-std=c++2a -fcontracts" }

constexpr bool fun(int x) {
  return x < 0;
}

namespace tns {
  constexpr bool f(int x) {
    return x < 0;
  }
}

bool assert(int x) {
  return x < 0;
}

int main()
{
  constexpr int x = 1;
  [[fun(x)]]; // { dg-warning "attributes at the beginning of statement are ignored" }
  [[fun(x), assert(x)]]; // { dg-warning "attributes at the beginning of statement are ignored" }

  [[assert default: fun(x), ]]; // { dg-error "expected ']'" }
  [[assert default: fun(x) ]];

  [[fun(x), assert default: fun(x)]]; // { dg-error "expected .]. before .default." }
  // { dg-warning "attributes at the beginning of statement are ignored" "" { target *-*-* } .-1 }
  [[fun(x), assert: fun(x)]]; // { dg-error "expected .]. before .:. token" }
  // { dg-warning "attributes at the beginning of statement are ignored" "" { target *-*-* } .-1 }
  [[fun(x), assert fun(x)]]; // { dg-error "expected .]. before .fun." }
  // { dg-warning "attributes at the beginning of statement are ignored" "" { target *-*-* } .-1 }
  [[ using tns: f(x) ]]; // { dg-warning "attributes at the beginning of statement are ignored" }
  [[ using tns: f(x), assert default: fun(x) ]]; // { dg-error "expected .]. before .default." }
  // { dg-warning "attributes at the beginning of statement are ignored" "" { target *-*-* } .-1 }
  [[ using tns: f(x), , default: fun(x) ]]; // { dg-error "expected .]. before .:." }
  // { dg-warning "attributes at the beginning of statement are ignored" "" { target *-*-* } .-1 }
  return 0;
}