xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_116.c (revision e6298b924c5ba98f3a22919b56dab04a87cdbb1c)
1*e6298b92Srillig /*	$NetBSD: msg_116.c,v 1.6 2023/07/07 19:45:22 rillig Exp $	*/
2a0a15c14Srillig # 3 "msg_116.c"
3a0a15c14Srillig 
4a0a15c14Srillig // Test for message: illegal pointer subtraction [116]
5a0a15c14Srillig 
6*e6298b92Srillig /* lint1-extra-flags: -X 351 */
7*e6298b92Srillig 
86bb8504fSrillig /*
96bb8504fSrillig  * Subtracting an int pointer from a double pointer does not make sense.
106bb8504fSrillig  * The result cannot be reasonably defined since it is "the difference of
116bb8504fSrillig  * the subscripts of the two array elements" (C99 6.5.5p9), and these two
126bb8504fSrillig  * pointers cannot point to the same array.
136bb8504fSrillig  */
146bb8504fSrillig _Bool
example(int * a,double * b)15af03d2a0Srillig example(int *a, double *b)
16af03d2a0Srillig {
1765e5c21bSrillig 	/* expect+1: error: illegal pointer subtraction [116] */
1865e5c21bSrillig 	return a - b > 0;
196bb8504fSrillig }
206bb8504fSrillig 
216bb8504fSrillig /*
226bb8504fSrillig  * Even though signed char and unsigned char have the same size,
236bb8504fSrillig  * their pointer types are still considered incompatible.
246bb8504fSrillig  *
256bb8504fSrillig  * C99 6.5.5p9
266bb8504fSrillig  */
276bb8504fSrillig _Bool
subtract_character_pointers(signed char * scp,unsigned char * ucp)286bb8504fSrillig subtract_character_pointers(signed char *scp, unsigned char *ucp)
296bb8504fSrillig {
3065e5c21bSrillig 	/* expect+1: error: illegal pointer subtraction [116] */
3165e5c21bSrillig 	return scp - ucp > 0;
326bb8504fSrillig }
336bb8504fSrillig 
346bb8504fSrillig _Bool
subtract_const_pointer(const char * ccp,char * cp)356bb8504fSrillig subtract_const_pointer(const char *ccp, char *cp)
366bb8504fSrillig {
376bb8504fSrillig 	return ccp - cp > 0;
38af03d2a0Srillig }
39