// RUN: %clang_cc1 -fsyntax-only -triple x86_64-unknown-unknown %s -verify

typedef struct { unsigned long bits[(((1) + (64) - 1) / (64))]; } cpumask_t;
cpumask_t x;
void foo() {
  (void)x;
}
void bar() {
  char* a;
  double b;
  b = (double)a; // expected-error {{pointer cannot be cast to type}}
  a = (char*)b; // expected-error {{cannot be cast to a pointer type}}
}

long bar1(long *next) {
        return (long)(*next)++;  
}

typedef _Bool Bool;
typedef int Int;
typedef long Long;
typedef float Float;
typedef double Double;
typedef _Complex int CInt;
typedef _Complex long CLong;
typedef _Complex float CFloat;
typedef _Complex double CDouble;
typedef void *VoidPtr;
typedef char *CharPtr;

void testBool(Bool v) {
  (void) (Bool) v;
  (void) (Int) v;
  (void) (Long) v;
  (void) (Float) v;
  (void) (Double) v;
  (void) (CInt) v;
  (void) (CLong) v;
  (void) (CFloat) v;
  (void) (CDouble) v;
  (void) (VoidPtr) v;
  (void) (CharPtr) v;
}

void testInt(Int v) {
  (void) (Bool) v;
  (void) (Int) v;
  (void) (Long) v;
  (void) (Float) v;
  (void) (Double) v;
  (void) (CInt) v;
  (void) (CLong) v;
  (void) (CFloat) v;
  (void) (CDouble) v;
  (void) (VoidPtr) v; // expected-warning{{cast to 'VoidPtr' (aka 'void *') from smaller integer type 'Int' (aka 'int')}}
  (void) (CharPtr) v; // expected-warning{{cast to 'CharPtr' (aka 'char *') from smaller integer type 'Int' (aka 'int')}}
  
  // Test that casts to void* can be controlled separately
  // from other -Wint-to-pointer-cast warnings.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast"
  (void) (VoidPtr) v; // no-warning
  (void) (CharPtr) v; // expected-warning{{cast to 'CharPtr' (aka 'char *') from smaller integer type 'Int' (aka 'int')}}
#pragma clang diagnostic pop
}

void testLong(Long v) {
  (void) (Bool) v;
  (void) (Int) v;
  (void) (Long) v;
  (void) (Float) v;
  (void) (Double) v;
  (void) (CInt) v;
  (void) (CLong) v;
  (void) (CFloat) v;
  (void) (CDouble) v;
  (void) (VoidPtr) v;
  (void) (CharPtr) v;
}

void testFloat(Float v) {
  (void) (Bool) v;
  (void) (Int) v;
  (void) (Long) v;
  (void) (Float) v;
  (void) (Double) v;
  (void) (CInt) v;
  (void) (CLong) v;
  (void) (CFloat) v;
  (void) (CDouble) v;
}

void testDouble(Double v) {
  (void) (Bool) v;
  (void) (Int) v;
  (void) (Long) v;
  (void) (Float) v;
  (void) (Double) v;
  (void) (CInt) v;
  (void) (CLong) v;
  (void) (CFloat) v;
  (void) (CDouble) v;
}

void testCI(CInt v) {
  (void) (Bool) v;
  (void) (Int) v;
  (void) (Long) v;
  (void) (Float) v;
  (void) (Double) v;
  (void) (CInt) v;
  (void) (CLong) v;
  (void) (CFloat) v;
  (void) (CDouble) v;
}

void testCLong(CLong v) {
  (void) (Bool) v;
  (void) (Int) v;
  (void) (Long) v;
  (void) (Float) v;
  (void) (Double) v;
  (void) (CInt) v;
  (void) (CLong) v;
  (void) (CFloat) v;
  (void) (CDouble) v;
}

void testCFloat(CFloat v) {
  (void) (Bool) v;
  (void) (Int) v;
  (void) (Long) v;
  (void) (Float) v;
  (void) (Double) v;
  (void) (CInt) v;
  (void) (CLong) v;
  (void) (CFloat) v;
  (void) (CDouble) v;
}

void testCDouble(CDouble v) {
  (void) (Bool) v;
  (void) (Int) v;
  (void) (Long) v;
  (void) (Float) v;
  (void) (Double) v;
  (void) (CInt) v;
  (void) (CLong) v;
  (void) (CFloat) v;
  (void) (CDouble) v;
}

void testVoidPtr(VoidPtr v) {
  (void) (Bool) v;
  (void) (Int) v;
  (void) (Long) v;
  (void) (VoidPtr) v;
  (void) (CharPtr) v;
}

void testCharPtr(CharPtr v) {
  (void) (Bool) v;
  (void) (Int) v;
  (void) (Long) v;
  (void) (VoidPtr) v;
  (void) (CharPtr) v;
}

typedef enum { x_a, x_b } X;
void *intToPointerCast2(X x) {
  return (void*)x;
}

void *intToPointerCast3() {
  return (void*)(1 + 3);
}
