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