// { dg-do run } // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" } #include <cstdio> struct S { template<typename T> S(T a) [[ pre: a > 0 ]] [[ pre: a > 10 ]]; }; template<typename T> S::S(T a) { printf ("S::S(T): %d\n", (int)a); } struct S1 { template<typename T> S1(T a) [[ pre: a > 0 ]] [[ pre: a > 10 ]] { printf ("S1::S1(T): %d\n", (int)a); } }; int main(int, char **) { S s{-1}; S s2{-2.5}; S1 s1_1{-3}; S1 s1_2{-4.5}; return 0; } // { dg-skip-if "requires hosted libstdc++ for cstdio" { ! hostedlib } } // { dg-output "contract violation in function S::S<int> at .*.C:8: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function S::S<int> at .*.C:8: .*(\n|\r\n|\r)" } // { dg-output "S::S.T.: -1(\n|\r\n|\r)" } // { dg-output "contract violation in function S::S<double> at .*.C:8: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function S::S<double> at .*.C:8: .*(\n|\r\n|\r)" } // { dg-output "S::S.T.: -2(\n|\r\n|\r)" } // { dg-output "contract violation in function S1::S1<int> at .*.C:20: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function S1::S1<int> at .*.C:20: .*(\n|\r\n|\r)" } // { dg-output "S1::S1.T.: -3(\n|\r\n|\r)" } // { dg-output "contract violation in function S1::S1<double> at .*.C:20: .*(\n|\r\n|\r)" } // { dg-output "contract violation in function S1::S1<double> at .*.C:20: .*(\n|\r\n|\r)" } // { dg-output "S1::S1.T.: -4(\n|\r\n|\r)" }