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