Clang Project

clang_source_code/test/AST/fixed_point.c
1// RUN: %clang_cc1 -x c -ffixed-point -ast-dump %s | FileCheck %s --strict-whitespace
2
3/*  Various contexts where type _Accum can appear. */
4
5// Primary fixed point types
6signed short _Accum s_short_accum;
7signed _Accum s_accum;
8signed long _Accum s_long_accum;
9unsigned short _Accum u_short_accum;
10unsigned _Accum u_accum;
11unsigned long _Accum u_long_accum;
12signed short _Fract s_short_fract;
13signed _Fract s_fract;
14signed long _Fract s_long_fract;
15unsigned short _Fract u_short_fract;
16unsigned _Fract u_fract;
17unsigned long _Fract u_long_fract;
18
19// Aliased fixed point types
20short _Accum short_accum;
21_Accum accum;
22long _Accum long_accum;
23short _Fract short_fract;
24_Fract fract;
25long _Fract long_fract;
26
27// Saturated fixed point types
28_Sat signed short _Accum sat_s_short_accum;
29_Sat signed _Accum sat_s_accum;
30_Sat signed long _Accum sat_s_long_accum;
31_Sat unsigned short _Accum sat_u_short_accum;
32_Sat unsigned _Accum sat_u_accum;
33_Sat unsigned long _Accum sat_u_long_accum;
34_Sat signed short _Fract sat_s_short_fract;
35_Sat signed _Fract sat_s_fract;
36_Sat signed long _Fract sat_s_long_fract;
37_Sat unsigned short _Fract sat_u_short_fract;
38_Sat unsigned _Fract sat_u_fract;
39_Sat unsigned long _Fract sat_u_long_fract;
40
41// Aliased saturated fixed point types
42_Sat short _Accum sat_short_accum;
43_Sat _Accum sat_accum;
44_Sat long _Accum sat_long_accum;
45_Sat short _Fract sat_short_fract;
46_Sat _Fract sat_fract;
47_Sat long _Fract sat_long_fract;
48
49//CHECK:      |-VarDecl {{.*}} s_short_accum 'short _Accum'
50//CHECK-NEXT: |-VarDecl {{.*}} s_accum '_Accum'
51//CHECK-NEXT: |-VarDecl {{.*}} s_long_accum 'long _Accum'
52//CHECK-NEXT: |-VarDecl {{.*}} u_short_accum 'unsigned short _Accum'
53//CHECK-NEXT: |-VarDecl {{.*}} u_accum 'unsigned _Accum'
54//CHECK-NEXT: |-VarDecl {{.*}} u_long_accum 'unsigned long _Accum'
55//CHECK-NEXT: |-VarDecl {{.*}} s_short_fract 'short _Fract'
56//CHECK-NEXT: |-VarDecl {{.*}} s_fract '_Fract'
57//CHECK-NEXT: |-VarDecl {{.*}} s_long_fract 'long _Fract'
58//CHECK-NEXT: |-VarDecl {{.*}} u_short_fract 'unsigned short _Fract'
59//CHECK-NEXT: |-VarDecl {{.*}} u_fract 'unsigned _Fract'
60//CHECK-NEXT: |-VarDecl {{.*}} u_long_fract 'unsigned long _Fract'
61//CHECK-NEXT: |-VarDecl {{.*}} short_accum 'short _Accum'
62//CHECK-NEXT: |-VarDecl {{.*}} accum '_Accum'
63//CHECK-NEXT: |-VarDecl {{.*}} long_accum 'long _Accum'
64//CHECK-NEXT: |-VarDecl {{.*}} short_fract 'short _Fract'
65//CHECK-NEXT: |-VarDecl {{.*}} fract '_Fract'
66//CHECK-NEXT: |-VarDecl {{.*}} long_fract 'long _Fract'
67//CHECK-NEXT: |-VarDecl {{.*}} sat_s_short_accum '_Sat short _Accum'
68//CHECK-NEXT: |-VarDecl {{.*}} sat_s_accum '_Sat _Accum'
69//CHECK-NEXT: |-VarDecl {{.*}} sat_s_long_accum '_Sat long _Accum'
70//CHECK-NEXT: |-VarDecl {{.*}} sat_u_short_accum '_Sat unsigned short _Accum'
71//CHECK-NEXT: |-VarDecl {{.*}} sat_u_accum '_Sat unsigned _Accum'
72//CHECK-NEXT: |-VarDecl {{.*}} sat_u_long_accum '_Sat unsigned long _Accum'
73//CHECK-NEXT: |-VarDecl {{.*}} sat_s_short_fract '_Sat short _Fract'
74//CHECK-NEXT: |-VarDecl {{.*}} sat_s_fract '_Sat _Fract'
75//CHECK-NEXT: |-VarDecl {{.*}} sat_s_long_fract '_Sat long _Fract'
76//CHECK-NEXT: |-VarDecl {{.*}} sat_u_short_fract '_Sat unsigned short _Fract'
77//CHECK-NEXT: |-VarDecl {{.*}} sat_u_fract '_Sat unsigned _Fract'
78//CHECK-NEXT: |-VarDecl {{.*}} sat_u_long_fract '_Sat unsigned long _Fract'
79//CHECK-NEXT: |-VarDecl {{.*}} sat_short_accum '_Sat short _Accum'
80//CHECK-NEXT: |-VarDecl {{.*}} sat_accum '_Sat _Accum'
81//CHECK-NEXT: |-VarDecl {{.*}} sat_long_accum '_Sat long _Accum'
82//CHECK-NEXT: |-VarDecl {{.*}} sat_short_fract '_Sat short _Fract'
83//CHECK-NEXT: |-VarDecl {{.*}} sat_fract '_Sat _Fract'
84//CHECK-NEXT: |-VarDecl {{.*}} sat_long_fract '_Sat long _Fract'
85
86#define MIX_TYPE_SPEC(SPEC, SIGN, SIZE, ID) \
87  SPEC SIGN SIZE _Accum ID; \
88  SIGN SPEC SIZE _Accum ID ## 2; \
89  SIGN SIZE SPEC _Accum ID ## 3; \
90  SIGN SIZE _Accum SPEC ID ## 4;
91
92/* Mixing fixed point types with other type specifiers */
93
94#define MIX_VOLATILE(SIGN, SIZE, ID) MIX_TYPE_SPEC(volatile, SIGN, SIZE, ID)
95#define MIX_ATOMIC(SIGN, SIZE, ID) MIX_TYPE_SPEC(_Atomic, SIGN, SIZE, ID)
96#define MIX_CONST(SIGN, SIZE, ID) MIX_TYPE_SPEC(const, SIGN, SIZE, ID)
97
98MIX_VOLATILE(signed, short, vol_s_short_accum)
99MIX_ATOMIC(signed, short, atm_s_short_accum)
100MIX_CONST(signed, short, const_s_short_accum)
101
102// CHECK-NEXT: |-VarDecl {{.*}} vol_s_short_accum 'volatile short _Accum'
103// CHECK-NEXT: |-VarDecl {{.*}} vol_s_short_accum2 'volatile short _Accum'
104// CHECK-NEXT: |-VarDecl {{.*}} vol_s_short_accum3 'volatile short _Accum'
105// CHECK-NEXT: |-VarDecl {{.*}} vol_s_short_accum4 'volatile short _Accum'
106
107// CHECK-NEXT: |-VarDecl {{.*}} atm_s_short_accum '_Atomic(short _Accum)'
108// CHECK-NEXT: |-VarDecl {{.*}} atm_s_short_accum2 '_Atomic(short _Accum)'
109// CHECK-NEXT: |-VarDecl {{.*}} atm_s_short_accum3 '_Atomic(short _Accum)'
110// CHECK-NEXT: |-VarDecl {{.*}} atm_s_short_accum4 '_Atomic(short _Accum)'
111
112// CHECK-NEXT: |-VarDecl {{.*}} const_s_short_accum 'const short _Accum'
113// CHECK-NEXT: |-VarDecl {{.*}} const_s_short_accum2 'const short _Accum'
114// CHECK-NEXT: |-VarDecl {{.*}} const_s_short_accum3 'const short _Accum'
115// CHECK-NEXT: |-VarDecl {{.*}} const_s_short_accum4 'const short _Accum'
116
117/* Typedefs */
118
119// Primary fixed point types
120typedef signed short   _Accum SsA_t;
121typedef signed         _Accum SA_t;
122typedef signed long    _Accum SlA_t;
123typedef unsigned short _Accum UsA_t;
124typedef unsigned       _Accum UA_t;
125typedef unsigned long  _Accum UlA_t;
126typedef signed short   _Fract SsF_t;
127typedef signed         _Fract SF_t;
128typedef signed long    _Fract SlF_t;
129typedef unsigned short _Fract UsF_t;
130typedef unsigned       _Fract UF_t;
131typedef unsigned long  _Fract UlF_t;
132
133// Aliased fixed point types
134typedef short _Accum sA_t;
135typedef       _Accum A_t;
136typedef long  _Accum lA_t;
137typedef short _Fract sF_t;
138typedef       _Fract F_t;
139typedef long  _Fract lF_t;
140
141// Saturated fixed point types
142typedef _Sat signed short   _Accum SatSsA_t;
143typedef _Sat signed         _Accum SatSA_t;
144typedef _Sat signed long    _Accum SatSlA_t;
145typedef _Sat unsigned short _Accum SatUsA_t;
146typedef _Sat unsigned       _Accum SatUA_t;
147typedef _Sat unsigned long  _Accum SatUlA_t;
148typedef _Sat signed short   _Fract SatSsF_t;
149typedef _Sat signed         _Fract SatSF_t;
150typedef _Sat signed long    _Fract SatSlF_t;
151typedef _Sat unsigned short _Fract SatUsF_t;
152typedef _Sat unsigned       _Fract SatUF_t;
153typedef _Sat unsigned long  _Fract SatUlF_t;
154
155// Aliased saturated fixed point types
156typedef _Sat short   _Accum SatsA_t;
157typedef _Sat         _Accum SatA_t;
158typedef _Sat long    _Accum SatlA_t;
159typedef _Sat short   _Fract SatsF_t;
160typedef _Sat         _Fract SatF_t;
161typedef _Sat long    _Fract SatlF_t;
162
163SsA_t     SsA_type;
164SA_t      SA_type;
165SlA_t     SlA_type;
166UsA_t     UsA_type;
167UA_t      UA_type;
168UlA_t     UlA_type;
169SsF_t     SsF_type;
170SF_t      SF_type;
171SlF_t     SlF_type;
172UsF_t     UsF_type;
173UF_t      UF_type;
174UlF_t     UlF_type;
175
176sA_t      sA_type;
177A_t       A_type;
178lA_t      lA_type;
179sF_t      sF_type;
180F_t       F_type;
181lF_t      lF_type;
182
183SatSsA_t  SatSsA_type;
184SatSA_t   SatSA_type;
185SatSlA_t  SatSlA_type;
186SatUsA_t  SatUsA_type;
187SatUA_t   SatUA_type;
188SatUlA_t  SatUlA_type;
189SatSsF_t  SatSsF_type;
190SatSF_t   SatSF_type;
191SatSlF_t  SatSlF_type;
192SatUsF_t  SatUsF_type;
193SatUF_t   SatUF_type;
194SatUlF_t  SatUlF_type;
195
196SatsA_t   SatsA_type;
197SatA_t    SatA_type;
198SatlA_t   SatlA_type;
199SatsF_t   SatsF_type;
200SatF_t    SatF_type;
201SatlF_t   SatlF_type;
202
203//CHECK:      |-VarDecl {{.*}} SsA_type 'SsA_t':'short _Accum'
204//CHECK-NEXT: |-VarDecl {{.*}} SA_type 'SA_t':'_Accum'
205//CHECK-NEXT: |-VarDecl {{.*}} SlA_type 'SlA_t':'long _Accum'
206//CHECK-NEXT: |-VarDecl {{.*}} UsA_type 'UsA_t':'unsigned short _Accum'
207//CHECK-NEXT: |-VarDecl {{.*}} UA_type 'UA_t':'unsigned _Accum'
208//CHECK-NEXT: |-VarDecl {{.*}} UlA_type 'UlA_t':'unsigned long _Accum'
209//CHECK-NEXT: |-VarDecl {{.*}} SsF_type 'SsF_t':'short _Fract'
210//CHECK-NEXT: |-VarDecl {{.*}} SF_type 'SF_t':'_Fract'
211//CHECK-NEXT: |-VarDecl {{.*}} SlF_type 'SlF_t':'long _Fract'
212//CHECK-NEXT: |-VarDecl {{.*}} UsF_type 'UsF_t':'unsigned short _Fract'
213//CHECK-NEXT: |-VarDecl {{.*}} UF_type 'UF_t':'unsigned _Fract'
214//CHECK-NEXT: |-VarDecl {{.*}} UlF_type 'UlF_t':'unsigned long _Fract'
215//CHECK-NEXT: |-VarDecl {{.*}} sA_type 'sA_t':'short _Accum'
216//CHECK-NEXT: |-VarDecl {{.*}} A_type 'A_t':'_Accum'
217//CHECK-NEXT: |-VarDecl {{.*}} lA_type 'lA_t':'long _Accum'
218//CHECK-NEXT: |-VarDecl {{.*}} sF_type 'sF_t':'short _Fract'
219//CHECK-NEXT: |-VarDecl {{.*}} F_type 'F_t':'_Fract'
220//CHECK-NEXT: |-VarDecl {{.*}} lF_type 'lF_t':'long _Fract'
221
222//CHECK-NEXT: |-VarDecl {{.*}} SatSsA_type 'SatSsA_t':'_Sat short _Accum'
223//CHECK-NEXT: |-VarDecl {{.*}} SatSA_type 'SatSA_t':'_Sat _Accum'
224//CHECK-NEXT: |-VarDecl {{.*}} SatSlA_type 'SatSlA_t':'_Sat long _Accum'
225//CHECK-NEXT: |-VarDecl {{.*}} SatUsA_type 'SatUsA_t':'_Sat unsigned short _Accum'
226//CHECK-NEXT: |-VarDecl {{.*}} SatUA_type 'SatUA_t':'_Sat unsigned _Accum'
227//CHECK-NEXT: |-VarDecl {{.*}} SatUlA_type 'SatUlA_t':'_Sat unsigned long _Accum'
228//CHECK-NEXT: |-VarDecl {{.*}} SatSsF_type 'SatSsF_t':'_Sat short _Fract'
229//CHECK-NEXT: |-VarDecl {{.*}} SatSF_type 'SatSF_t':'_Sat _Fract'
230//CHECK-NEXT: |-VarDecl {{.*}} SatSlF_type 'SatSlF_t':'_Sat long _Fract'
231//CHECK-NEXT: |-VarDecl {{.*}} SatUsF_type 'SatUsF_t':'_Sat unsigned short _Fract'
232//CHECK-NEXT: |-VarDecl {{.*}} SatUF_type 'SatUF_t':'_Sat unsigned _Fract'
233//CHECK-NEXT: |-VarDecl {{.*}} SatUlF_type 'SatUlF_t':'_Sat unsigned long _Fract'
234//CHECK-NEXT: |-VarDecl {{.*}} SatsA_type 'SatsA_t':'_Sat short _Accum'
235//CHECK-NEXT: |-VarDecl {{.*}} SatA_type 'SatA_t':'_Sat _Accum'
236//CHECK-NEXT: |-VarDecl {{.*}} SatlA_type 'SatlA_t':'_Sat long _Accum'
237//CHECK-NEXT: |-VarDecl {{.*}} SatsF_type 'SatsF_t':'_Sat short _Fract'
238//CHECK-NEXT: |-VarDecl {{.*}} SatF_type 'SatF_t':'_Sat _Fract'
239//CHECK-NEXT: |-VarDecl {{.*}} SatlF_type 'SatlF_t':'_Sat long _Fract'
240
241// Fixed point literal exponent syntax
242_Accum decexp1 = 1.575e1k;
243_Accum decexp2 = 1.575E1k;
244_Accum decexp3 = 1575e-2k;
245_Accum decexp4 = 1575E-2k;
246
247_Accum hexexp1 = 0x0.3p10k;
248_Accum hexexp2 = 0x0.3P10k;
249_Accum hexexp3 = 0x30000p-10k;
250_Accum hexexp4 = 0x30000P-10k;
251
252_Accum zeroexp1 = 1e0k;
253_Accum zeroexp2 = 1e-0k;
254
255//CHECK-NEXT: |-VarDecl {{.*}} decexp1 '_Accum' cinit
256//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 15.75
257//CHECK-NEXT: |-VarDecl {{.*}} decexp2 '_Accum' cinit
258//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 15.75
259//CHECK-NEXT: |-VarDecl {{.*}} decexp3 '_Accum' cinit
260//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 15.75
261//CHECK-NEXT: |-VarDecl {{.*}} decexp4 '_Accum' cinit
262//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 15.75
263
264//CHECK-NEXT: |-VarDecl {{.*}} hexexp1 '_Accum' cinit
265//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 192.0
266//CHECK-NEXT: |-VarDecl {{.*}} hexexp2 '_Accum' cinit
267//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 192.0
268//CHECK-NEXT: |-VarDecl {{.*}} hexexp3 '_Accum' cinit
269//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 192.0
270//CHECK-NEXT: |-VarDecl {{.*}} hexexp4 '_Accum' cinit
271//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 192.0
272
273//CHECK-NEXT: |-VarDecl {{.*}} zeroexp1 '_Accum' cinit
274//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 1.0
275//CHECK-NEXT: |-VarDecl {{.*}} zeroexp2 '_Accum' cinit
276//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 1.0
277
278// Fixed point literal values
279_Accum literal1 = 2.5k;       // Precise decimal
280_Accum literal2 = 0.0k;       // Zero
281_Accum literal3 = 1.1k;       // Imprecise decimal
282_Accum literal4 = 1.11k;
283_Accum literal5 = 1.111k;
284_Accum literal6 = 1.1111k;
285_Accum literal7 = 1.11111k;   // After some point after the radix, adding any more
286                              // digits to the literal will not result in any
287                              // further precision since the nth digit added may
288                              // be less than the precision that can be
289                              // represented by the fractional bits of the type.
290                              // This results in the same value being stored for
291                              // the type.
292
293//CHECK-NEXT: |-VarDecl {{.*}} literal1 '_Accum' cinit
294//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 2.5
295//CHECK-NEXT: |-VarDecl {{.*}} literal2 '_Accum' cinit
296//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 0.0
297//CHECK-NEXT: |-VarDecl {{.*}} literal3 '_Accum' cinit
298//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 1.0999755859375
299//CHECK-NEXT: |-VarDecl {{.*}} literal4 '_Accum' cinit
300//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 1.1099853515625
301//CHECK-NEXT: |-VarDecl {{.*}} literal5 '_Accum' cinit
302//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 1.110992431640625
303//CHECK-NEXT: |-VarDecl {{.*}} literal6 '_Accum' cinit
304//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 1.111083984375
305//CHECK-NEXT: |-VarDecl {{.*}} literal7 '_Accum' cinit
306//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 1.111083984375
307
308long _Accum longaccumliteral     = 0.99999999lk;
309long _Accum longaccumliteral2    = 0.999999999lk;
310long _Accum verylongaccumliteral = 0.99999999999999999999999999lk;
311long _Fract longfractliteral     = 0.99999999lr;
312long _Fract longfractliteral2    = 0.999999999lr;
313long _Fract verylongfractliteral = 0.99999999999999999999999999lr;
314
315//CHECK-NEXT: |-VarDecl {{.*}} longaccumliteral 'long _Accum' cinit
316//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'long _Accum' 0.999999989755451679229736328125
317//CHECK-NEXT: |-VarDecl {{.*}} longaccumliteral2 'long _Accum' cinit
318//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'long _Accum' 0.9999999986030161380767822265625
319//CHECK-NEXT: |-VarDecl {{.*}} verylongaccumliteral 'long _Accum' cinit
320//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'long _Accum' 0.9999999995343387126922607421875
321//CHECK-NEXT: |-VarDecl {{.*}} longfractliteral 'long _Fract' cinit
322//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'long _Fract' 0.999999989755451679229736328125
323//CHECK-NEXT: |-VarDecl {{.*}} longfractliteral2 'long _Fract' cinit
324//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'long _Fract' 0.9999999986030161380767822265625
325//CHECK-NEXT: |-VarDecl {{.*}} verylongfractliteral 'long _Fract' cinit
326//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'long _Fract' 0.9999999995343387126922607421875
327
328unsigned _Accum uliteral1 = 2.5uk;    // Unsigned
329_Accum literal8 = -2.5k;              // Negative
330
331//CHECK-NEXT: |-VarDecl {{.*}} uliteral1 'unsigned _Accum' cinit
332//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'unsigned _Accum' 2.5
333//CHECK-NEXT: |-VarDecl {{.*}} literal8 '_Accum' cinit
334//CHECK-NEXT:   `-UnaryOperator {{.*}} '_Accum' prefix '-'
335//CHECK-NEXT:     `-FixedPointLiteral {{.*}} '_Accum' 2.5
336
337short _Accum  literalexact1 = 0.9921875hk;  // Exact value
338_Accum        literalexact2 = 0.999969482421875k;
339
340//CHECK-NEXT: |-VarDecl {{.*}} literalexact1 'short _Accum' cinit
341//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'short _Accum' 0.9921875
342//CHECK-NEXT: |-VarDecl {{.*}} literalexact2 '_Accum' cinit
343//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 0.999969482421875
344
345// Unfortunately we do not have enough space to store the exact decimal value of
346// 0.9999999995343387126922607421875 ((1 << 31) - 1), but we can still use a
347// large number of 9s to get the max fractional value.
348long _Accum   long_accum_max = 0.999999999999999999999999999lk;
349
350//CHECK-NEXT: |-VarDecl {{.*}} long_accum_max 'long _Accum' cinit
351//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'long _Accum' 0.9999999995343387126922607421875
352
353// Epsilon
354short _Accum  short_accum_eps   = 0.0078125hk;
355short _Accum  short_accum_eps2  = 0.0078124hk;  // Less than epsilon floors to zero
356_Accum        accum_eps         = 0.000030517578125k;
357_Accum        accum_eps2        = 0.000030517578124k;
358long _Accum   long_accum_eps    = 0x1p-31lk;
359long _Accum   long_accum_eps2   = 0x0.99999999p-31lk;
360
361//CHECK-NEXT: |-VarDecl {{.*}} short_accum_eps 'short _Accum' cinit
362//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'short _Accum' 0.0078125
363//CHECK-NEXT: |-VarDecl {{.*}} short_accum_eps2 'short _Accum' cinit
364//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'short _Accum' 0.0
365//CHECK-NEXT: |-VarDecl {{.*}} accum_eps '_Accum' cinit
366//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 0.000030517578125
367//CHECK-NEXT: |-VarDecl {{.*}} accum_eps2 '_Accum' cinit
368//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 0.0
369//CHECK-NEXT: |-VarDecl {{.*}} long_accum_eps 'long _Accum' cinit
370//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'long _Accum' 0.0000000004656612873077392578125
371//CHECK-NEXT: |-VarDecl {{.*}} long_accum_eps2 'long _Accum' cinit
372//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'long _Accum' 0.0
373
374// Fract literals can be one but evaluate to the respective Fract max
375short _Fract           short_fract_one   = 1.0hr;
376_Fract                 fract_one         = 1.0r;
377long _Fract            long_fract_one    = 1.0lr;
378unsigned short _Fract  u_short_fract_one = 1.0uhr;
379unsigned _Fract        u_fract_one       = 1.0ur;
380unsigned long _Fract   u_long_fract_one  = 1.0ulr;
381
382//CHECK-NEXT: |-VarDecl {{.*}} short_fract_one 'short _Fract' cinit
383//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'short _Fract' 0.9921875
384//CHECK-NEXT: |-VarDecl {{.*}} fract_one '_Fract' cinit
385//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Fract' 0.999969482421875
386//CHECK-NEXT: |-VarDecl {{.*}} long_fract_one 'long _Fract' cinit
387//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'long _Fract' 0.9999999995343387126922607421875
388
389//CHECK-NEXT: |-VarDecl {{.*}} u_short_fract_one 'unsigned short _Fract' cinit
390//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'unsigned short _Fract' 0.99609375
391//CHECK-NEXT: |-VarDecl {{.*}} u_fract_one 'unsigned _Fract' cinit
392//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'unsigned _Fract' 0.9999847412109375
393//CHECK-NEXT: |-VarDecl {{.*}} u_long_fract_one 'unsigned long _Fract' cinit
394//CHECK-NEXT:   `-FixedPointLiteral {{.*}} 'unsigned long _Fract' 0.99999999976716935634613037109375
395
396_Accum literallast = 1.0k;    // One
397
398//CHECK-NEXT: `-VarDecl {{.*}} literallast '_Accum' cinit
399//CHECK-NEXT:   `-FixedPointLiteral {{.*}} '_Accum' 1.0
400