| // 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; |
| } |