| /* { dg-do compile } */ |
| /* { dg-options "-Wcompare-distinct-pointer-types" } */ |
| |
| typedef __INT32_TYPE__ __u32; |
| |
| struct xdp_md |
| { |
| char *data; |
| char *data_meta; |
| }; |
| |
| int xdp_context (struct xdp_md *xdp) |
| { |
| void *data = (void *)(__INTPTR_TYPE__)xdp->data; |
| __u32 *metadata = (void *)(__INTPTR_TYPE__)xdp->data_meta; |
| __u32 ret; |
| |
| if (metadata + 1 > data) /* { dg-warning "comparison of distinct pointer types" } */ |
| return 1; |
| if (metadata + 1 >= data) /* { dg-warning "comparison of distinct pointer types" } */ |
| return 2; |
| if (metadata + 1 < data) /* { dg-warning "comparison of distinct pointer types" } */ |
| return 3; |
| if (metadata + 1 <= data) /* { dg-warning "comparison of distinct pointer types" } */ |
| return 4; |
| /* Note that it is ok to check for equality or inequality betewen void |
| pointers and any other non-function pointers. */ |
| if ((int*) (metadata + 1) == (long*) data) /* { dg-warning "comparison of distinct pointer types" } */ |
| return 5; |
| if ((int*) metadata + 1 != (long*) data) /* { dg-warning "comparison of distinct pointer types" } */ |
| return 5; |
| |
| return 1; |
| } |