1 1.3 rillig /* $NetBSD: expr_binary_trad.c,v 1.3 2023/03/28 14:44:34 rillig Exp $ */ 2 1.1 rillig # 3 "expr_binary_trad.c" 3 1.1 rillig 4 1.1 rillig /* 5 1.1 rillig * Test binary operators in traditional C. 6 1.1 rillig */ 7 1.1 rillig 8 1.3 rillig /* lint1-flags: -tw -X 351 */ 9 1.1 rillig 10 1.1 rillig struct incompatible { /* just to generate the error message */ 11 1.1 rillig int member; 12 1.1 rillig }; 13 1.1 rillig struct incompatible sink; 14 1.1 rillig 15 1.1 rillig /* 16 1.1 rillig * Test the usual arithmetic conversions. 17 1.1 rillig * 18 1.1 rillig * C99 6.3.1.8 "Usual arithmetic conversions" 19 1.1 rillig */ 20 1.1 rillig void 21 1.1 rillig cover_balance() 22 1.1 rillig { 23 1.1 rillig 24 1.2 rillig /* expect+1: ... 'pointer to char' ... */ 25 1.1 rillig sink = (char *)0 + 0; 26 1.1 rillig 27 1.2 rillig /* expect+1: ... 'pointer to char' ... */ 28 1.1 rillig sink = 0 + (char *)0; 29 1.1 rillig 30 1.2 rillig /* expect+1: ... 'int' ... */ 31 1.1 rillig sink = 1 + 1; 32 1.1 rillig 33 1.2 rillig /* expect+1: ... 'double' ... */ 34 1.1 rillig sink = 0.0 + 0; 35 1.2 rillig /* expect+1: ... 'double' ... */ 36 1.1 rillig sink = 0 + 0.0; 37 1.2 rillig /* expect+1: ... 'double' ... */ 38 1.1 rillig sink = 0.0 + (float)0.0; 39 1.2 rillig /* expect+1: ... 'double' ... */ 40 1.1 rillig sink = (float)0.0 + 0.0; 41 1.1 rillig 42 1.1 rillig /* 43 1.1 rillig * In traditional C, 'float' gets promoted to 'double' before 44 1.1 rillig * applying the usual arithmetic conversions; see 'promote'. 45 1.1 rillig */ 46 1.2 rillig /* expect+1: ... 'double' ... */ 47 1.1 rillig sink = (float)0.0 + 0; 48 1.2 rillig /* expect+1: ... 'double' ... */ 49 1.1 rillig sink = 0 + (float)0.0; 50 1.1 rillig 51 1.2 rillig /* expect+1: ... 'unsigned long' ... */ 52 1.1 rillig sink = (unsigned long)0 + 0; 53 1.2 rillig /* expect+1: ... 'unsigned long' ... */ 54 1.1 rillig sink = 0 + (unsigned long)0; 55 1.1 rillig 56 1.2 rillig /* expect+1: ... 'unsigned long' ... */ 57 1.1 rillig sink = (unsigned long)0 + (long)0; 58 1.2 rillig /* expect+1: ... 'unsigned long' ... */ 59 1.1 rillig sink = (long)0 + (unsigned long)0; 60 1.1 rillig 61 1.1 rillig /* 62 1.1 rillig * In traditional C, if one of the operands is unsigned, the result 63 1.1 rillig * is unsigned as well. 64 1.1 rillig */ 65 1.2 rillig /* expect+1: ... 'unsigned long' ... */ 66 1.1 rillig sink = (unsigned)0 + (long)0; 67 1.1 rillig } 68