xref: /llvm-project/clang/test/AST/ByteCode/fixed-point.cpp (revision 3c85102756ca0737e2282794451889cac502389f)
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