Home | History | Annotate | Line # | Download | only in lint1
msg_348.c revision 1.3
      1 /*	$NetBSD: msg_348.c,v 1.3 2021/11/01 11:46:50 rillig Exp $	*/
      2 # 3 "msg_348.c"
      3 
      4 // Test for message 348: maximum value %d of '%s' does not match maximum array index %d [348]
      5 
      6 /* lint1-extra-flags: -r */
      7 
      8 enum color {
      9 	red,
     10 	green,
     11 	/* expect+3: previous declaration of blue [260] */
     12 	/* expect+2: previous declaration of blue [260] */
     13 	/* expect+1: previous declaration of blue [260] */
     14 	blue
     15 };
     16 
     17 const char *
     18 color_name(enum color color)
     19 {
     20 	static const char *name[] = {
     21 	    "red",
     22 	    "green",
     23 	    "blue"
     24 	};
     25 	/* No warning since the maximum enum value matches the array size. */
     26 	return name[color];
     27 }
     28 
     29 const char *
     30 color_name_too_few(enum color color)
     31 {
     32 	static const char *name[] = {
     33 	    "red",
     34 	    "green"
     35 	};
     36 	/* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 1 [348] */
     37 	return name[color];
     38 }
     39 
     40 const char *
     41 color_name_too_many(enum color color)
     42 {
     43 	static const char *name[] = {
     44 	    "red",
     45 	    "green",
     46 	    "blue",
     47 	    "black"
     48 	};
     49 	/* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 3 [348] */
     50 	return name[color];
     51 }
     52 
     53 const char *
     54 color_name_computed_index(enum color color)
     55 {
     56 	static const char *name[] = {
     57 	    "unused",
     58 	    "red",
     59 	    "green",
     60 	    "blue"
     61 	};
     62 	/* No warning since the array index is not a name. */
     63 	return name[color + 1];
     64 }
     65 
     66 const char *
     67 color_name_cast_from_int(int c)
     68 {
     69 	static const char *name[] = {
     70 	    "unused",
     71 	    "red",
     72 	    "green",
     73 	    "blue"
     74 	};
     75 	/* No warning since the array index before conversion is not a name. */
     76 	return name[(enum color)(c + 1)];
     77 }
     78 
     79 const char *
     80 color_name_explicit_cast_to_int(enum color color)
     81 {
     82 	static const char *name[] = {
     83 	    "red",
     84 	    "green",
     85 	};
     86 	/* expect+1: warning: maximum value 2 of 'enum color' does not match maximum array index 1 [348] */
     87 	return name[(int)color];
     88 }
     89 
     90 const char *
     91 color_name_computed_pointer(enum color color, const char *name)
     92 {
     93 	/* No warning since 'name' is not an array. */
     94 	return (&name)[color];
     95 }
     96 
     97 extern const char *incomplete_color_name[];
     98 
     99 const char *
    100 color_name_incomplete_array(enum color color)
    101 {
    102 	/* No warning since 'incomplete_color_name' is incomplete. */
    103 	return incomplete_color_name[color];
    104 }
    105 
    106 enum large {
    107 	/* expect+1: warning: integral constant too large [56] */
    108 	min = -1LL << 40,
    109 	/* expect+1: warning: integral constant too large [56] */
    110 	max = 1LL << 40,
    111 	zero = 0
    112 };
    113 
    114 const char *
    115 large_name(enum large large)
    116 {
    117 	static const char *name[] = {
    118 	    "dummy",
    119 	};
    120 	/* No warning since at least 1 enum constant is outside of INT. */
    121 	return name[large];
    122 }
    123 
    124 enum color_with_count {
    125 	cc_red,
    126 	cc_green,
    127 	cc_blue,
    128 	cc_num_values
    129 };
    130 
    131 const char *
    132 color_with_count_name(enum color_with_count color)
    133 {
    134 	static const char *const name[] = { "red", "green", "blue" };
    135 	/* No warning since the maximum enum constant is a count. */
    136 	return name[color];
    137 }
    138 
    139 /*
    140  * If the last enum constant contains "num" in its name, it is not
    141  * necessarily the count of the other enum values, it may also be a
    142  * legitimate application value, therefore don't warn in this case.
    143  */
    144 const char *
    145 color_with_num(enum color_with_count color)
    146 {
    147 	static const char *const name[] = { "r", "g", "b", "num" };
    148 	/* No warning since the maximum values already match. */
    149 	return name[color];
    150 }
    151 
    152 enum color_with_uc_count {
    153 	CC_RED,
    154 	CC_GREEN,
    155 	CC_BLUE,
    156 	CC_NUM_VALUES
    157 };
    158 
    159 const char *
    160 color_with_uc_count_name(enum color_with_uc_count color)
    161 {
    162 	static const char *const name[] = { "red", "green", "blue" };
    163 	/* No warning since the maximum enum constant is a count. */
    164 	return name[color];
    165 }
    166