/* { 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;
}