Home | History | Annotate | Download | only in Sema
      1 // RUN: %clang_cc1 -fsyntax-only -triple x86_64-unknown-unknown %s -verify
      2 
      3 typedef struct { unsigned long bits[(((1) + (64) - 1) / (64))]; } cpumask_t;
      4 cpumask_t x;
      5 void foo() {
      6   (void)x;
      7 }
      8 void bar() {
      9   char* a;
     10   double b;
     11   b = (double)a; // expected-error {{pointer cannot be cast to type}}
     12   a = (char*)b; // expected-error {{cannot be cast to a pointer type}}
     13 }
     14 
     15 long bar1(long *next) {
     16         return (long)(*next)++;
     17 }
     18 
     19 typedef _Bool Bool;
     20 typedef int Int;
     21 typedef long Long;
     22 typedef float Float;
     23 typedef double Double;
     24 typedef _Complex int CInt;
     25 typedef _Complex long CLong;
     26 typedef _Complex float CFloat;
     27 typedef _Complex double CDouble;
     28 typedef void *VoidPtr;
     29 typedef char *CharPtr;
     30 
     31 void testBool(Bool v) {
     32   (void) (Bool) v;
     33   (void) (Int) v;
     34   (void) (Long) v;
     35   (void) (Float) v;
     36   (void) (Double) v;
     37   (void) (CInt) v;
     38   (void) (CLong) v;
     39   (void) (CFloat) v;
     40   (void) (CDouble) v;
     41   (void) (VoidPtr) v;
     42   (void) (CharPtr) v;
     43 }
     44 
     45 void testInt(Int v) {
     46   (void) (Bool) v;
     47   (void) (Int) v;
     48   (void) (Long) v;
     49   (void) (Float) v;
     50   (void) (Double) v;
     51   (void) (CInt) v;
     52   (void) (CLong) v;
     53   (void) (CFloat) v;
     54   (void) (CDouble) v;
     55   (void) (VoidPtr) v; // expected-warning{{cast to 'VoidPtr' (aka 'void *') from smaller integer type 'Int' (aka 'int')}}
     56   (void) (CharPtr) v; // expected-warning{{cast to 'CharPtr' (aka 'char *') from smaller integer type 'Int' (aka 'int')}}
     57 
     58   // Test that casts to void* can be controlled separately
     59   // from other -Wint-to-pointer-cast warnings.
     60 #pragma clang diagnostic push
     61 #pragma clang diagnostic ignored "-Wint-to-void-pointer-cast"
     62   (void) (VoidPtr) v; // no-warning
     63   (void) (CharPtr) v; // expected-warning{{cast to 'CharPtr' (aka 'char *') from smaller integer type 'Int' (aka 'int')}}
     64 #pragma clang diagnostic pop
     65 }
     66 
     67 void testLong(Long v) {
     68   (void) (Bool) v;
     69   (void) (Int) v;
     70   (void) (Long) v;
     71   (void) (Float) v;
     72   (void) (Double) v;
     73   (void) (CInt) v;
     74   (void) (CLong) v;
     75   (void) (CFloat) v;
     76   (void) (CDouble) v;
     77   (void) (VoidPtr) v;
     78   (void) (CharPtr) v;
     79 }
     80 
     81 void testFloat(Float v) {
     82   (void) (Bool) v;
     83   (void) (Int) v;
     84   (void) (Long) v;
     85   (void) (Float) v;
     86   (void) (Double) v;
     87   (void) (CInt) v;
     88   (void) (CLong) v;
     89   (void) (CFloat) v;
     90   (void) (CDouble) v;
     91 }
     92 
     93 void testDouble(Double v) {
     94   (void) (Bool) v;
     95   (void) (Int) v;
     96   (void) (Long) v;
     97   (void) (Float) v;
     98   (void) (Double) v;
     99   (void) (CInt) v;
    100   (void) (CLong) v;
    101   (void) (CFloat) v;
    102   (void) (CDouble) v;
    103 }
    104 
    105 void testCI(CInt v) {
    106   (void) (Bool) v;
    107   (void) (Int) v;
    108   (void) (Long) v;
    109   (void) (Float) v;
    110   (void) (Double) v;
    111   (void) (CInt) v;
    112   (void) (CLong) v;
    113   (void) (CFloat) v;
    114   (void) (CDouble) v;
    115 }
    116 
    117 void testCLong(CLong v) {
    118   (void) (Bool) v;
    119   (void) (Int) v;
    120   (void) (Long) v;
    121   (void) (Float) v;
    122   (void) (Double) v;
    123   (void) (CInt) v;
    124   (void) (CLong) v;
    125   (void) (CFloat) v;
    126   (void) (CDouble) v;
    127 }
    128 
    129 void testCFloat(CFloat v) {
    130   (void) (Bool) v;
    131   (void) (Int) v;
    132   (void) (Long) v;
    133   (void) (Float) v;
    134   (void) (Double) v;
    135   (void) (CInt) v;
    136   (void) (CLong) v;
    137   (void) (CFloat) v;
    138   (void) (CDouble) v;
    139 }
    140 
    141 void testCDouble(CDouble v) {
    142   (void) (Bool) v;
    143   (void) (Int) v;
    144   (void) (Long) v;
    145   (void) (Float) v;
    146   (void) (Double) v;
    147   (void) (CInt) v;
    148   (void) (CLong) v;
    149   (void) (CFloat) v;
    150   (void) (CDouble) v;
    151 }
    152 
    153 void testVoidPtr(VoidPtr v) {
    154   (void) (Bool) v;
    155   (void) (Int) v;
    156   (void) (Long) v;
    157   (void) (VoidPtr) v;
    158   (void) (CharPtr) v;
    159 }
    160 
    161 void testCharPtr(CharPtr v) {
    162   (void) (Bool) v;
    163   (void) (Int) v;
    164   (void) (Long) v;
    165   (void) (VoidPtr) v;
    166   (void) (CharPtr) v;
    167 }
    168 
    169 typedef enum { x_a, x_b } X;
    170 void *intToPointerCast2(X x) {
    171   return (void*)x;
    172 }
    173 
    174 void *intToPointerCast3() {
    175   return (void*)(1 + 3);
    176 }
    177