10e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -triple thumbv7-apple-ios7.0 -target-abi apcs-gnu -std=c++11 -verify %s
20e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// expected-no-diagnostics
30e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
40e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct true_type {
50e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  static constexpr const bool value = true;
60e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
70e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
80e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct false_type {
90e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  static constexpr const bool value = false;
100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
110e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
120e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate <class _Tp, class _Up> struct is_same           : public false_type {};
130e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate <class _Tp>            struct is_same<_Tp, _Tp> : public true_type {};
140e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
150e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// Check that our 'is_same' works.
160e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(is_same<char, char>::value, "is_same is broken");
170e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(!is_same<char, char *>::value, "is_same is broken");
180e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
190e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate <class _Tp, unsigned _AlignOf, unsigned _SizeOf>
200e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstruct check_type {
210e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  static constexpr const bool value =
220e2c34f92f00628d48968dfea096d36381f494cbStephen Hines    (alignof(_Tp) == _AlignOf) && (sizeof(_Tp) == _SizeOf);
230e2c34f92f00628d48968dfea096d36381f494cbStephen Hines};
240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines//===----------------------------------------------------------------------===//
260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// Fundamental types
270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines//===----------------------------------------------------------------------===//
280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
290e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<bool, 1, 1>::value, "bool is wrong");
300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
310e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<char, 1, 1>::value, "char is wrong");
320e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<signed char, 1, 1>::value, "signed char is wrong");
330e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<unsigned char, 1, 1>::value, "unsigned char is wrong");
340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
350e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<char16_t, 2, 2>::value, "char16_t is wrong");
360e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<char32_t, 4, 4>::value, "char32_t is wrong");
370e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<wchar_t, 4, 4>::value, "wchar_t is wrong");
380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
390e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<short, 2, 2>::value, "short is wrong");
400e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<unsigned short, 2, 2>::value, "unsigned short is wrong");
410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
420e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<int, 4, 4>::value, "int is wrong");
430e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<unsigned int, 4, 4>::value, "unsigned int is wrong");
440e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
450e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<long, 4, 4>::value, "long is wrong");
460e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<unsigned long, 4, 4>::value, "unsigned long is wrong");
470e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
480e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<long long, 8, 8>::value, "long long is wrong");
490e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<unsigned long long, 8, 8>::value, "unsigned long long is wrong");
500e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
510e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<float, 4, 4>::value, "float is wrong");
520e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<double, 8, 8>::value, "double is wrong");
530e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<long double, 4, 8>::value, "long double is wrong");
540e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
550e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<void *, 4, 4>::value, "'void *' is wrong");
560e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<int (*)(int), 4, 4>::value, "function pointer is wrong");
570e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines//===----------------------------------------------------------------------===//
590e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// stdarg.h
600e2c34f92f00628d48968dfea096d36381f494cbStephen Hines//===----------------------------------------------------------------------===//
610e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include <stdarg.h>
630e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
640e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(check_type<va_list, 4, 4>::value, "va_list is wrong");
650e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
660e2c34f92f00628d48968dfea096d36381f494cbStephen Hines//===----------------------------------------------------------------------===//
670e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// stddef.h
680e2c34f92f00628d48968dfea096d36381f494cbStephen Hines//===----------------------------------------------------------------------===//
690e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
700e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#define __STDC_WANT_LIB_EXT1__ 1
710e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include <stddef.h>
720e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
730e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(is_same<int, ::ptrdiff_t>::value, "::ptrdiff_t is wrong");
740e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(is_same<decltype(sizeof(char)), ::size_t>::value, "::size_t is wrong");
750e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(is_same<long unsigned int, ::size_t>::value, "::size_t is wrong");
760e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(is_same<long unsigned int, ::rsize_t>::value, "::rsize_t is wrong");
770e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(is_same<long double, ::max_align_t>::value, "::max_align_t is wrong");
780e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
790e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#define __need_wint_t
800e2c34f92f00628d48968dfea096d36381f494cbStephen Hines#include <stddef.h>
810e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
820e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesstatic_assert(is_same<int, ::wint_t>::value, "::wint_t is wrong");
830e2c34f92f00628d48968dfea096d36381f494cbStephen Hines
84