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