Home | History | Annotate | Line # | Download | only in lint1
      1 /*	$NetBSD: msg_155.c,v 1.12 2023/03/28 14:44:35 rillig Exp $	*/
      2 # 3 "msg_155.c"
      3 
      4 // Test for message: passing '%s' to incompatible '%s', arg #%d [155]
      5 
      6 /* lint1-extra-flags: -X 351 */
      7 
      8 
      9 void c99_6_7_6_example_a(int);
     10 void c99_6_7_6_example_b(int *);
     11 void c99_6_7_6_example_c(int *[3]);
     12 void c99_6_7_6_example_d(int (*)[3]);
     13 void c99_6_7_6_example_e(int (*)[*]);
     14 /* Wrong type before decl.c 1.256 from 2022-04-01. */
     15 void c99_6_7_6_example_f(int *());
     16 void c99_6_7_6_example_g(int (*)(void));
     17 void c99_6_7_6_example_h(int (*const[])(unsigned int, ...));
     18 
     19 struct incompatible {
     20 	int member;
     21 };
     22 
     23 void
     24 provoke_error_messages(struct incompatible arg)
     25 {
     26 	/* expect+1: ... 'int', ... */
     27 	c99_6_7_6_example_a(arg);
     28 
     29 	/* expect+1: ... 'pointer to int', ... */
     30 	c99_6_7_6_example_b(arg);
     31 
     32 	/* C99 says 'array[3] of pointer to int', which is close enough. */
     33 	/* expect+1: ... 'pointer to pointer to int', ... */
     34 	c99_6_7_6_example_c(arg);
     35 
     36 	/* expect+1: ... 'pointer to array[3] of int', ... */
     37 	c99_6_7_6_example_d(arg);
     38 
     39 	/* expect+1: ... 'pointer to array[unknown_size] of int', ... */
     40 	c99_6_7_6_example_e(arg);
     41 
     42 	/* Wrong type before decl.c 1.256 from 2022-04-01. */
     43 	/* expect+1: ... 'pointer to function() returning pointer to int', ... */
     44 	c99_6_7_6_example_f(arg);
     45 
     46 	/* expect+1: ... 'pointer to function(void) returning int', ... */
     47 	c99_6_7_6_example_g(arg);
     48 
     49 	/* expect+1: ... 'pointer to const pointer to function(unsigned int, ...) returning int', ... */
     50 	c99_6_7_6_example_h(arg);
     51 }
     52 
     53 extern void sink(struct incompatible);
     54 
     55 /*
     56  * The function type_name has a special case for an enum type that has been
     57  * implicitly converted to an int.  Such a type is still output as the enum
     58  * type.
     59  *
     60  * XXX: The expressions 'day + 0' and '0 + day' should result in the same
     61  *  type.
     62  */
     63 void
     64 type_name_of_enum(void)
     65 {
     66 	enum Day {
     67 		MONDAY
     68 	} day = MONDAY;
     69 
     70 	/* expect+1: ... passing 'enum Day' ... */
     71 	sink(day);
     72 
     73 	/* expect+1: ... passing 'enum Day' ... */
     74 	sink(day + 0);
     75 
     76 	/* expect+1: ... passing 'int' ... */
     77 	sink(0 + day);
     78 
     79 	/* expect+1: ... passing 'int' ... */
     80 	sink(0);
     81 }
     82