blob: 14ba0e960066728f2d556a2d6178276f8e654715 [file] [log] [blame]
// ensure that passing asserts do not affect constexpr functions
// ensure that failing asserts generate an error in a constexpr function
// { dg-do compile }
// { dg-options "-std=c++2a -fcontracts" }
constexpr int wfun(int a) {
[[assert: a > 0]];
return a;
}
constexpr int ffun(int a) {
[[assert: a > 0]];
return a;
}
template<typename T>
constexpr int tfun(T a) {
[[assert: a > 0]];
return a;
}
template<typename T>
constexpr int wtfun(T a) {
[[assert: a > 0]];
return a;
}
template<typename T>
constexpr int ftfun(T a) {
[[assert: a > 0]];
return a;
}
constexpr int explicitfn(int a) {
[[assert ignore: a > 0]];
[[assert check_never_continue: a > 0]];
return a;
}
int main(int, char **) {
constexpr int a = wfun(10);
constexpr int b = ffun(-10); // { dg-message "in .constexpr. expansion" }
// { dg-error "contract predicate" "" { target *-*-* } 12 }
constexpr int c = wtfun(10);
constexpr int d = ftfun(-10); // { dg-message "in .constexpr. expansion" }
// { dg-error "contract predicate" "" { target *-*-* } 30 }
constexpr int e = explicitfn(-10); // { dg-message "in .constexpr. expansion" }
// { dg-error "contract predicate" "" { target *-*-* } 36 }
return 0;
}