1*925438b6Srillig /* $NetBSD: c11_generic_expression.c,v 1.2 2021/06/27 19:59:23 rillig Exp $ */ 21a74119aSrillig # 3 "c11_generic_expression.c" 31a74119aSrillig 41a74119aSrillig /* 51a74119aSrillig * C99 added support for type-generic macros, but these were limited to the 61a74119aSrillig * header <tgmath.h>. C11 made this feature generally available. 71a74119aSrillig * 81a74119aSrillig * The generic selection is typically used with macros, but since lint1 works 91a74119aSrillig * on the preprocessed source, the test cases look a bit strange. 101a74119aSrillig * 111a74119aSrillig * C99 6.5.1.1 "Generic selection" 121a74119aSrillig */ 131a74119aSrillig 141a74119aSrillig /* lint1-extra-flags: -Ac11 */ 151a74119aSrillig 161a74119aSrillig /* 171a74119aSrillig * The type of 'var' is not compatible with any of the types from the 181a74119aSrillig * generic-association. This is a compile-time error. 191a74119aSrillig */ 201a74119aSrillig const char * 21*925438b6Srillig classify_type_without_default(double var) 221a74119aSrillig { 231a74119aSrillig return _Generic(var, 241a74119aSrillig long double: "long double", 251a74119aSrillig long long: "long long", 261a74119aSrillig unsigned: "unsigned" 271a74119aSrillig ); 281a74119aSrillig /* expect-7: argument 'var' unused */ 291a74119aSrillig /* expect-2: type mismatch (pointer to const char) and (double) *//* FIXME */ 301a74119aSrillig } 311a74119aSrillig 321a74119aSrillig /* 331a74119aSrillig * In this case, the 'default' expression is selected. 341a74119aSrillig */ 351a74119aSrillig const char * 36*925438b6Srillig classify_type_with_default(double var) 371a74119aSrillig { 381a74119aSrillig return _Generic(var, 391a74119aSrillig long double: "long double", 401a74119aSrillig long long: "long long", 411a74119aSrillig unsigned: "unsigned", 421a74119aSrillig default: "unknown" 431a74119aSrillig ); 441a74119aSrillig /* expect-8: argument 'var' unused */ 451a74119aSrillig /* expect-2: type mismatch (pointer to const char) and (double) *//* FIXME */ 461a74119aSrillig } 47*925438b6Srillig 48*925438b6Srillig /* 49*925438b6Srillig * The type of a _Generic expression is the one from the selected association. 50*925438b6Srillig */ 51*925438b6Srillig const char * 52*925438b6Srillig classify_char(char c) 53*925438b6Srillig { 54*925438b6Srillig return _Generic(c, 55*925438b6Srillig char: "yes", 56*925438b6Srillig default: 0.0 57*925438b6Srillig ); 58*925438b6Srillig /* expect-1: (pointer to const char) and integer (char) [183] */ 59*925438b6Srillig } 60