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