Leonard Chan | f921d85 | 2018-06-04 16:07:52 +0000 | [diff] [blame] | 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 |
| 6 | signed short _Accum s_short_accum; |
| 7 | signed _Accum s_accum; |
| 8 | signed long _Accum s_long_accum; |
| 9 | unsigned short _Accum u_short_accum; |
| 10 | unsigned _Accum u_accum; |
| 11 | unsigned long _Accum u_long_accum; |
Leonard Chan | ab80f3c | 2018-06-14 14:53:51 +0000 | [diff] [blame] | 12 | signed short _Fract s_short_fract; |
| 13 | signed _Fract s_fract; |
| 14 | signed long _Fract s_long_fract; |
| 15 | unsigned short _Fract u_short_fract; |
| 16 | unsigned _Fract u_fract; |
| 17 | unsigned long _Fract u_long_fract; |
Leonard Chan | f921d85 | 2018-06-04 16:07:52 +0000 | [diff] [blame] | 18 | |
| 19 | // Aliased fixed point types |
| 20 | short _Accum short_accum; |
| 21 | _Accum accum; |
| 22 | long _Accum long_accum; |
Leonard Chan | ab80f3c | 2018-06-14 14:53:51 +0000 | [diff] [blame] | 23 | short _Fract short_fract; |
| 24 | _Fract fract; |
| 25 | long _Fract long_fract; |
Leonard Chan | f921d85 | 2018-06-04 16:07:52 +0000 | [diff] [blame] | 26 | |
Leonard Chan | ab80f3c | 2018-06-14 14:53:51 +0000 | [diff] [blame] | 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' |
Leonard Chan | f921d85 | 2018-06-04 16:07:52 +0000 | [diff] [blame] | 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 | |
| 98 | MIX_VOLATILE(signed, short, vol_s_short_accum) |
| 99 | MIX_ATOMIC(signed, short, atm_s_short_accum) |
| 100 | MIX_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' |
Leonard Chan | ab80f3c | 2018-06-14 14:53:51 +0000 | [diff] [blame] | 115 | // CHECK-NEXT: |-VarDecl {{.*}} const_s_short_accum4 'const short _Accum' |
| 116 | |
| 117 | /* Typedefs */ |
| 118 | |
| 119 | // Primary fixed point types |
| 120 | typedef signed short _Accum SsA_t; |
| 121 | typedef signed _Accum SA_t; |
| 122 | typedef signed long _Accum SlA_t; |
| 123 | typedef unsigned short _Accum UsA_t; |
| 124 | typedef unsigned _Accum UA_t; |
| 125 | typedef unsigned long _Accum UlA_t; |
| 126 | typedef signed short _Fract SsF_t; |
| 127 | typedef signed _Fract SF_t; |
| 128 | typedef signed long _Fract SlF_t; |
| 129 | typedef unsigned short _Fract UsF_t; |
| 130 | typedef unsigned _Fract UF_t; |
| 131 | typedef unsigned long _Fract UlF_t; |
| 132 | |
| 133 | // Aliased fixed point types |
| 134 | typedef short _Accum sA_t; |
| 135 | typedef _Accum A_t; |
| 136 | typedef long _Accum lA_t; |
| 137 | typedef short _Fract sF_t; |
| 138 | typedef _Fract F_t; |
| 139 | typedef long _Fract lF_t; |
| 140 | |
| 141 | // Saturated fixed point types |
| 142 | typedef _Sat signed short _Accum SatSsA_t; |
| 143 | typedef _Sat signed _Accum SatSA_t; |
| 144 | typedef _Sat signed long _Accum SatSlA_t; |
| 145 | typedef _Sat unsigned short _Accum SatUsA_t; |
| 146 | typedef _Sat unsigned _Accum SatUA_t; |
| 147 | typedef _Sat unsigned long _Accum SatUlA_t; |
| 148 | typedef _Sat signed short _Fract SatSsF_t; |
| 149 | typedef _Sat signed _Fract SatSF_t; |
| 150 | typedef _Sat signed long _Fract SatSlF_t; |
| 151 | typedef _Sat unsigned short _Fract SatUsF_t; |
| 152 | typedef _Sat unsigned _Fract SatUF_t; |
| 153 | typedef _Sat unsigned long _Fract SatUlF_t; |
| 154 | |
| 155 | // Aliased saturated fixed point types |
| 156 | typedef _Sat short _Accum SatsA_t; |
| 157 | typedef _Sat _Accum SatA_t; |
| 158 | typedef _Sat long _Accum SatlA_t; |
| 159 | typedef _Sat short _Fract SatsF_t; |
| 160 | typedef _Sat _Fract SatF_t; |
| 161 | typedef _Sat long _Fract SatlF_t; |
| 162 | |
| 163 | SsA_t SsA_type; |
| 164 | SA_t SA_type; |
| 165 | SlA_t SlA_type; |
| 166 | UsA_t UsA_type; |
| 167 | UA_t UA_type; |
| 168 | UlA_t UlA_type; |
| 169 | SsF_t SsF_type; |
| 170 | SF_t SF_type; |
| 171 | SlF_t SlF_type; |
| 172 | UsF_t UsF_type; |
| 173 | UF_t UF_type; |
| 174 | UlF_t UlF_type; |
| 175 | |
| 176 | sA_t sA_type; |
| 177 | A_t A_type; |
| 178 | lA_t lA_type; |
| 179 | sF_t sF_type; |
| 180 | F_t F_type; |
| 181 | lF_t lF_type; |
| 182 | |
| 183 | SatSsA_t SatSsA_type; |
| 184 | SatSA_t SatSA_type; |
| 185 | SatSlA_t SatSlA_type; |
| 186 | SatUsA_t SatUsA_type; |
| 187 | SatUA_t SatUA_type; |
| 188 | SatUlA_t SatUlA_type; |
| 189 | SatSsF_t SatSsF_type; |
| 190 | SatSF_t SatSF_type; |
| 191 | SatSlF_t SatSlF_type; |
| 192 | SatUsF_t SatUsF_type; |
| 193 | SatUF_t SatUF_type; |
| 194 | SatUlF_t SatUlF_type; |
| 195 | |
| 196 | SatsA_t SatsA_type; |
| 197 | SatA_t SatA_type; |
| 198 | SatlA_t SatlA_type; |
| 199 | SatsF_t SatsF_type; |
| 200 | SatF_t SatF_type; |
| 201 | SatlF_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' |
Leonard Chan | db01c3a | 2018-06-20 17:19:40 +0000 | [diff] [blame] | 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 | |
| 308 | long _Accum longaccumliteral = 0.99999999lk; |
| 309 | long _Accum longaccumliteral2 = 0.999999999lk; |
| 310 | long _Accum verylongaccumliteral = 0.99999999999999999999999999lk; |
| 311 | long _Fract longfractliteral = 0.99999999lr; |
| 312 | long _Fract longfractliteral2 = 0.999999999lr; |
| 313 | long _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 | |
| 328 | unsigned _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 | |
| 337 | short _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. |
| 348 | long _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 |
| 354 | short _Accum short_accum_eps = 0.0078125hk; |
| 355 | short _Accum short_accum_eps2 = 0.0078124hk; // Less than epsilon floors to zero |
| 356 | _Accum accum_eps = 0.000030517578125k; |
| 357 | _Accum accum_eps2 = 0.000030517578124k; |
| 358 | long _Accum long_accum_eps = 0x1p-31lk; |
| 359 | long _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 |
| 375 | short _Fract short_fract_one = 1.0hr; |
| 376 | _Fract fract_one = 1.0r; |
| 377 | long _Fract long_fract_one = 1.0lr; |
| 378 | unsigned short _Fract u_short_fract_one = 1.0uhr; |
| 379 | unsigned _Fract u_fract_one = 1.0ur; |
| 380 | unsigned 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 |