1 1.1 rillig /* $NetBSD: expr_binary_trad.c,v 1.1 2021/08/01 16:29:28 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.1 rillig /* lint1-flags: -tw */ 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.1 rillig /* expect+1: 'pointer to char' */ 25 1.1 rillig sink = (char *)0 + 0; 26 1.1 rillig 27 1.1 rillig /* expect+1: 'pointer to char' */ 28 1.1 rillig sink = 0 + (char *)0; 29 1.1 rillig 30 1.1 rillig /* expect+1: 'int' */ 31 1.1 rillig sink = 1 + 1; 32 1.1 rillig 33 1.1 rillig /* expect+1: 'double' */ 34 1.1 rillig sink = 0.0 + 0; 35 1.1 rillig /* expect+1: 'double' */ 36 1.1 rillig sink = 0 + 0.0; 37 1.1 rillig /* expect+1: 'double' */ 38 1.1 rillig sink = 0.0 + (float)0.0; 39 1.1 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.1 rillig /* expect+1: 'double' */ 47 1.1 rillig sink = (float)0.0 + 0; 48 1.1 rillig /* expect+1: 'double' */ 49 1.1 rillig sink = 0 + (float)0.0; 50 1.1 rillig 51 1.1 rillig /* expect+1: 'unsigned long' */ 52 1.1 rillig sink = (unsigned long)0 + 0; 53 1.1 rillig /* expect+1: 'unsigned long' */ 54 1.1 rillig sink = 0 + (unsigned long)0; 55 1.1 rillig 56 1.1 rillig /* expect+1: 'unsigned long' */ 57 1.1 rillig sink = (unsigned long)0 + (long)0; 58 1.1 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.1 rillig /* expect+1: 'unsigned long' */ 66 1.1 rillig sink = (unsigned)0 + (long)0; 67 1.1 rillig } 68