1*e6298b92Srillig /* $NetBSD: d_alignof.c,v 1.12 2023/07/07 19:45:22 rillig Exp $ */ 2aadcb6a6Srillig # 3 "d_alignof.c" 3aadcb6a6Srillig 491bf128dSrillig /* https://gcc.gnu.org/onlinedocs/gcc/Alignment.html */ 591bf128dSrillig 6*e6298b92Srillig /* lint1-extra-flags: -X 351 */ 7*e6298b92Srillig 891bf128dSrillig unsigned long leading_and_trailing_alignof_type(void)991bf128dSrilligleading_and_trailing_alignof_type(void) 1028604916Sjruoho { 1128604916Sjruoho return __alignof__(short); 1228604916Sjruoho } 1391bf128dSrillig 1491bf128dSrillig unsigned long leading_alignof_type(void)1591bf128dSrilligleading_alignof_type(void) 1691bf128dSrillig { 1791bf128dSrillig return __alignof(short); 1891bf128dSrillig } 1991bf128dSrillig 2091bf128dSrillig unsigned long plain_alignof_type(void)2191bf128dSrilligplain_alignof_type(void) 2291bf128dSrillig { 2391bf128dSrillig /* The plain word 'alignof' is not recognized by GCC. */ 246300d02aSrillig /* expect+2: error: function 'alignof' implicitly declared to return int [215] */ 256300d02aSrillig /* expect+1: error: syntax error 'short' [249] */ 2691bf128dSrillig return alignof(short); 2791bf128dSrillig } 2840a9b8fdSrillig /* expect-1: warning: function 'plain_alignof_type' falls off bottom without returning value [217] */ 2991bf128dSrillig 3091bf128dSrillig unsigned long leading_and_trailing_alignof_expr(void)3191bf128dSrilligleading_and_trailing_alignof_expr(void) 3291bf128dSrillig { 3391bf128dSrillig return __alignof__ 3; 3491bf128dSrillig } 3591bf128dSrillig 3691bf128dSrillig unsigned long leading_alignof_expr(void)3791bf128dSrilligleading_alignof_expr(void) 3891bf128dSrillig { 3991bf128dSrillig return __alignof 3; 4091bf128dSrillig } 4191bf128dSrillig 4291bf128dSrillig unsigned long plain_alignof_expr(void)4391bf128dSrilligplain_alignof_expr(void) 4491bf128dSrillig { 4591bf128dSrillig /* The plain word 'alignof' is not recognized by GCC. */ 466300d02aSrillig /* expect+2: error: 'alignof' undefined [99] */ 4791bf128dSrillig /* expect+1: error: syntax error '3' [249] */ 4891bf128dSrillig return alignof 3; 4991bf128dSrillig } 5040a9b8fdSrillig /* expect-1: warning: function 'plain_alignof_expr' falls off bottom without returning value [217] */ 51c1ebf8f4Srillig 52c1ebf8f4Srillig 53c1ebf8f4Srillig /* 54c1ebf8f4Srillig * As with 'sizeof', the keyword '__alignof__' doesn't require parentheses 55c1ebf8f4Srillig * when followed by an expression. This allows for the seemingly strange 56c1ebf8f4Srillig * '->' after the parentheses, which in fact is perfectly fine. 57c1ebf8f4Srillig * 58c1ebf8f4Srillig * The NetBSD style guide says "We parenthesize sizeof expressions", even 59c1ebf8f4Srillig * though it is misleading in edge cases like this. The GCC manual says that 60c1ebf8f4Srillig * '__alignof__' and 'sizeof' are syntactically the same, therefore the same 61c1ebf8f4Srillig * reasoning applies to '__alignof__'. 62c1ebf8f4Srillig */ 63c1ebf8f4Srillig unsigned long alignof_pointer_to_member(void)64c1ebf8f4Srilligalignof_pointer_to_member(void) 65c1ebf8f4Srillig { 66c1ebf8f4Srillig struct s { 67c1ebf8f4Srillig unsigned long member; 68c1ebf8f4Srillig } var = { 0 }, *ptr = &var; 69c1ebf8f4Srillig 70c1ebf8f4Srillig return __alignof__(ptr)->member + ptr->member; 71c1ebf8f4Srillig } 72bf86468dSrillig 73bf86468dSrillig void alignof_variants(void)74bf86468dSrilligalignof_variants(void) 75bf86468dSrillig { 76bf86468dSrillig /* expect+1: error: negative array dimension (-4) [20] */ 77bf86468dSrillig typedef int array_int[-(int)__alignof(int[3])]; 78bf86468dSrillig 79bf86468dSrillig /* expect+1: error: negative array dimension (-8) [20] */ 80bf86468dSrillig typedef int array_double[-(int)__alignof(double[3])]; 81bf86468dSrillig 82bf86468dSrillig /* expect+1: error: cannot take size/alignment of function type 'function(int) returning int' [144] */ 83bf86468dSrillig typedef int func[-(int)__alignof(int(int))]; 84bf86468dSrillig 85bf86468dSrillig struct int_double { 86bf86468dSrillig int i; 87bf86468dSrillig double d; 88bf86468dSrillig }; 89bf86468dSrillig /* expect+1: error: negative array dimension (-8) [20] */ 90bf86468dSrillig typedef int struct_int_double[-(int)__alignof(struct int_double)]; 91bf86468dSrillig 92bf86468dSrillig struct chars { 93bf86468dSrillig char name[20]; 94bf86468dSrillig }; 95bf86468dSrillig /* expect+1: error: negative array dimension (-1) [20] */ 96bf86468dSrillig typedef int struct_chars[-(int)__alignof(struct chars)]; 97bf86468dSrillig 98bf86468dSrillig /* expect+1: warning: struct 'incomplete_struct' never defined [233] */ 99bf86468dSrillig struct incomplete_struct; 100bf86468dSrillig /* expect+1: error: cannot take size/alignment of incomplete type [143] */ 101bf86468dSrillig typedef int incomplete_struct[-(int)__alignof(struct incomplete_struct)]; 102bf86468dSrillig 103bf86468dSrillig /* expect+1: warning: union 'incomplete_union' never defined [234] */ 104bf86468dSrillig union incomplete_union; 105bf86468dSrillig /* expect+1: error: cannot take size/alignment of incomplete type [143] */ 106bf86468dSrillig typedef int incomplete_union[-(int)__alignof(union incomplete_union)]; 107bf86468dSrillig 108bf86468dSrillig /* expect+1: warning: enum 'incomplete_enum' never defined [235] */ 109bf86468dSrillig enum incomplete_enum; 1109ae9809bSrillig /* expect+1: error: cannot take size/alignment of incomplete type [143] */ 111bf86468dSrillig typedef int incomplete_enum[-(int)__alignof(enum incomplete_enum)]; 112bf86468dSrillig 113fc9c97faSrillig /* expect+1: error: cannot take size/alignment of incomplete type [143] */ 114fc9c97faSrillig typedef int incomplete_array[-(int)__alignof(int[])]; 115fc9c97faSrillig 116bf86468dSrillig struct bit_fields { 117bf86468dSrillig _Bool bit_field:1; 118bf86468dSrillig }; 119bf86468dSrillig /* 120bf86468dSrillig * FIXME: This is not an attempt to initialize the typedef, it's the 121bf86468dSrillig * initialization of a nested expression. 122bf86468dSrillig */ 123bf86468dSrillig /* expect+2: error: cannot initialize typedef '00000000_tmp' [25] */ 124bf86468dSrillig /* expect+1: error: cannot take size/alignment of bit-field [145] */ 125fc9c97faSrillig typedef int bit_field_1[-(int)__alignof((struct bit_fields){0}.bit_field)]; 126fc9c97faSrillig 127fc9c97faSrillig struct bit_fields bit_fields; 128fc9c97faSrillig /* expect+1: error: cannot take size/alignment of bit-field [145] */ 129fc9c97faSrillig typedef int bit_field_2[-(int)__alignof(bit_fields.bit_field)]; 130bf86468dSrillig 131bf86468dSrillig /* expect+1: error: cannot take size/alignment of void [146] */ 132bf86468dSrillig typedef int plain_void[-(int)__alignof(void)]; 133bf86468dSrillig } 134