| // generic pre contract parsing checks |
| // check omitted, 'default', 'audit', and 'axiom' contract levels parse |
| // ensure that an invalid contrcat level 'off' errors |
| // ensure that a predicate referencing an undefined variable errors |
| // ensure that a missing colon after contract level errors |
| // { dg-do compile } |
| // { dg-options "-std=c++2a -fcontracts" } |
| |
| void f1(int x) [[ pre: x >= 0 ]] { } |
| void f2(int x) [[ pre default: x >= 0 ]] { } |
| void f3(int x) [[ pre audit: x >= 0 ]] { } |
| void f4(int x) [[ pre axiom: x >= 0 ]] { } |
| |
| void finvalid(int x) [[ pre invalid: x >= 0 ]] { } // { dg-error "expected contract level" } |
| void fundeclared() [[ pre: x >= 0 ]] { } // { dg-error ".x. was not declared in this scope" } |
| void fmissingcolon(int x) [[ pre default x == 0]] { } // { dg-error "expected .:. before .x." } |
| |
| int Z; |
| void (*fp1)(int x) [[ pre: Z > 0 ]]; // { dg-error "contracts must appertain" } |
| void (*fp2 [[ pre: Z > 0 ]])(int x); // { dg-error "contracts must appertain" } |
| typedef void (*fp3)(int x) [[ pre: Z > 0 ]]; // { dg-error "contracts must appertain" } |
| typedef void (*fp4 [[ pre: Z > 0 ]])(int x); // { dg-error "contracts must appertain" } |
| fp3 fn5(int a) [[ pre: a > 0 ]]; // { dg-bogus "contracts must appertain" } |
| |
| int xyz; |
| [[ pre: xyz ]] struct Bar; // { dg-error "contracts must appertain" } |
| // { dg-warning "attribute ignored" "" { target *-*-* } .-1 } |
| struct [[ pre: xyz ]] Bar; // { dg-error "contracts must appertain" } |
| struct Bar [[ pre: xyz ]]; // { dg-error "contracts must appertain" } |
| struct Zoo {} x [[ pre: xyz ]]; // { dg-error "contracts must appertain" } |
| |
| void f6(int x) [[ pre: x > 0 ; // { dg-error "expected .]." } |
| void f7(int x) [[ pre: x > 0 ]; // { dg-error "expected .]." } |
| void f8(int x) [[ pre: x > 0 { }; // { dg-error "expected .]." } |
| void f9(int x) [[ pre: x > 0 ] { }; // { dg-error "expected .]." } |
| |