Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 
      3 // This test checks for the various conversions and casting operations
      4 // with address-space-qualified pointers.
      5 
      6 struct A { virtual ~A() {} };
      7 struct B : A { };
      8 
      9 typedef void *void_ptr;
     10 typedef void __attribute__((address_space(1))) *void_ptr_1;
     11 typedef void __attribute__((address_space(2))) *void_ptr_2;
     12 
     13 typedef int *int_ptr;
     14 typedef int __attribute__((address_space(1))) *int_ptr_1;
     15 typedef int __attribute__((address_space(2))) *int_ptr_2;
     16 
     17 typedef A *A_ptr;
     18 typedef A __attribute__((address_space(1))) *A_ptr_1;
     19 typedef A __attribute__((address_space(2))) *A_ptr_2;
     20 
     21 typedef B *B_ptr;
     22 typedef B __attribute__((address_space(1))) *B_ptr_1;
     23 typedef B __attribute__((address_space(2))) *B_ptr_2;
     24 
     25 void test_const_cast(int_ptr ip, int_ptr_1 ip1, int_ptr_2 ip2,
     26                      A_ptr ap, A_ptr_1 ap1, A_ptr_2 ap2,
     27                      const int *cip,
     28                      const int __attribute__((address_space(1))) *cip1) {
     29   // Cannot use const_cast to cast between address spaces, add an
     30   // address space, or remove an address space.
     31   (void)const_cast<int_ptr>(ip1); // expected-error{{is not allowed}}
     32   (void)const_cast<int_ptr>(ip2); // expected-error{{is not allowed}}
     33   (void)const_cast<int_ptr_1>(ip); // expected-error{{is not allowed}}
     34   (void)const_cast<int_ptr_1>(ip2); // expected-error{{is not allowed}}
     35   (void)const_cast<int_ptr_2>(ip); // expected-error{{is not allowed}}
     36   (void)const_cast<int_ptr_2>(ip1); // expected-error{{is not allowed}}
     37 
     38   (void)const_cast<A_ptr>(ap1); // expected-error{{is not allowed}}
     39   (void)const_cast<A_ptr>(ap2); // expected-error{{is not allowed}}
     40   (void)const_cast<A_ptr_1>(ap); // expected-error{{is not allowed}}
     41   (void)const_cast<A_ptr_1>(ap2); // expected-error{{is not allowed}}
     42   (void)const_cast<A_ptr_2>(ap); // expected-error{{is not allowed}}
     43   (void)const_cast<A_ptr_2>(ap1); // expected-error{{is not allowed}}
     44 
     45   // It's acceptable to cast away constness.
     46   (void)const_cast<int_ptr>(cip);
     47   (void)const_cast<int_ptr_1>(cip1);
     48 }
     49 
     50 void test_static_cast(void_ptr vp, void_ptr_1 vp1, void_ptr_2 vp2,
     51                       A_ptr ap, A_ptr_1 ap1, A_ptr_2 ap2,
     52                       B_ptr bp, B_ptr_1 bp1, B_ptr_2 bp2) {
     53   // Well-formed upcast
     54   (void)static_cast<A_ptr>(bp);
     55   (void)static_cast<A_ptr_1>(bp1);
     56   (void)static_cast<A_ptr_2>(bp2);
     57 
     58   // Well-formed downcast
     59   (void)static_cast<B_ptr>(ap);
     60   (void)static_cast<B_ptr_1>(ap1);
     61   (void)static_cast<B_ptr_2>(ap2);
     62 
     63   // Well-formed cast to/from void
     64   (void)static_cast<void_ptr>(ap);
     65   (void)static_cast<void_ptr_1>(ap1);
     66   (void)static_cast<void_ptr_2>(ap2);
     67   (void)static_cast<A_ptr>(vp);
     68   (void)static_cast<A_ptr_1>(vp1);
     69   (void)static_cast<A_ptr_2>(vp2);
     70 
     71   // Ill-formed upcasts
     72   (void)static_cast<A_ptr>(bp1); // expected-error{{is not allowed}}
     73   (void)static_cast<A_ptr>(bp2); // expected-error{{is not allowed}}
     74   (void)static_cast<A_ptr_1>(bp); // expected-error{{is not allowed}}
     75   (void)static_cast<A_ptr_1>(bp2); // expected-error{{is not allowed}}
     76   (void)static_cast<A_ptr_2>(bp); // expected-error{{is not allowed}}
     77   (void)static_cast<A_ptr_2>(bp1); // expected-error{{is not allowed}}
     78 
     79   // Ill-formed downcasts
     80   (void)static_cast<B_ptr>(ap1); // expected-error{{casts away qualifiers}}
     81   (void)static_cast<B_ptr>(ap2); // expected-error{{casts away qualifiers}}
     82   (void)static_cast<B_ptr_1>(ap); // expected-error{{casts away qualifiers}}
     83   (void)static_cast<B_ptr_1>(ap2); // expected-error{{casts away qualifiers}}
     84   (void)static_cast<B_ptr_2>(ap); // expected-error{{casts away qualifiers}}
     85   (void)static_cast<B_ptr_2>(ap1); // expected-error{{casts away qualifiers}}
     86 
     87   // Ill-formed cast to/from void
     88   (void)static_cast<void_ptr>(ap1); // expected-error{{is not allowed}}
     89   (void)static_cast<void_ptr>(ap2); // expected-error{{is not allowed}}
     90   (void)static_cast<void_ptr_1>(ap); // expected-error{{is not allowed}}
     91   (void)static_cast<void_ptr_1>(ap2); // expected-error{{is not allowed}}
     92   (void)static_cast<void_ptr_2>(ap); // expected-error{{is not allowed}}
     93   (void)static_cast<void_ptr_2>(ap1); // expected-error{{is not allowed}}
     94   (void)static_cast<A_ptr>(vp1); // expected-error{{casts away qualifiers}}
     95   (void)static_cast<A_ptr>(vp2); // expected-error{{casts away qualifiers}}
     96   (void)static_cast<A_ptr_1>(vp); // expected-error{{casts away qualifiers}}
     97   (void)static_cast<A_ptr_1>(vp2); // expected-error{{casts away qualifiers}}
     98   (void)static_cast<A_ptr_2>(vp); // expected-error{{casts away qualifiers}}
     99   (void)static_cast<A_ptr_2>(vp1); // expected-error{{casts away qualifiers}}
    100 }
    101 
    102 void test_dynamic_cast(A_ptr ap, A_ptr_1 ap1, A_ptr_2 ap2,
    103                        B_ptr bp, B_ptr_1 bp1, B_ptr_2 bp2) {
    104   // Well-formed upcast
    105   (void)dynamic_cast<A_ptr>(bp);
    106   (void)dynamic_cast<A_ptr_1>(bp1);
    107   (void)dynamic_cast<A_ptr_2>(bp2);
    108 
    109   // Well-formed downcast
    110   (void)dynamic_cast<B_ptr>(ap);
    111   (void)dynamic_cast<B_ptr_1>(ap1);
    112   (void)dynamic_cast<B_ptr_2>(ap2);
    113 
    114   // Ill-formed upcasts
    115   (void)dynamic_cast<A_ptr>(bp1); // expected-error{{casts away qualifiers}}
    116   (void)dynamic_cast<A_ptr>(bp2); // expected-error{{casts away qualifiers}}
    117   (void)dynamic_cast<A_ptr_1>(bp); // expected-error{{casts away qualifiers}}
    118   (void)dynamic_cast<A_ptr_1>(bp2); // expected-error{{casts away qualifiers}}
    119   (void)dynamic_cast<A_ptr_2>(bp); // expected-error{{casts away qualifiers}}
    120   (void)dynamic_cast<A_ptr_2>(bp1); // expected-error{{casts away qualifiers}}
    121 
    122   // Ill-formed downcasts
    123   (void)dynamic_cast<B_ptr>(ap1); // expected-error{{casts away qualifiers}}
    124   (void)dynamic_cast<B_ptr>(ap2); // expected-error{{casts away qualifiers}}
    125   (void)dynamic_cast<B_ptr_1>(ap); // expected-error{{casts away qualifiers}}
    126   (void)dynamic_cast<B_ptr_1>(ap2); // expected-error{{casts away qualifiers}}
    127   (void)dynamic_cast<B_ptr_2>(ap); // expected-error{{casts away qualifiers}}
    128   (void)dynamic_cast<B_ptr_2>(ap1); // expected-error{{casts away qualifiers}}
    129 }
    130 
    131 void test_reinterpret_cast(void_ptr vp, void_ptr_1 vp1, void_ptr_2 vp2,
    132                            A_ptr ap, A_ptr_1 ap1, A_ptr_2 ap2,
    133                            B_ptr bp, B_ptr_1 bp1, B_ptr_2 bp2,
    134                            const void __attribute__((address_space(1))) *cvp1) {
    135   // reinterpret_cast can be used to cast to a different address space.
    136   (void)reinterpret_cast<A_ptr>(ap1);
    137   (void)reinterpret_cast<A_ptr>(ap2);
    138   (void)reinterpret_cast<A_ptr>(bp);
    139   (void)reinterpret_cast<A_ptr>(bp1);
    140   (void)reinterpret_cast<A_ptr>(bp2);
    141   (void)reinterpret_cast<A_ptr>(vp);
    142   (void)reinterpret_cast<A_ptr>(vp1);
    143   (void)reinterpret_cast<A_ptr>(vp2);
    144   (void)reinterpret_cast<A_ptr_1>(ap);
    145   (void)reinterpret_cast<A_ptr_1>(ap2);
    146   (void)reinterpret_cast<A_ptr_1>(bp);
    147   (void)reinterpret_cast<A_ptr_1>(bp1);
    148   (void)reinterpret_cast<A_ptr_1>(bp2);
    149   (void)reinterpret_cast<A_ptr_1>(vp);
    150   (void)reinterpret_cast<A_ptr_1>(vp1);
    151   (void)reinterpret_cast<A_ptr_1>(vp2);
    152 
    153   // ... but don't try to cast away constness!
    154   (void)reinterpret_cast<A_ptr_2>(cvp1); // expected-error{{casts away qualifiers}}
    155 }
    156 
    157 void test_cstyle_cast(void_ptr vp, void_ptr_1 vp1, void_ptr_2 vp2,
    158                       A_ptr ap, A_ptr_1 ap1, A_ptr_2 ap2,
    159                       B_ptr bp, B_ptr_1 bp1, B_ptr_2 bp2,
    160                       const void __attribute__((address_space(1))) *cvp1) {
    161   // C-style casts are the wild west of casts.
    162   (void)(A_ptr)(ap1);
    163   (void)(A_ptr)(ap2);
    164   (void)(A_ptr)(bp);
    165   (void)(A_ptr)(bp1);
    166   (void)(A_ptr)(bp2);
    167   (void)(A_ptr)(vp);
    168   (void)(A_ptr)(vp1);
    169   (void)(A_ptr)(vp2);
    170   (void)(A_ptr_1)(ap);
    171   (void)(A_ptr_1)(ap2);
    172   (void)(A_ptr_1)(bp);
    173   (void)(A_ptr_1)(bp1);
    174   (void)(A_ptr_1)(bp2);
    175   (void)(A_ptr_1)(vp);
    176   (void)(A_ptr_1)(vp1);
    177   (void)(A_ptr_1)(vp2);
    178   (void)(A_ptr_2)(cvp1);
    179 }
    180 
    181 void test_implicit_conversion(void_ptr vp, void_ptr_1 vp1, void_ptr_2 vp2,
    182                               A_ptr ap, A_ptr_1 ap1, A_ptr_2 ap2,
    183                               B_ptr bp, B_ptr_1 bp1, B_ptr_2 bp2) {
    184   // Well-formed conversions
    185   void_ptr vpA = ap;
    186   void_ptr_1 vp_1A = ap1;
    187   void_ptr_2 vp_2A = ap2;
    188   A_ptr ap_A = bp;
    189   A_ptr_1 ap_A1 = bp1;
    190   A_ptr_2 ap_A2 = bp2;
    191 
    192   // Ill-formed conversions
    193   void_ptr vpB = ap1; // expected-error{{cannot initialize a variable of type}}
    194   void_ptr_1 vp_1B = ap2; // expected-error{{cannot initialize a variable of type}}
    195   A_ptr ap_B = bp1; // expected-error{{cannot initialize a variable of type}}
    196   A_ptr_1 ap_B1 = bp2; // expected-error{{cannot initialize a variable of type}}
    197 }
    198