xref: /llvm-project/clang/test/AST/ByteCode/cond.cpp (revision a07aba5d44204a7ca0d891a3da05af9960081e4c)
1*a07aba5dSTimm Baeder // RUN: %clang_cc1 -std=c++17 -fsyntax-only -fexperimental-new-constant-interpreter %s -verify
2*a07aba5dSTimm Baeder // RUN: %clang_cc1 -std=c++17 -fsyntax-only %s -verify
3*a07aba5dSTimm Baeder // expected-no-diagnostics
4*a07aba5dSTimm Baeder 
5*a07aba5dSTimm Baeder constexpr int cond_then_else(int a, int b) {
6*a07aba5dSTimm Baeder   if (a < b) {
7*a07aba5dSTimm Baeder     return b - a;
8*a07aba5dSTimm Baeder   } else {
9*a07aba5dSTimm Baeder     return a - b;
10*a07aba5dSTimm Baeder   }
11*a07aba5dSTimm Baeder }
12*a07aba5dSTimm Baeder 
13*a07aba5dSTimm Baeder constexpr int dontCallMe(unsigned m) {
14*a07aba5dSTimm Baeder   if (m == 0) return 0;
15*a07aba5dSTimm Baeder   return dontCallMe(m - 2);
16*a07aba5dSTimm Baeder }
17*a07aba5dSTimm Baeder 
18*a07aba5dSTimm Baeder // Can't call this because it will run into infinite recursion.
19*a07aba5dSTimm Baeder constexpr int assertNotReached() {
20*a07aba5dSTimm Baeder   return dontCallMe(3);
21*a07aba5dSTimm Baeder }
22*a07aba5dSTimm Baeder 
23*a07aba5dSTimm Baeder static_assert(true || true, "");
24*a07aba5dSTimm Baeder static_assert(true || false, "");
25*a07aba5dSTimm Baeder static_assert(false || true, "");
26*a07aba5dSTimm Baeder static_assert(!(false || false), "");
27*a07aba5dSTimm Baeder 
28*a07aba5dSTimm Baeder static_assert(true || assertNotReached(), "");
29*a07aba5dSTimm Baeder static_assert(true || true || true || false, "");
30*a07aba5dSTimm Baeder 
31*a07aba5dSTimm Baeder static_assert(true && true, "");
32*a07aba5dSTimm Baeder static_assert(!(true && false), "");
33*a07aba5dSTimm Baeder static_assert(!(false && true), "");
34*a07aba5dSTimm Baeder static_assert(!(false && false), "");
35*a07aba5dSTimm Baeder 
36*a07aba5dSTimm Baeder static_assert(!(false && assertNotReached()), "");
37*a07aba5dSTimm Baeder static_assert(!(true && true && true && false), "");
38