1048bc672STimm Baeder // RUN: %clang_cc1 %s -fsyntax-only -ffixed-point -verify=expected,both -fexperimental-new-constant-interpreter 2048bc672STimm Baeder // RUN: %clang_cc1 %s -fsyntax-only -ffixed-point -verify=ref,both 3048bc672STimm Baeder 4048bc672STimm Baeder static_assert((bool)1.0k); 5048bc672STimm Baeder static_assert(!((bool)0.0k)); 6048bc672STimm Baeder static_assert((bool)0.0k); // both-error {{static assertion failed}} 7048bc672STimm Baeder 8048bc672STimm Baeder static_assert(1.0k == 1.0k); 96b62e04eSTimm Baeder static_assert(1.0k == 1); 10048bc672STimm Baeder static_assert(1.0k != 1.0k); // both-error {{failed due to requirement '1.0k != 1.0k'}} 116b62e04eSTimm Baeder static_assert(1.0k != 1); // both-error {{failed due to requirement '1.0k != 1'}} 12581c015eSTimm Baeder static_assert(-12.0k == -(-(-12.0k))); 13581c015eSTimm Baeder 14*3c851027STimm Baeder constexpr _Accum acc = (0.5r, 6.9k); 15*3c851027STimm Baeder 166fd870bfSTimm Baeder /// Zero-init. 176fd870bfSTimm Baeder constexpr _Accum A{}; 186fd870bfSTimm Baeder static_assert(A == 0.0k); 196b62e04eSTimm Baeder static_assert(A == 0); 20641b4d53STimm Baeder 21641b4d53STimm Baeder namespace IntToFixedPointCast { 22641b4d53STimm Baeder constexpr _Accum B = 13; 23641b4d53STimm Baeder static_assert(B == 13.0k); 246b62e04eSTimm Baeder static_assert(B == 13); 25641b4d53STimm Baeder 26641b4d53STimm Baeder constexpr _Fract sf = -1; 27641b4d53STimm Baeder static_assert(sf == -1.0k); 286b62e04eSTimm Baeder static_assert(sf == -1); 29641b4d53STimm Baeder } 306cbd8a30STimm Baeder 3195ce78b7STimm Baeder namespace FixedPointToIntCasts { 3295ce78b7STimm Baeder constexpr _Accum A = -13.0k; 3395ce78b7STimm Baeder constexpr int I = A; 3495ce78b7STimm Baeder static_assert(I == -13); 3595ce78b7STimm Baeder } 3695ce78b7STimm Baeder 376cbd8a30STimm Baeder namespace FloatToFixedPointCast { 386cbd8a30STimm Baeder constexpr _Fract sf = 1.0; // both-error {{must be initialized by a constant expression}} \ 396cbd8a30STimm Baeder // both-note {{outside the range of representable values of type 'const _Fract'}} 406cbd8a30STimm Baeder 416cbd8a30STimm Baeder constexpr _Fract sf2 = 0.5; 423a5b9da1STimm Baeder static_assert(sf2 == 0.5); 433a5b9da1STimm Baeder constexpr float sf2f = sf2; 443a5b9da1STimm Baeder static_assert(sf2f == 0.5); 456cbd8a30STimm Baeder } 46defead4dSTimm Baeder 47defead4dSTimm Baeder namespace BinOps { 48defead4dSTimm Baeder constexpr _Accum A = 13; 49defead4dSTimm Baeder static_assert(A + 1 == 14.0k); 50defead4dSTimm Baeder static_assert(1 + A == 14.0k); 51defead4dSTimm Baeder static_assert((A + A) == 26); 52defead4dSTimm Baeder 531714b113STimm Baeder static_assert(A + 100000 == 14.0k); // both-error {{is not an integral constant expression}} \ 541714b113STimm Baeder // both-note {{is outside the range of representable values}} 555c811cccSTimm Baeder 565c811cccSTimm Baeder static_assert((A - A) == 0); 575c811cccSTimm Baeder constexpr short _Accum mul_ovf1 = 255.0hk * 4.5hk; // both-error {{must be initialized by a constant expression}} \ 585c811cccSTimm Baeder // both-note {{value 123.5 is outside the range of representable values of type 'short _Accum'}} 595c811cccSTimm Baeder constexpr short _Accum div_ovf1 = 255.0hk / 0.5hk; // both-error {{must be initialized by a constant expression}} \ 605c811cccSTimm Baeder // both-note {{value -2.0 is outside the range of representable values of type 'short _Accum'}} 615c811cccSTimm Baeder 62defead4dSTimm Baeder } 63c2a37e41STimm Baeder 64c2a37e41STimm Baeder namespace FixedPointCasts { 65c2a37e41STimm Baeder constexpr _Fract B = 0.3; 66c2a37e41STimm Baeder constexpr _Accum A = B; 67c2a37e41STimm Baeder constexpr _Fract C = A; 68c2a37e41STimm Baeder } 695c811cccSTimm Baeder 705c811cccSTimm Baeder namespace Cmp { 715c811cccSTimm Baeder constexpr _Accum A = 13.0k; 725c811cccSTimm Baeder constexpr _Accum B = 14.0k; 735c811cccSTimm Baeder static_assert(B > A); 745c811cccSTimm Baeder static_assert(B >= A); 755c811cccSTimm Baeder static_assert(A < B); 765c811cccSTimm Baeder static_assert(A <= B); 775c811cccSTimm Baeder } 78