// { dg-do run } // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" } struct M { template int f(int a) [[ pre: a > 0 ]]; template int g(int a) [[ pre: a > 0 ]] { return -a; } template int f_arg(T a) [[ pre: a > 0 ]]; template int g_arg(T a) [[ pre: a > 0 ]] { return (int)-a; } template T f_ret(int a) [[ pre: a > 0 ]]; template T g_ret(int a) [[ pre: a > 0 ]] { return -a * 1.5; } }; template int M::f(int a) { return -a; } template int M::f_arg(T a) { return (int)-a; } template T M::f_ret(int a) { return -a * (T)1.5; } template struct S { template int f(int a) [[ pre: a > 0 ]]; template int g(int a) [[ pre: a > 0 ]] { return -a; } }; template template int S::f(int a) { return -a; } #include int main(int, char**) { { M m; printf ("=================================\n"); printf ("m.f(-10): %d\n", m.f(-10)); printf ("m.f(-11.5): %d\n", m.f(-11.5)); printf ("m.f(10): %d\n", m.f(10)); printf ("m.f(11.5): %d\n", m.f(11.5)); printf ("=================================\n"); printf ("m.g(-10): %d\n", m.g(-10)); printf ("m.g(-11.5): %d\n", m.g(-11.5)); printf ("m.g(10): %d\n", m.g(10)); printf ("m.g(11.5): %d\n", m.g(11.5)); printf ("=================================\n"); printf ("m.f_arg(-10): %d\n", m.f_arg(-10)); printf ("m.f_arg(-11.5): %d\n", m.f_arg(-11.5)); printf ("m.f_arg(10): %d\n", m.f_arg(10)); printf ("m.f_arg(11.5): %d\n", m.f_arg(11.5)); printf ("=================================\n"); printf ("m.g_arg(-10): %d\n", m.g_arg(-10)); printf ("m.g_arg(-11.5): %d\n", m.g_arg(-11.5)); printf ("m.g_arg(10): %d\n", m.g_arg(10)); printf ("m.g_arg(11.5): %d\n", m.g_arg(11.5)); printf ("=================================\n"); printf ("m.f_ret(-10): %d\n", m.f_ret(-10)); printf ("m.f_ret(-11.5): %f\n", m.f_ret(-11.5)); printf ("m.f_ret(10): %d\n", m.f_ret(10)); printf ("m.f_ret(11.5): %f\n", m.f_ret(11.5)); printf ("=================================\n"); printf ("m.g_ret(-10): %d\n", m.g_ret(-10)); printf ("m.g_ret(-11.5): %f\n", m.g_ret(-11.5)); printf ("m.g_ret(10): %d\n", m.g_ret(10)); printf ("m.g_ret(11.5): %f\n", m.g_ret(11.5)); } { S s; printf ("=================================\n"); s.f(-10); s.f(-10); printf ("=================================\n"); s.g(-10); s.g(-10); } { S s; printf ("=================================\n"); s.f(-10); s.f(-10); printf ("=================================\n"); s.g(-10); s.g(-10); } return 0; } // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } } // { dg-output {=================================(\n|\r\n|\r)} } // { dg-output {contract violation in function M::f at .*:7: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {m.f\(-10\): 10(\n|\r\n|\r)} } // { dg-output {contract violation in function M::f at .*:7: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {m.f\(-11.5\): 11(\n|\r\n|\r)} } // { dg-output {m.f\(10\): -10(\n|\r\n|\r)} } // { dg-output {m.f\(11.5\): -11(\n|\r\n|\r)} } // { dg-output {=================================(\n|\r\n|\r)} } // { dg-output {contract violation in function M::g at .*:10: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {m.g\(-10\): 10(\n|\r\n|\r)} } // { dg-output {contract violation in function M::g at .*:10: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {m.g\(-11.5\): 11(\n|\r\n|\r)} } // { dg-output {m.g\(10\): -10(\n|\r\n|\r)} } // { dg-output {m.g\(11.5\): -11(\n|\r\n|\r)} } // { dg-output {=================================(\n|\r\n|\r)} } // { dg-output {contract violation in function M::f_arg at .*:16: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {m.f_arg\(-10\): 10(\n|\r\n|\r)} } // { dg-output {contract violation in function M::f_arg at .*:16: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {m.f_arg\(-11.5\): 11(\n|\r\n|\r)} } // { dg-output {m.f_arg\(10\): -10(\n|\r\n|\r)} } // { dg-output {m.f_arg\(11.5\): -11(\n|\r\n|\r)} } // { dg-output {=================================(\n|\r\n|\r)} } // { dg-output {contract violation in function M::g_arg at .*:19: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {m.g_arg\(-10\): 10(\n|\r\n|\r)} } // { dg-output {contract violation in function M::g_arg at .*:19: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {m.g_arg\(-11.5\): 11(\n|\r\n|\r)} } // { dg-output {m.g_arg\(10\): -10(\n|\r\n|\r)} } // { dg-output {m.g_arg\(11.5\): -11(\n|\r\n|\r)} } // { dg-output {=================================(\n|\r\n|\r)} } // { dg-output {contract violation in function M::f_ret at .*:25: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {m.f_ret\(-10\): 10(\n|\r\n|\r)} } // { dg-output {contract violation in function M::f_ret at .*:25: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {m.f_ret\(-11.5\): 16.500000(\n|\r\n|\r)} } // { dg-output {m.f_ret\(10\): -10(\n|\r\n|\r)} } // { dg-output {m.f_ret\(11.5\): -16.500000(\n|\r\n|\r)} } // { dg-output {=================================(\n|\r\n|\r)} } // { dg-output {contract violation in function M::g_ret at .*:28: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {m.g_ret\(-10\): 15(\n|\r\n|\r)} } // { dg-output {contract violation in function M::g_ret at .*:28: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {m.g_ret\(-11.5\): 16.500000(\n|\r\n|\r)} } // { dg-output {m.g_ret\(10\): -15(\n|\r\n|\r)} } // { dg-output {m.g_ret\(11.5\): -16.500000(\n|\r\n|\r)} } // { dg-output {=================================(\n|\r\n|\r)} } // { dg-output {contract violation in function S::f at .*:56: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {contract violation in function S::f at .*:56: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {=================================(\n|\r\n|\r)} } // { dg-output {contract violation in function S::g at .*:59: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {contract violation in function S::g at .*:59: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {=================================(\n|\r\n|\r)} } // { dg-output {contract violation in function S::f at .*:56: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {contract violation in function S::f at .*:56: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {=================================(\n|\r\n|\r)} } // { dg-output {contract violation in function S::g at .*:59: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {contract violation in function S::g at .*:59: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} }