| /* { dg-do compile } */ |
| /* { dg-options "-O2" } */ |
| /* { dg-final { scan-assembler-not "cmp" } } */ |
| |
| extern void abort (void); |
| int c; |
| |
| #define PLUSCC1(T, t, C) \ |
| T pluscc##t##C (T a, T b) \ |
| { \ |
| T sum = a + b; \ |
| if (sum < C) \ |
| abort (); \ |
| return sum; \ |
| } |
| #define PLUSCC(T, t) PLUSCC1(T, t, a) PLUSCC1(T, t, b) |
| |
| #define INCCC1(T, t, C) \ |
| T inccc##t##C (T a, T b) \ |
| { \ |
| T sum = a + b; \ |
| if (sum < C) \ |
| c ++; \ |
| return sum; \ |
| } |
| #define INCCC(T, t) INCCC1(T, t, a) INCCC1(T, t, b) |
| |
| #define PLUSCCONLY1(T, t, C) \ |
| void pluscconly##t##C (T a, T b) \ |
| { \ |
| T sum = a + b; \ |
| if (sum < C) \ |
| abort (); \ |
| } |
| #define PLUSCCONLY(T, t) PLUSCCONLY1(T, t, a) PLUSCCONLY1(T, t, b) |
| |
| #define TEST(T, t) \ |
| PLUSCC(T, t) \ |
| PLUSCCONLY(T, t) \ |
| INCCC(T, t) |
| |
| TEST (unsigned long, l) |
| TEST (unsigned int, i) |
| TEST (unsigned short, s) |
| TEST (unsigned char, c) |
| |
| #define PLUSCCZEXT(C) \ |
| unsigned long pluscczext##C (unsigned int a, unsigned int b) \ |
| { \ |
| unsigned int sum = a + b; \ |
| if (sum < C) \ |
| abort (); \ |
| return sum; \ |
| } |
| |
| PLUSCCZEXT(a) |
| PLUSCCZEXT(b) |