// basic test to ensure pre contracts work for free template specializations // { dg-do run } // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" } #include template int body(int a) [[ pre: a > 0 ]] { T t = a * 2.5; return t; } template<> int body(int a) [[ pre: a > 0 ]] { double t = a * 3.3; return t; } template int none(int a) [[ pre: a > 0 ]] { return -a; } template<> int none(int a) [[ pre: a > 0 ]] { return a - 100; } template int arg0(T t) [[ pre: t > 0 ]] { return -t - 10; } template<> int arg0(double t) [[ pre: t > 0 ]] { return -t + 10; } template int arg1(int a, T t) [[ pre: a > 0 ]] [[ pre: t > 0 ]] { return -t * a; } template<> int arg1(int a, double t) [[ pre: a > 0 ]] [[ pre: t > 0 ]] { return -t * a + 17; } template T ret(int a) [[ pre: a > 0 ]] { return -a; } template<> double ret(int a) [[ pre: a > 0 ]] { return -a * 3.3; } int main(int, char**) { printf("%d\n", body(-1)); printf("%d\n", body(-1)); printf("%d\n", none(-1)); printf("%d\n", none(-1)); printf("%d\n", arg0(-1)); printf("%d\n", arg0(-1.0)); printf("%d\n", arg1(-3, -1)); printf("%d\n", arg1(-3, -1.0)); printf("%d\n", (int)ret(-1)); printf("%d\n", (int)ret(-1)); printf("%f\n", ret(-1)); return 0; } // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } } // { dg-output "contract violation in function body at .*.C:8: .*(\n|\r\n|\r)" } // { dg-output "-2(\n|\r\n|\r)" } // { dg-output "contract violation in function body at .*.C:16: .*(\n|\r\n|\r)" } // { dg-output "-3(\n|\r\n|\r)" } // { dg-output "contract violation in function none at .*.C:24: .*(\n|\r\n|\r)" } // { dg-output "1(\n|\r\n|\r)" } // { dg-output "contract violation in function none at .*.C:31: .*(\n|\r\n|\r)" } // { dg-output "-101(\n|\r\n|\r)" } // { dg-output "contract violation in function arg0 at .*.C:38: .*(\n|\r\n|\r)" } // { dg-output "-9(\n|\r\n|\r)" } // { dg-output "contract violation in function arg0 at .*.C:45: .*(\n|\r\n|\r)" } // { dg-output "11(\n|\r\n|\r)" } // { dg-output "contract violation in function arg1 at .*.C:52: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function arg1 at .*.C:53: .*(\n|\r\n|\r)" } // { dg-output "-3(\n|\r\n|\r)" } // { dg-output "contract violation in function arg1 at .*.C:60: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function arg1 at .*.C:61: .*(\n|\r\n|\r)" } // { dg-output "14(\n|\r\n|\r)" } // { dg-output "contract violation in function ret at .*.C:68: .*(\n|\r\n|\r)" } // { dg-output "1(\n|\r\n|\r)" } // { dg-output "contract violation in function ret at .*.C:75: .*(\n|\r\n|\r)" } // { dg-output "3(\n|\r\n|\r)" } // { dg-output "contract violation in function ret at .*.C:75: .*(\n|\r\n|\r)" } // { dg-output "3.300000(\n|\r\n|\r)" }