1 //===----------------------------------------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // type_traits 11 12 // is_convertible 13 14 #include <type_traits> 15 16 typedef void Function(); 17 typedef char Array[1]; 18 19 class NonCopyable { 20 NonCopyable(NonCopyable&); 21 }; 22 23 int main() 24 { 25 { 26 static_assert(( std::is_convertible<void, void>::value), ""); 27 static_assert(( std::is_convertible<const void, void>::value), ""); 28 static_assert(( std::is_convertible<void, const void>::value), ""); 29 static_assert(( std::is_convertible<const void, const void>::value), ""); 30 31 static_assert((!std::is_convertible<void, Function>::value), ""); 32 static_assert((!std::is_convertible<const void, Function>::value), ""); 33 34 static_assert((!std::is_convertible<void, Function&>::value), ""); 35 static_assert((!std::is_convertible<const void, Function&>::value), ""); 36 37 static_assert((!std::is_convertible<void, Function*>::value), ""); 38 static_assert((!std::is_convertible<void, Function* const>::value), ""); 39 static_assert((!std::is_convertible<const void, Function*>::value), ""); 40 static_assert((!std::is_convertible<const void, Function*const >::value), ""); 41 42 static_assert((!std::is_convertible<void, Array>::value), ""); 43 static_assert((!std::is_convertible<void, const Array>::value), ""); 44 static_assert((!std::is_convertible<const void, Array>::value), ""); 45 static_assert((!std::is_convertible<const void, const Array>::value), ""); 46 47 static_assert((!std::is_convertible<void, Array&>::value), ""); 48 static_assert((!std::is_convertible<void, const Array&>::value), ""); 49 static_assert((!std::is_convertible<const void, Array&>::value), ""); 50 static_assert((!std::is_convertible<const void, const Array&>::value), ""); 51 52 static_assert((!std::is_convertible<void, char>::value), ""); 53 static_assert((!std::is_convertible<void, const char>::value), ""); 54 static_assert((!std::is_convertible<const void, char>::value), ""); 55 static_assert((!std::is_convertible<const void, const char>::value), ""); 56 57 static_assert((!std::is_convertible<void, char&>::value), ""); 58 static_assert((!std::is_convertible<void, const char&>::value), ""); 59 static_assert((!std::is_convertible<const void, char&>::value), ""); 60 static_assert((!std::is_convertible<const void, const char&>::value), ""); 61 62 static_assert((!std::is_convertible<void, char*>::value), ""); 63 static_assert((!std::is_convertible<void, const char*>::value), ""); 64 static_assert((!std::is_convertible<const void, char*>::value), ""); 65 static_assert((!std::is_convertible<const void, const char*>::value), ""); 66 } 67 { 68 static_assert((!std::is_convertible<Function, void>::value), ""); 69 static_assert((!std::is_convertible<Function, const void>::value), ""); 70 71 static_assert((!std::is_convertible<Function, Function>::value), ""); 72 73 static_assert(( std::is_convertible<Function, Function&>::value), ""); 74 75 static_assert(( std::is_convertible<Function, Function*>::value), ""); 76 static_assert(( std::is_convertible<Function, Function* const>::value), ""); 77 78 static_assert((!std::is_convertible<Function, Array>::value), ""); 79 static_assert((!std::is_convertible<Function, const Array>::value), ""); 80 81 static_assert((!std::is_convertible<Function, Array&>::value), ""); 82 static_assert((!std::is_convertible<Function, const Array&>::value), ""); 83 84 static_assert((!std::is_convertible<Function, char>::value), ""); 85 static_assert((!std::is_convertible<Function, const char>::value), ""); 86 87 static_assert((!std::is_convertible<Function, char&>::value), ""); 88 static_assert((!std::is_convertible<Function, const char&>::value), ""); 89 90 static_assert((!std::is_convertible<Function, char*>::value), ""); 91 static_assert((!std::is_convertible<Function, const char*>::value), ""); 92 } 93 { 94 static_assert((!std::is_convertible<Function&, void>::value), ""); 95 static_assert((!std::is_convertible<Function&, const void>::value), ""); 96 97 static_assert((!std::is_convertible<Function&, Function>::value), ""); 98 99 static_assert(( std::is_convertible<Function&, Function&>::value), ""); 100 101 static_assert(( std::is_convertible<Function&, Function*>::value), ""); 102 static_assert(( std::is_convertible<Function&, Function* const>::value), ""); 103 104 static_assert((!std::is_convertible<Function&, Array>::value), ""); 105 static_assert((!std::is_convertible<Function&, const Array>::value), ""); 106 107 static_assert((!std::is_convertible<Function&, Array&>::value), ""); 108 static_assert((!std::is_convertible<Function&, const Array&>::value), ""); 109 110 static_assert((!std::is_convertible<Function&, char>::value), ""); 111 static_assert((!std::is_convertible<Function&, const char>::value), ""); 112 113 static_assert((!std::is_convertible<Function&, char&>::value), ""); 114 static_assert((!std::is_convertible<Function&, const char&>::value), ""); 115 116 static_assert((!std::is_convertible<Function&, char*>::value), ""); 117 static_assert((!std::is_convertible<Function&, const char*>::value), ""); 118 } 119 { 120 static_assert((!std::is_convertible<Function*, void>::value), ""); 121 static_assert((!std::is_convertible<Function*const, void>::value), ""); 122 static_assert((!std::is_convertible<Function*, const void>::value), ""); 123 static_assert((!std::is_convertible<Function*const, const void>::value), ""); 124 125 static_assert((!std::is_convertible<Function*, Function>::value), ""); 126 static_assert((!std::is_convertible<Function*const, Function>::value), ""); 127 128 static_assert((!std::is_convertible<Function*, Function&>::value), ""); 129 static_assert((!std::is_convertible<Function*const, Function&>::value), ""); 130 131 static_assert(( std::is_convertible<Function*, Function*>::value), ""); 132 static_assert(( std::is_convertible<Function*, Function* const>::value), ""); 133 static_assert(( std::is_convertible<Function*const, Function*>::value), ""); 134 static_assert(( std::is_convertible<Function*const, Function*const >::value), ""); 135 136 static_assert((!std::is_convertible<Function*, Array>::value), ""); 137 static_assert((!std::is_convertible<Function*, const Array>::value), ""); 138 static_assert((!std::is_convertible<Function*const, Array>::value), ""); 139 static_assert((!std::is_convertible<Function*const, const Array>::value), ""); 140 141 static_assert((!std::is_convertible<Function*, Array&>::value), ""); 142 static_assert((!std::is_convertible<Function*, const Array&>::value), ""); 143 static_assert((!std::is_convertible<Function*const, Array&>::value), ""); 144 static_assert((!std::is_convertible<Function*const, const Array&>::value), ""); 145 146 static_assert((!std::is_convertible<Function*, char>::value), ""); 147 static_assert((!std::is_convertible<Function*, const char>::value), ""); 148 static_assert((!std::is_convertible<Function*const, char>::value), ""); 149 static_assert((!std::is_convertible<Function*const, const char>::value), ""); 150 151 static_assert((!std::is_convertible<Function*, char&>::value), ""); 152 static_assert((!std::is_convertible<Function*, const char&>::value), ""); 153 static_assert((!std::is_convertible<Function*const, char&>::value), ""); 154 static_assert((!std::is_convertible<Function*const, const char&>::value), ""); 155 156 static_assert((!std::is_convertible<Function*, char*>::value), ""); 157 static_assert((!std::is_convertible<Function*, const char*>::value), ""); 158 static_assert((!std::is_convertible<Function*const, char*>::value), ""); 159 static_assert((!std::is_convertible<Function*const, const char*>::value), ""); 160 } 161 { 162 static_assert((!std::is_convertible<Array, void>::value), ""); 163 static_assert((!std::is_convertible<const Array, void>::value), ""); 164 static_assert((!std::is_convertible<Array, const void>::value), ""); 165 static_assert((!std::is_convertible<const Array, const void>::value), ""); 166 167 static_assert((!std::is_convertible<Array, Function>::value), ""); 168 static_assert((!std::is_convertible<const Array, Function>::value), ""); 169 170 static_assert((!std::is_convertible<Array, Function&>::value), ""); 171 static_assert((!std::is_convertible<const Array, Function&>::value), ""); 172 173 static_assert((!std::is_convertible<Array, Function*>::value), ""); 174 static_assert((!std::is_convertible<Array, Function* const>::value), ""); 175 static_assert((!std::is_convertible<const Array, Function*>::value), ""); 176 static_assert((!std::is_convertible<const Array, Function*const >::value), ""); 177 178 static_assert((!std::is_convertible<Array, Array>::value), ""); 179 static_assert((!std::is_convertible<Array, const Array>::value), ""); 180 static_assert((!std::is_convertible<const Array, Array>::value), ""); 181 static_assert((!std::is_convertible<const Array, const Array>::value), ""); 182 183 static_assert((!std::is_convertible<Array, Array&>::value), ""); 184 static_assert(( std::is_convertible<Array, const Array&>::value), ""); 185 static_assert((!std::is_convertible<const Array, Array&>::value), ""); 186 static_assert(( std::is_convertible<const Array, const Array&>::value), ""); 187 188 static_assert((!std::is_convertible<Array, char>::value), ""); 189 static_assert((!std::is_convertible<Array, const char>::value), ""); 190 static_assert((!std::is_convertible<const Array, char>::value), ""); 191 static_assert((!std::is_convertible<const Array, const char>::value), ""); 192 193 static_assert((!std::is_convertible<Array, char&>::value), ""); 194 static_assert((!std::is_convertible<Array, const char&>::value), ""); 195 static_assert((!std::is_convertible<const Array, char&>::value), ""); 196 static_assert((!std::is_convertible<const Array, const char&>::value), ""); 197 198 static_assert(( std::is_convertible<Array, char*>::value), ""); 199 static_assert(( std::is_convertible<Array, const char*>::value), ""); 200 static_assert((!std::is_convertible<const Array, char*>::value), ""); 201 static_assert(( std::is_convertible<const Array, const char*>::value), ""); 202 } 203 { 204 static_assert((!std::is_convertible<Array&, void>::value), ""); 205 static_assert((!std::is_convertible<const Array&, void>::value), ""); 206 static_assert((!std::is_convertible<Array&, const void>::value), ""); 207 static_assert((!std::is_convertible<const Array&, const void>::value), ""); 208 209 static_assert((!std::is_convertible<Array&, Function>::value), ""); 210 static_assert((!std::is_convertible<const Array&, Function>::value), ""); 211 212 static_assert((!std::is_convertible<Array&, Function&>::value), ""); 213 static_assert((!std::is_convertible<const Array&, Function&>::value), ""); 214 215 static_assert((!std::is_convertible<Array&, Function*>::value), ""); 216 static_assert((!std::is_convertible<Array&, Function* const>::value), ""); 217 static_assert((!std::is_convertible<const Array&, Function*>::value), ""); 218 static_assert((!std::is_convertible<const Array&, Function*const >::value), ""); 219 220 static_assert((!std::is_convertible<Array&, Array>::value), ""); 221 static_assert((!std::is_convertible<Array&, const Array>::value), ""); 222 static_assert((!std::is_convertible<const Array&, Array>::value), ""); 223 static_assert((!std::is_convertible<const Array&, const Array>::value), ""); 224 225 static_assert(( std::is_convertible<Array&, Array&>::value), ""); 226 static_assert(( std::is_convertible<Array&, const Array&>::value), ""); 227 static_assert((!std::is_convertible<const Array&, Array&>::value), ""); 228 static_assert(( std::is_convertible<const Array&, const Array&>::value), ""); 229 230 static_assert((!std::is_convertible<Array&, char>::value), ""); 231 static_assert((!std::is_convertible<Array&, const char>::value), ""); 232 static_assert((!std::is_convertible<const Array&, char>::value), ""); 233 static_assert((!std::is_convertible<const Array&, const char>::value), ""); 234 235 static_assert((!std::is_convertible<Array&, char&>::value), ""); 236 static_assert((!std::is_convertible<Array&, const char&>::value), ""); 237 static_assert((!std::is_convertible<const Array&, char&>::value), ""); 238 static_assert((!std::is_convertible<const Array&, const char&>::value), ""); 239 240 static_assert(( std::is_convertible<Array&, char*>::value), ""); 241 static_assert(( std::is_convertible<Array&, const char*>::value), ""); 242 static_assert((!std::is_convertible<const Array&, char*>::value), ""); 243 static_assert(( std::is_convertible<const Array&, const char*>::value), ""); 244 } 245 { 246 static_assert((!std::is_convertible<char, void>::value), ""); 247 static_assert((!std::is_convertible<const char, void>::value), ""); 248 static_assert((!std::is_convertible<char, const void>::value), ""); 249 static_assert((!std::is_convertible<const char, const void>::value), ""); 250 251 static_assert((!std::is_convertible<char, Function>::value), ""); 252 static_assert((!std::is_convertible<const char, Function>::value), ""); 253 254 static_assert((!std::is_convertible<char, Function&>::value), ""); 255 static_assert((!std::is_convertible<const char, Function&>::value), ""); 256 257 static_assert((!std::is_convertible<char, Function*>::value), ""); 258 static_assert((!std::is_convertible<char, Function* const>::value), ""); 259 static_assert((!std::is_convertible<const char, Function*>::value), ""); 260 static_assert((!std::is_convertible<const char, Function*const >::value), ""); 261 262 static_assert((!std::is_convertible<char, Array>::value), ""); 263 static_assert((!std::is_convertible<char, const Array>::value), ""); 264 static_assert((!std::is_convertible<const char, Array>::value), ""); 265 static_assert((!std::is_convertible<const char, const Array>::value), ""); 266 267 static_assert((!std::is_convertible<char, Array&>::value), ""); 268 static_assert((!std::is_convertible<char, const Array&>::value), ""); 269 static_assert((!std::is_convertible<const char, Array&>::value), ""); 270 static_assert((!std::is_convertible<const char, const Array&>::value), ""); 271 272 static_assert(( std::is_convertible<char, char>::value), ""); 273 static_assert(( std::is_convertible<char, const char>::value), ""); 274 static_assert(( std::is_convertible<const char, char>::value), ""); 275 static_assert(( std::is_convertible<const char, const char>::value), ""); 276 277 static_assert((!std::is_convertible<char, char&>::value), ""); 278 static_assert(( std::is_convertible<char, const char&>::value), ""); 279 static_assert((!std::is_convertible<const char, char&>::value), ""); 280 static_assert(( std::is_convertible<const char, const char&>::value), ""); 281 282 static_assert((!std::is_convertible<char, char*>::value), ""); 283 static_assert((!std::is_convertible<char, const char*>::value), ""); 284 static_assert((!std::is_convertible<const char, char*>::value), ""); 285 static_assert((!std::is_convertible<const char, const char*>::value), ""); 286 } 287 { 288 static_assert((!std::is_convertible<char&, void>::value), ""); 289 static_assert((!std::is_convertible<const char&, void>::value), ""); 290 static_assert((!std::is_convertible<char&, const void>::value), ""); 291 static_assert((!std::is_convertible<const char&, const void>::value), ""); 292 293 static_assert((!std::is_convertible<char&, Function>::value), ""); 294 static_assert((!std::is_convertible<const char&, Function>::value), ""); 295 296 static_assert((!std::is_convertible<char&, Function&>::value), ""); 297 static_assert((!std::is_convertible<const char&, Function&>::value), ""); 298 299 static_assert((!std::is_convertible<char&, Function*>::value), ""); 300 static_assert((!std::is_convertible<char&, Function* const>::value), ""); 301 static_assert((!std::is_convertible<const char&, Function*>::value), ""); 302 static_assert((!std::is_convertible<const char&, Function*const >::value), ""); 303 304 static_assert((!std::is_convertible<char&, Array>::value), ""); 305 static_assert((!std::is_convertible<char&, const Array>::value), ""); 306 static_assert((!std::is_convertible<const char&, Array>::value), ""); 307 static_assert((!std::is_convertible<const char&, const Array>::value), ""); 308 309 static_assert((!std::is_convertible<char&, Array&>::value), ""); 310 static_assert((!std::is_convertible<char&, const Array&>::value), ""); 311 static_assert((!std::is_convertible<const char&, Array&>::value), ""); 312 static_assert((!std::is_convertible<const char&, const Array&>::value), ""); 313 314 static_assert(( std::is_convertible<char&, char>::value), ""); 315 static_assert(( std::is_convertible<char&, const char>::value), ""); 316 static_assert(( std::is_convertible<const char&, char>::value), ""); 317 static_assert(( std::is_convertible<const char&, const char>::value), ""); 318 319 static_assert(( std::is_convertible<char&, char&>::value), ""); 320 static_assert(( std::is_convertible<char&, const char&>::value), ""); 321 static_assert((!std::is_convertible<const char&, char&>::value), ""); 322 static_assert(( std::is_convertible<const char&, const char&>::value), ""); 323 324 static_assert((!std::is_convertible<char&, char*>::value), ""); 325 static_assert((!std::is_convertible<char&, const char*>::value), ""); 326 static_assert((!std::is_convertible<const char&, char*>::value), ""); 327 static_assert((!std::is_convertible<const char&, const char*>::value), ""); 328 } 329 { 330 static_assert((!std::is_convertible<char*, void>::value), ""); 331 static_assert((!std::is_convertible<const char*, void>::value), ""); 332 static_assert((!std::is_convertible<char*, const void>::value), ""); 333 static_assert((!std::is_convertible<const char*, const void>::value), ""); 334 335 static_assert((!std::is_convertible<char*, Function>::value), ""); 336 static_assert((!std::is_convertible<const char*, Function>::value), ""); 337 338 static_assert((!std::is_convertible<char*, Function&>::value), ""); 339 static_assert((!std::is_convertible<const char*, Function&>::value), ""); 340 341 static_assert((!std::is_convertible<char*, Function*>::value), ""); 342 static_assert((!std::is_convertible<char*, Function* const>::value), ""); 343 static_assert((!std::is_convertible<const char*, Function*>::value), ""); 344 static_assert((!std::is_convertible<const char*, Function*const >::value), ""); 345 346 static_assert((!std::is_convertible<char*, Array>::value), ""); 347 static_assert((!std::is_convertible<char*, const Array>::value), ""); 348 static_assert((!std::is_convertible<const char*, Array>::value), ""); 349 static_assert((!std::is_convertible<const char*, const Array>::value), ""); 350 351 static_assert((!std::is_convertible<char*, Array&>::value), ""); 352 static_assert((!std::is_convertible<char*, const Array&>::value), ""); 353 static_assert((!std::is_convertible<const char*, Array&>::value), ""); 354 static_assert((!std::is_convertible<const char*, const Array&>::value), ""); 355 356 static_assert((!std::is_convertible<char*, char>::value), ""); 357 static_assert((!std::is_convertible<char*, const char>::value), ""); 358 static_assert((!std::is_convertible<const char*, char>::value), ""); 359 static_assert((!std::is_convertible<const char*, const char>::value), ""); 360 361 static_assert((!std::is_convertible<char*, char&>::value), ""); 362 static_assert((!std::is_convertible<char*, const char&>::value), ""); 363 static_assert((!std::is_convertible<const char*, char&>::value), ""); 364 static_assert((!std::is_convertible<const char*, const char&>::value), ""); 365 366 static_assert(( std::is_convertible<char*, char*>::value), ""); 367 static_assert(( std::is_convertible<char*, const char*>::value), ""); 368 static_assert((!std::is_convertible<const char*, char*>::value), ""); 369 static_assert(( std::is_convertible<const char*, const char*>::value), ""); 370 } 371 { 372 static_assert((std::is_convertible<NonCopyable&, NonCopyable&>::value), ""); 373 static_assert((std::is_convertible<NonCopyable&, const NonCopyable&>::value), ""); 374 static_assert((std::is_convertible<NonCopyable&, const volatile NonCopyable&>::value), ""); 375 static_assert((std::is_convertible<NonCopyable&, volatile NonCopyable&>::value), ""); 376 static_assert((std::is_convertible<const NonCopyable&, const NonCopyable&>::value), ""); 377 static_assert((std::is_convertible<const NonCopyable&, const volatile NonCopyable&>::value), ""); 378 static_assert((std::is_convertible<volatile NonCopyable&, const volatile NonCopyable&>::value), ""); 379 static_assert((std::is_convertible<const volatile NonCopyable&, const volatile NonCopyable&>::value), ""); 380 static_assert((!std::is_convertible<const NonCopyable&, NonCopyable&>::value), ""); 381 } 382 } 383