| // 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; // expected-warning{{cast to smaller integer type 'Int' (aka 'int') from 'VoidPtr' (aka 'void *')}} |
| (void) (Long) v; |
| (void) (VoidPtr) v; |
| (void) (CharPtr) v; |
| // Test that casts to void* can be controlled separately |
| // from other -Wpointer-to-int-cast warnings. |
| #pragma clang diagnostic push |
| #pragma clang diagnostic ignored "-Wvoid-pointer-to-int-cast" |
| (void)(Int) v; // no-warning |
| #pragma clang diagnostic pop |
| } |
| |
| void testCharPtr(CharPtr v) { |
| (void)(Bool) v; |
| (void) (Int) v; // expected-warning{{cast to smaller integer type 'Int' (aka 'int') from 'CharPtr' (aka 'char *')}} |
| (void) (Long) v; |
| (void) (VoidPtr) v; |
| (void) (CharPtr) v; |
| // Test that casts to void* can be controlled separately |
| // from other -Wpointer-to-int-cast warnings. |
| #pragma clang diagnostic push |
| #pragma clang diagnostic ignored "-Wvoid-pointer-to-int-cast" |
| (void)(Int) v; // expected-warning{{cast to smaller integer type 'Int' (aka 'int') from 'CharPtr' (aka 'char *')}} |
| #pragma clang diagnostic pop |
| } |
| |
| typedef enum { x_a, x_b } X; |
| void *intToPointerCast2(X x) { |
| return (void*)x; |
| } |
| |
| void *intToPointerCast3() { |
| return (void*)(1 + 3); |
| } |
| |
| void voidPointerToEnumCast(VoidPtr v) { |
| (void)(X) v; // expected-warning{{cast to smaller integer type 'X' from 'VoidPtr' (aka 'void *')}} |
| // Test that casts to void* can be controlled separately |
| // from other -Wpointer-to-enum-cast warnings. |
| #pragma clang diagnostic push |
| #pragma clang diagnostic ignored "-Wvoid-pointer-to-enum-cast" |
| (void)(X) v; // no-warning |
| #pragma clang diagnostic pop |
| } |
| |
| void pointerToEnumCast(CharPtr v) { |
| (void)(X) v; // expected-warning{{cast to smaller integer type 'X' from 'CharPtr' (aka 'char *')}} |
| // Test that casts to void* can be controlled separately |
| // from other -Wpointer-to-enum-cast warnings. |
| #pragma clang diagnostic push |
| #pragma clang diagnostic ignored "-Wvoid-pointer-to-enum-cast" |
| (void)(X) v; // expected-warning{{cast to smaller integer type 'X' from 'CharPtr' (aka 'char *')}} |
| #pragma clang diagnostic pop |
| } |