github.com/gotranspile/cxgo@v0.3.8-0.20240118201721-29871598a6a2/literals_test.go (about) 1 package cxgo 2 3 import "testing" 4 5 var casesTranslateLiterals = []parseCase{ 6 { 7 name: "literal statement", 8 src: ` 9 void foo() { 10 0; 11 } 12 `, 13 exp: ` 14 func foo() { 15 } 16 `, 17 }, 18 { 19 name: "string -> byte ptr", 20 src: ` 21 void foo() { 22 char* a; 23 a = "abc"; 24 } 25 `, 26 exp: ` 27 func foo() { 28 var a *byte 29 _ = a 30 a = libc.CString("abc") 31 } 32 `, 33 }, 34 { 35 name: "rune -> int", 36 src: ` 37 void foo() { 38 int a = 'a'; 39 } 40 `, 41 exp: ` 42 func foo() { 43 var a int32 = 'a' 44 _ = a 45 } 46 `, 47 }, 48 { 49 name: "wstring -> wchar ptr", 50 src: ` 51 #include <stddef.h> 52 53 void foo() { 54 wchar_t* a; 55 a = L"abc"; 56 } 57 `, 58 exp: ` 59 func foo() { 60 var a *libc.WChar 61 _ = a 62 a = libc.CWString("abc") 63 } 64 `, 65 }, 66 { 67 name: "negative char", 68 src: ` 69 void foo() { 70 char a; 71 a = -1; 72 a = -2; 73 } 74 `, 75 exp: ` 76 func foo() { 77 var a int8 78 _ = a 79 a = -1 80 a = -2 81 } 82 `, 83 }, 84 { 85 name: "negative uchar", 86 src: ` 87 void foo() { 88 unsigned char a; 89 a = -1; 90 a = -2; 91 } 92 `, 93 exp: ` 94 func foo() { 95 var a uint8 96 _ = a 97 a = math.MaxUint8 98 a = 254 99 } 100 `, 101 }, 102 { 103 name: "negative ushort", 104 src: ` 105 void foo() { 106 unsigned short a; 107 a = -1; 108 a = -2; 109 } 110 `, 111 exp: ` 112 func foo() { 113 var a uint16 114 _ = a 115 a = math.MaxUint16 116 a = 65534 117 } 118 `, 119 }, 120 { 121 name: "negative uint", 122 src: ` 123 void foo() { 124 unsigned int a; 125 a = -1; 126 a = -2; 127 } 128 `, 129 exp: ` 130 func foo() { 131 var a uint32 132 _ = a 133 a = math.MaxUint32 134 a = 4294967294 135 } 136 `, 137 }, 138 { 139 name: "int overflow", 140 src: ` 141 void foo(int a) { 142 if (a & 0xFFFF0000) { 143 return; 144 } 145 a = 0x80000000; 146 a = 2415929931; 147 } 148 `, 149 exp: ` 150 func foo(a int32) { 151 if uint32(a)&0xFFFF0000 != 0 { 152 return 153 } 154 a = math.MinInt32 155 a = -1879037365 156 } 157 `, 158 }, 159 { 160 name: "float const -> int", 161 src: ` 162 void foo() { 163 int a = 1.1 + 0.5; 164 } 165 `, 166 exp: ` 167 func foo() { 168 var a int32 = int32(math.Floor(1.1 + 0.5)) 169 _ = a 170 } 171 `, 172 }, 173 { 174 name: "float const + int", 175 src: ` 176 void foo(int a) { 177 int b = a + (3.0 / 2); 178 } 179 `, 180 exp: ` 181 func foo(a int32) { 182 var b int32 = int32(float64(a) + 3.0/2) 183 _ = b 184 } 185 `, 186 }, 187 { 188 name: "stdint const override", 189 src: ` 190 #include <stdint.h> 191 192 void foo() { 193 int16_t a1 = INT16_MAX; 194 a1 = INT16_MIN; 195 } 196 `, 197 exp: ` 198 func foo() { 199 var a1 int16 = math.MaxInt16 200 _ = a1 201 a1 = math.MinInt16 202 } 203 `, 204 }, 205 { 206 name: "var init sum", 207 src: ` 208 int foo = 1+2; 209 `, 210 exp: ` 211 var foo int32 = 1 + 2 212 `, 213 }, 214 { 215 name: "char var init", 216 src: ` 217 char foo = '"'; 218 `, 219 exp: ` 220 var foo int8 = '"' 221 `, 222 }, 223 { 224 name: "comp lit zero init", 225 src: ` 226 typedef struct A { 227 int x; 228 } A; 229 typedef struct B { 230 int x; 231 int y; 232 } B; 233 typedef struct C { 234 B x; 235 int y; 236 } C; 237 A v1 = {0}; 238 B v2 = {0}; 239 C v3 = {0}; 240 `, 241 exp: ` 242 type A struct { 243 X int32 244 } 245 type B struct { 246 X int32 247 Y int32 248 } 249 type C struct { 250 X B 251 Y int32 252 } 253 254 var v1 A = A{} 255 var v2 B = B{} 256 var v3 C = C{} 257 `, 258 }, 259 { 260 name: "comp lit zero compare and assign", 261 src: ` 262 typedef struct A { 263 int x; 264 } A; 265 266 void foo(void) { 267 A v1; 268 if (v1 == 0) { 269 v1 = 0; 270 } 271 } 272 `, 273 exp: ` 274 type A struct { 275 X int32 276 } 277 278 func foo() { 279 var v1 A 280 if v1 == (A{}) { 281 v1 = A{} 282 } 283 } 284 `, 285 }, 286 { 287 name: "array lit", 288 src: ` 289 int arr1[10] = { 12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753 }; 290 int arr2[10] = { 12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753, }; 291 `, 292 exp: ` 293 var arr1 [10]int32 = [10]int32{12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753} 294 var arr2 [10]int32 = [10]int32{12, 34, 56, 78, 90, 123, 456, 789, 8642, 9753} 295 `, 296 }, 297 { 298 name: "array lit indexes", 299 src: ` 300 int arr1[] = { 301 [0] = 0, 302 [1] = 1, 303 [2] = 2, 304 3, 305 [4] = 4, 306 5, 307 6, 308 }; 309 int arr2[7] = { 310 [0] = 0, 311 [1] = 1, 312 [2] = 2, 313 3, 314 [4] = 4, 315 5, 316 }; 317 `, 318 exp: ` 319 var arr1 [7]int32 = [7]int32{0, 1, 2, 3, 4, 5, 6} 320 var arr2 [7]int32 = [7]int32{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5} 321 `, 322 }, 323 { 324 name: "nested struct fields init", 325 src: ` 326 struct inner { 327 int f; 328 int g; 329 int h; 330 }; 331 struct outer { 332 int A; 333 struct inner B; 334 int C; 335 }; 336 struct outer x = { 337 .C = 100, 338 .B.g = 200, 339 .A = 300, 340 .B.f = 400, 341 }; 342 `, 343 exp: ` 344 type inner struct { 345 F int32 346 G int32 347 H int32 348 } 349 type outer struct { 350 A int32 351 B inner 352 C int32 353 } 354 355 var x outer = outer{C: 100, B: inner{G: 200, F: 400}, A: 300} 356 `, 357 }, 358 { 359 name: "string literal ternary", 360 src: ` 361 int a; 362 char* b = a ? "1" : "2"; 363 `, 364 exp: ` 365 var a int32 366 var b *byte = libc.CString(func() string { 367 if a != 0 { 368 return "1" 369 } 370 return "2" 371 }()) 372 `, 373 }, 374 { 375 name: "init byte string", 376 src: ` 377 char b[] = "==="; 378 `, 379 exp: ` 380 var b [4]byte = func() [4]byte { 381 var t [4]byte 382 copy(t[:], []byte("===")) 383 return t 384 }() 385 `, 386 }, 387 { 388 name: "init named uint8_t string", 389 src: ` 390 #include <stdint.h> 391 typedef uint8_t MYubyte; 392 MYubyte vendor[] = "something here"; 393 `, 394 exp: ` 395 type MYubyte uint8 396 397 var vendor [15]MYubyte = func() [15]MYubyte { 398 var t [15]MYubyte 399 copy(t[:], []MYubyte("something here")) 400 return t 401 }() 402 `, 403 }, 404 { 405 name: "double negate", 406 src: ` 407 #define MONE (-1) 408 int x; 409 int y = x - MONE; 410 `, 411 exp: ` 412 const MONE = -1 413 414 var x int32 415 var y int32 = x - int32(-1) 416 `, 417 // TODO: x - (-1) 418 }, { 419 name: "float div literal", 420 src: ` 421 void foo() { 422 float x = 4/3.0; 423 } 424 `, 425 exp: ` 426 func foo() { 427 var x float32 = 4 / 3.0 428 _ = x 429 } 430 `, 431 }, 432 } 433 434 func TestLiterals(t *testing.T) { 435 runTestTranslate(t, casesTranslateLiterals) 436 }