1 /* { dg-do compile } */
2 /* { dg-options "-O2" } */
3 /* { dg-final { scan-assembler-not "cmp" } } */
4 
5 extern void abort (void);
6 int c;
7 
8 #define PLUSCC1(T, t, C)	\
9 T pluscc##t##C (T a, T b)	\
10 {	\
11   T sum = a + b;	\
12   if (sum < C)		\
13     abort ();		\
14   return sum;		\
15 }
16 #define PLUSCC(T, t) PLUSCC1(T, t, a) PLUSCC1(T, t, b)
17 
18 #define INCCC1(T, t, C)	\
19 T inccc##t##C (T a, T b)	\
20 {	\
21   T sum = a + b;	\
22   if (sum < C)		\
23     c ++;		\
24   return sum;		\
25 }
26 #define INCCC(T, t) INCCC1(T, t, a) INCCC1(T, t, b)
27 
28 #define PLUSCCONLY1(T, t, C)	\
29 void pluscconly##t##C (T a, T b)	\
30 {	\
31   T sum = a + b;	\
32   if (sum < C)		\
33     abort ();		\
34 }
35 #define PLUSCCONLY(T, t) PLUSCCONLY1(T, t, a) PLUSCCONLY1(T, t, b)
36 
37 #define TEST(T, t)	\
38   PLUSCC(T, t)		\
39   PLUSCCONLY(T, t)	\
40   INCCC(T, t)
41 
42 TEST (unsigned long,  l)
43 TEST (unsigned int,   i)
44 TEST (unsigned short, s)
45 TEST (unsigned char,  c)
46 
47 #define PLUSCCZEXT(C)	\
48 unsigned long pluscczext##C (unsigned int a, unsigned int b)	\
49 {	\
50   unsigned int sum = a + b;	\
51   if (sum < C)		\
52     abort ();		\
53   return sum;		\
54 }
55 
56 PLUSCCZEXT(a)
57 PLUSCCZEXT(b)
58