13cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania/*
23cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * Copyright (C) 2009 The Android Open Source Project
33cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * All rights reserved.
43cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania *
53cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * Redistribution and use in source and binary forms, with or without
63cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * modification, are permitted provided that the following conditions
73cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * are met:
83cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania *  * Redistributions of source code must retain the above copyright
93cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania *    notice, this list of conditions and the following disclaimer.
103cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania *  * Redistributions in binary form must reproduce the above copyright
113cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania *    notice, this list of conditions and the following disclaimer in
123cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania *    the documentation and/or other materials provided with the
133cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania *    distribution.
143cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania *
153cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
163cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
173cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
183cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
193cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
203cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
213cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
223cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
233cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
243cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
253cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
263cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania * SUCH DAMAGE.
273cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania */
283cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania
293cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania#include <cstddef>
30b381ead492251a797d2df4b260cb01eb1f64cfadDavid 'Digit' Turner#if defined BIONIC && !defined BIONIC_LIBSTDCPP_INCLUDE_CSTDDEF__
311aa5708e437b96e04f31d9c9f167427411ba5510Niko Catania#error "Wrong header file included!!"
321aa5708e437b96e04f31d9c9f167427411ba5510Niko Catania#endif
331aa5708e437b96e04f31d9c9f167427411ba5510Niko Catania
343cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania
353cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catanianamespace {
363cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Cataniaconst int kPassed = 0;
373cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Cataniaconst int kFailed = 1;
383cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania#define FAIL_UNLESS(f) if (!android::f()) return kFailed;
393cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania}  // anonymous namespace
403cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania
413cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catanianamespace android {
423cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania// Dummy struct used to calculate offset of some of its fields.
433cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Cataniastruct Foo
443cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania{
453cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    char field1;
463cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    char field2;
473cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania};
483cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania
493cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania// Check various types are declared in the std namespace.
503cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Cataniabool testTypesStd()
513cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania{
523cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    // size_t should be defined in both namespaces
533cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    volatile ::size_t size_t_in_top_ns = 0;
543cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    volatile ::std::size_t size_t_in_std_ns = 0;
553cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania
563cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    if (sizeof(::size_t) != sizeof(::std::size_t))
573cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    {
583cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania        return false;
593cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    }
603cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania
613cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    // ptrdiff_t should be defined in both namespaces
623cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    volatile ::ptrdiff_t ptrdiff_t_in_top_ns = 0;
633cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    volatile ::std::ptrdiff_t ptrdiff_t_in_std_ns = 0;
643cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania
653cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    if (sizeof(::ptrdiff_t) != sizeof(::std::ptrdiff_t))
663cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    {
673cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania        return false;
683cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    }
693cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    // NULL is only in the top namespace
703cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    volatile int *null_is_defined = NULL;
713cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    return true;
723cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania}
733cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania
743cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Cataniabool testOffsetOf()
753cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania{
763cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania#ifndef offsetof
773cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania#error "offsetof is not a macro"
783cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania#endif
793cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania
803cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    // offsetof is only in the top namespace
813cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    volatile size_t offset = offsetof(struct Foo, field2);
823cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    return offset == 1;
833cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania}
843cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania
853cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Cataniabool testNull()
863cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania{
873cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania#ifndef NULL
883cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania#error "NULL is not a macro"
893cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania#endif
903cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    // If NULL is void* this will issue a warning.
913cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    volatile int null_is_not_void_star = NULL;
923cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    return true;
933cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania}
943cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania
953cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania}  // android namespace
963cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania
973cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Cataniaint main(int argc, char **argv)
983cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania{
993cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    FAIL_UNLESS(testTypesStd);
1003cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    FAIL_UNLESS(testOffsetOf);
1013cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    FAIL_UNLESS(testNull);
1023cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania    return kPassed;
1033cb2639f22f8aaf46852c9f03e825e05fc7e7362Niko Catania}
104