Home | History | Annotate | Download | only in Headers
      1 // RUN: %clang_cc1 -triple thumbv7-apple-ios7.0 -target-abi apcs-gnu -std=c++11 -verify %s
      2 // expected-no-diagnostics
      3 
      4 struct true_type {
      5   static constexpr const bool value = true;
      6 };
      7 
      8 struct false_type {
      9   static constexpr const bool value = false;
     10 };
     11 
     12 template <class _Tp, class _Up> struct is_same           : public false_type {};
     13 template <class _Tp>            struct is_same<_Tp, _Tp> : public true_type {};
     14 
     15 // Check that our 'is_same' works.
     16 static_assert(is_same<char, char>::value, "is_same is broken");
     17 static_assert(!is_same<char, char *>::value, "is_same is broken");
     18 
     19 template <class _Tp, unsigned _AlignOf, unsigned _SizeOf>
     20 struct check_type {
     21   static constexpr const bool value =
     22     (alignof(_Tp) == _AlignOf) && (sizeof(_Tp) == _SizeOf);
     23 };
     24 
     25 //===----------------------------------------------------------------------===//
     26 // Fundamental types
     27 //===----------------------------------------------------------------------===//
     28 
     29 static_assert(check_type<bool, 1, 1>::value, "bool is wrong");
     30 
     31 static_assert(check_type<char, 1, 1>::value, "char is wrong");
     32 static_assert(check_type<signed char, 1, 1>::value, "signed char is wrong");
     33 static_assert(check_type<unsigned char, 1, 1>::value, "unsigned char is wrong");
     34 
     35 static_assert(check_type<char16_t, 2, 2>::value, "char16_t is wrong");
     36 static_assert(check_type<char32_t, 4, 4>::value, "char32_t is wrong");
     37 static_assert(check_type<wchar_t, 4, 4>::value, "wchar_t is wrong");
     38 
     39 static_assert(check_type<short, 2, 2>::value, "short is wrong");
     40 static_assert(check_type<unsigned short, 2, 2>::value, "unsigned short is wrong");
     41 
     42 static_assert(check_type<int, 4, 4>::value, "int is wrong");
     43 static_assert(check_type<unsigned int, 4, 4>::value, "unsigned int is wrong");
     44 
     45 static_assert(check_type<long, 4, 4>::value, "long is wrong");
     46 static_assert(check_type<unsigned long, 4, 4>::value, "unsigned long is wrong");
     47 
     48 static_assert(check_type<long long, 8, 8>::value, "long long is wrong");
     49 static_assert(check_type<unsigned long long, 8, 8>::value, "unsigned long long is wrong");
     50 
     51 static_assert(check_type<float, 4, 4>::value, "float is wrong");
     52 static_assert(check_type<double, 8, 8>::value, "double is wrong");
     53 static_assert(check_type<long double, 4, 8>::value, "long double is wrong");
     54 
     55 static_assert(check_type<void *, 4, 4>::value, "'void *' is wrong");
     56 static_assert(check_type<int (*)(int), 4, 4>::value, "function pointer is wrong");
     57 
     58 //===----------------------------------------------------------------------===//
     59 // stdarg.h
     60 //===----------------------------------------------------------------------===//
     61 
     62 #include <stdarg.h>
     63 
     64 static_assert(check_type<va_list, 4, 4>::value, "va_list is wrong");
     65 
     66 //===----------------------------------------------------------------------===//
     67 // stddef.h
     68 //===----------------------------------------------------------------------===//
     69 
     70 #define __STDC_WANT_LIB_EXT1__ 1
     71 #include <stddef.h>
     72 
     73 static_assert(is_same<int, ::ptrdiff_t>::value, "::ptrdiff_t is wrong");
     74 static_assert(is_same<decltype(sizeof(char)), ::size_t>::value, "::size_t is wrong");
     75 static_assert(is_same<long unsigned int, ::size_t>::value, "::size_t is wrong");
     76 static_assert(is_same<long unsigned int, ::rsize_t>::value, "::rsize_t is wrong");
     77 static_assert(is_same<long double, ::max_align_t>::value, "::max_align_t is wrong");
     78 
     79 #define __need_wint_t
     80 #include <stddef.h>
     81 
     82 static_assert(is_same<int, ::wint_t>::value, "::wint_t is wrong");
     83 
     84