msg_204.c revision 1.9
11.9Srillig/*	$NetBSD: msg_204.c,v 1.9 2023/07/09 11:18:55 rillig Exp $	*/
21.1Srillig# 3 "msg_204.c"
31.1Srillig
41.1Srillig// Test for message: controlling expressions must have scalar type [204]
51.1Srillig
61.8Srillig/* Suppress messages for unused arguments and for 'extern' declarations. */
71.8Srillig/* lint1-extra-flags: -X 231 -X 351 */
81.7Srillig
91.2Srilligextern void
101.2Srilligextern_function(void);
111.2Srillig
121.2Srilligvoid (*function_pointer)(void);
131.2Srillig
141.2Srillig/*
151.2Srillig * Since func.c 1.39 from 2020-12-31 18:51:28, lint had produced an error
161.2Srillig * when a controlling expression was a function.  Pointers to functions were
171.2Srillig * ok though.
181.2Srillig */
191.2Srilligvoid
201.2Srilligbug_between_2020_12_31_and_2021_01_08(void)
211.2Srillig{
221.2Srillig	if (extern_function)
231.2Srillig		extern_function();
241.2Srillig
251.2Srillig	/*
261.2Srillig	 * FIXME: For some reason, the ampersand is discarded in
271.4Srillig	 *  build_address.  This only has a visible effect if the
281.2Srillig	 *  t_spec in check_controlling_expression is evaluated too early,
291.2Srillig	 *  as has been the case before func.c 1.52 from 2021-01-08.
301.2Srillig	 */
311.2Srillig	if (&extern_function)
321.2Srillig		extern_function();
331.2Srillig
341.2Srillig	/* This one has always been ok since pointers are scalar types. */
351.2Srillig	if (function_pointer)
361.2Srillig		function_pointer();
371.2Srillig}
381.3Srillig
391.3Srilligstruct s {
401.3Srillig	int member;
411.3Srillig};
421.3Srillig
431.3Srilligunion u {
441.3Srillig	int member;
451.3Srillig};
461.3Srillig
471.3Srilligenum e {
481.3Srillig	E
491.3Srillig};
501.3Srillig
511.3Srilligstruct arr {
521.3Srillig	int arr[4];
531.3Srillig};
541.3Srillig
551.3Srillig/* C99 6.2.5p2 */
561.3Srilligvoid if_Bool(_Bool b)			{ if (b) return; }
571.3Srillig
581.3Srillig/* C99 6.2.5p3 */
591.3Srilligvoid if_char(char c)			{ if (c) return; }
601.3Srillig
611.3Srillig/* C99 6.2.5p4 */
621.3Srilligvoid if_signed_char(signed char sc)	{ if (sc) return; }
631.3Srilligvoid if_short_int(short s)		{ if (s) return; }
641.3Srilligvoid if_int(int i)			{ if (i) return; }
651.3Srilligvoid if_long_int(long int l)		{ if (l) return; }
661.3Srilligvoid if_long_long_int(long long int ll)	{ if (ll) return; }
671.3Srillig
681.3Srillig/* C99 6.2.5p6 */
691.3Srilligvoid if_unsigned_char(unsigned char uc)			{ if (uc) return; }
701.3Srilligvoid if_unsigned_short_int(unsigned short us)		{ if (us) return; }
711.3Srilligvoid if_unsigned_int(unsigned int ui)			{ if (ui) return; }
721.3Srilligvoid if_unsigned_long_int(unsigned long int ul)		{ if (ul) return; }
731.3Srilligvoid if_unsigned_long_long_int(unsigned long long int ull) { if (ull) return; }
741.3Srillig
751.3Srillig/* C99 6.2.5p10 */
761.3Srilligvoid if_float(float f)			{ if (f) return; }
771.3Srilligvoid if_double(double d)		{ if (d) return; }
781.3Srilligvoid if_long_double(long double ld)	{ if (ld) return; }
791.3Srillig
801.3Srillig/* C99 6.2.5p11 */
811.3Srilligvoid if_float_Complex(float _Complex fc)		{ if (fc) return; }
821.3Srilligvoid if_double_Complex(double _Complex dc)		{ if (dc) return; }
831.3Srilligvoid if_long_double_Complex(long double _Complex ldc)	{ if (ldc) return; }
841.3Srillig
851.3Srillig/* C99 6.2.5p16 */
861.3Srilligvoid if_enum(enum e e)			{ if (e) return; }
871.3Srillig
881.3Srillig/* C99 6.2.5p20 */
891.3Srilligvoid if_array(struct arr arr)		{ if (arr.arr) return; }
901.7Srillig/* expect+1: error: controlling expressions must have scalar type [204] */
911.7Srilligvoid if_struct(struct s s)		{ if (s) return; }
921.7Srillig/* expect+1: error: controlling expressions must have scalar type [204] */
931.7Srilligvoid if_union(union u u)		{ if (u) return; }
941.3Srilligvoid if_function(void)			{ if (if_function) return; }
951.3Srilligvoid if_pointer(void *p)		{ if (p) return; }
961.3Srillig
971.3Srillig/* C99 6.8.5 */
981.7Srillig/* expect+1: error: controlling expressions must have scalar type [204] */
991.7Srilligvoid while_struct(struct s s)		{ while (s) return; }
1001.7Srillig/* expect+2: error: controlling expressions must have scalar type [204] */
1011.7Srillig/* expect+1: warning: end-of-loop code not reached [223] */
1021.7Srilligvoid for_struct(struct s s)		{ for (;s;) return; }
1031.7Srillig/* expect+1: error: controlling expressions must have scalar type [204] */
1041.7Srilligvoid do_while_struct(struct s s)	{ do { return; } while (s); }
1051.3Srillig
1061.3Srillig/*
1071.3Srillig * C99 6.5.15 for the '?:' operator does not explicitly mention that the
1081.3Srillig * controlling expression must have a scalar type, curiously.
1091.3Srillig */
1101.9Srillig/* expect+2: error: first operand of '?' must have scalar type [170] */
1111.7Srillig/* expect+1: warning: function 'conditional_struct' expects to return value [214] */
1121.7Srilligint conditional_struct(struct s s)	{ return s ? 1 : 2; }
113