// ensure that dependent and non-dependent asserts inside templated // functions parse without error whether the function is instatiated or not // ensure that assert contract checks are generated inside called templates // ensure that template functions can be used as assert predicates // { dg-do run } // { dg-options "-std=c++2a -fcontracts -fcontract-continuation-mode=on" } template<typename T> int fun1(int a, T b) { [[ assert: a > 0 ]]; [[ assert: (long long)b > 0 ]]; return a > 0; } template<typename T> struct test { static int fun(int a, T b) { [[ assert: a > 0 ]]; [[ assert: b > 0 ]]; return a > 0; } }; int main() { fun1(1, -1); fun1(-1, 1.0); fun1(-1, (const char *)0x1234); [[ assert: fun1(-1, -5) ]]; [[ assert: test<int>::fun(10, -6) ]]; [[ assert: test<double>::fun(10.0, -7) ]]; // return 0; } // { dg-skip-if "requires hosted libstdc++ for stdc++exp" { ! hostedlib } } // { dg-output {contract violation in function fun1<int> at .*:12: \(long long\)b > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {contract violation in function fun1<double> at .*:11: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {contract violation in function fun1<const char\*> at .*:11: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {contract violation in function fun1<int> at .*:11: a > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {contract violation in function fun1<int> at .*:12: \(long long\)b > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {contract violation in function main at .*:32: fun1\(-1, -5\)(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {contract violation in function test<int>::fun at .*:21: b > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} } // { dg-output {contract violation in function test<double>::fun at .*:21: b > 0(\n|\r\n|\r)} } // { dg-output {\[continue:on\](\n|\r\n|\r)} }