small_type.pass.cpp revision 7175a079211ec78c8232d9d55fa4c1f9eeae803d
17175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier//===----------------------------------------------------------------------===//
27175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier//
37175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier//                     The LLVM Compiler Infrastructure
47175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier//
57175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier// This file is dual licensed under the MIT and the University of Illinois Open
67175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier// Source Licenses. See LICENSE.TXT for details.
77175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier//
87175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier//===----------------------------------------------------------------------===//
97175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
107175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier// UNSUPPORTED: c++98, c++03, c++11
117175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
127175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier// <experimental/any>
137175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
147175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier// Check that the size and alignment of any are what we expect.
157175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
167175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#include <experimental/any>
177175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier#include "any_helpers.h"
187175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
197175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselierclass SmallThrowsDtor
207175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier{
217175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselierpublic:
227175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    SmallThrowsDtor() {}
237175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    SmallThrowsDtor(SmallThrowsDtor const &) noexcept {}
247175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    SmallThrowsDtor(SmallThrowsDtor &&) noexcept {}
257175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    ~SmallThrowsDtor() noexcept(false) {}
267175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier};
277175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier
287175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselierint main()
297175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier{
307175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    using std::experimental::any;
317175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    using std::experimental::__any_imp::_IsSmallObject;
327175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    static_assert(_IsSmallObject<small>::value, "");
337175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    static_assert(_IsSmallObject<void*>::value, "");
347175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    static_assert(!_IsSmallObject<SmallThrowsDtor>::value, "");
357175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    static_assert(!_IsSmallObject<large>::value, "");
367175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    // long double is over aligned.
377175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    static_assert(sizeof(long double) <= sizeof(void*) * 3, "");
387175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    static_assert(alignof(long double) > alignof(void*), "");
397175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier    static_assert(!_IsSmallObject<long double>::value, "");
407175a079211ec78c8232d9d55fa4c1f9eeae803dEric Fiselier}
41