aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/modules/contracts-3_a.C
blob: a4f03d358426ce91ee027efa864dd765579cf2be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// Basic test to ensure that guarded templates correctly serialize and
// deserialize their contracts through the CMI.
// { dg-additional-options "-fmodules-ts -fcontracts -fcontract-continuation-mode=on" }
module;
#include <cstdio>
#include <experimental/contract>
export module foo;
// { dg-module-cmi foo }

export int violation_count{0};
extern "C++" export void handle_contract_violation(const std::experimental::contract_violation &violation)
{
  violation_count++;
  printf("violation_count: %d\n", violation_count);
}

export int nontemplate(int n)
  [[ pre: n > 0 ]]
  [[ post r: r > 0 ]]
{
  return -n;
}

export
template<typename T>
T fn(T n)
  [[ pre: n > 0 ]]
  [[ post r: r > 0 ]]
{
  printf("%s(%d)\n", __FUNCTION__, n);
  return n;
}

export
template<typename T>
void void_fn(T n)
  [[ pre: n < 0 ]]
{
  printf("%s(%d)\n", __FUNCTION__, n);
}