/************************************************************************ * * extensions.cpp - compilation only test exercising the ability * to compile library headers with extensions diabled * * $Id$ * ************************************************************************ * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. * * Copyright 1994-2008 Rogue Wave Software. * **************************************************************************/ #undef _RWSTD_NO_EXTENSIONS #define _RWSTD_NO_EXTENSIONS // working around a SunOS/SunPro bug (PR #26255) #if defined (__SUNPRO_CC) && (defined (__SunOS_5_8) || defined (__SunOS_5_9)) # include #endif // SunPro && SunOS 5.{8,9} #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /***********************************************************************/ int count_called = 0; int count_pred_called = 0; int distance_called = 0; #if !defined (__SUNPRO_CC) || __SUNPRO_CC > 0x550 template void count (T, T, const U&, ...) { ++count_called; } template void count_if (T, T, U, ...) { ++count_pred_called; } template void distance (T, T, ...) { ++distance_called; } #else // working around a SunPro bug (PR #28678) template void count (T, T, const U&, std::size_t&) { ++count_called; } template void count_if (T, T, U, std::size_t&) { ++count_pred_called; } template void distance (T, T, std::size_t&) { ++distance_called; } #endif // SunPro #if !defined (__GNUG__) || __GNUG__ > 2 int ellipsis_called /* = 0 */; struct NumGet: std::num_get { typedef std::num_get Base; # ifndef _RWSTD_NO_USING_ACCESS_ADJUSTMENT _USING (Base::get); # else // if defined (_RWSTD_NO_USING_ACCESS_ADJUSTMENT) Base::get; # endif // _RWSTD_NO_USING_ACCESS_ADJUSTMENT iter_type get (iter_type, iter_type, std::ios_base&, std::ios_base::iostate&, ...) const { ++ellipsis_called; return iter_type (); } }; #endif // gcc > 2.x template struct convertible { operator T () const { static union { void *dummy; char buffer [sizeof (T)]; } u; return (T)*u.buffer; } }; struct base { /* empty */ }; struct badbit_set: base { /* empty */ }; struct eofbit_set: base { /* empty */ }; struct failbit_set: base { /* empty */ }; struct Bin: base { /* empty */ } *bin; struct Nolock: base { /* empty */ } *nolock; struct NolockBuf: base { /* empty */ } *nolockbuf; struct IosBase: std::ios_base { static bool check (int, base*) { return true; } static bool check (int, ...) { return false; } // members are preferred over non-members during unqualified lookup static bool check_badbit () { return check (0, (badbit_set*)0); } static bool check_eofbit () { return check (0, (eofbit_set*)0); } static bool check_failbit () { return check (0, (failbit_set*)0); } static bool check_bin () { return check (0, bin); } static bool check_nolock () { return check (0, nolock); } static bool check_nolockbuf () { return check (0, nolockbuf); } }; _RWSTD_NAMESPACE (std) { // define bogus primary templates to verify // that they are not defined by the library #ifdef _RWSTD_NO_EXT_CHAR_TRAITS_PRIMARY template struct char_traits { /* empty */ }; #endif // _RWSTD_NO_EXT_CHAR_TRAITS_PRIMARY #ifdef _RWSTD_NO_EXT_CODECVT_PRIMARY template struct codecvt { /* empty */ }; #endif // _RWSTD_NO_EXT_CODECVT_PRIMARY #ifdef _RWSTD_NO_EXT_CTYPE_PRIMARY template struct ctype { /* empty */ }; #endif // _RWSTD_NO_EXT_CTYPE_PRIMARY #ifdef _RWSTD_NO_EXT_COLLATE_PRIMARY template struct collate { /* empty */ }; #endif // _RWSTD_NO_EXT_COLLATE_PRIMARY #ifdef _RWSTD_NO_EXT_MONEYPUNCT_PRIMARY template struct moneypunct { /* empty */ }; #endif // _RWSTD_NO_EXT_MONEYPUNCT_PRIMARY #ifdef _RWSTD_NO_EXT_NUMPUNCT_PRIMARY template struct numpunct { /* empty */ }; #endif // _RWSTD_NO_EXT_NUMPUNCT_PRIMARY #ifdef _RWSTD_NO_EXT_TIME_GET_PRIMARY template struct time_get { /* empty */ }; #endif // _RWSTD_NO_EXT_TIME_GET_PRIMARY #ifdef _RWSTD_NO_EXT_TIME_PUT_PRIMARY template struct time_put { /* empty */ }; #endif // _RWSTD_NO_EXT_TIME_PUT_PRIMARY #ifdef _RWSTD_NO_EXT_MESSAGES_PRIMARY template struct messages { /* empty */ }; #endif // _RWSTD_NO_EXT_MESSAGES_PRIMARY } // namespace std /***********************************************************************/ #include bool predicate (int /* unused */) { return true; } static int run_test (int /* unused */, char* /* unused */ []) { // exercise _RWSTD_NO_EXT_VOID_COUNT rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_VOID_COUNT"); std::reverse_iterator it (0); std::size_t n = 0; #ifndef _RWSTD_NO_EXT_VOID_COUNT rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_VOID_COUNT not #defined"); #endif // call the 4-argument overload of count() and expect Koenig lookup // to find ::count(); the std::count() extension will be preferred // if it exists and is a viable candidate, in which case the test // below will fail count (it, it, 0, n); rw_assert (1 == count_called, __FILE__, __LINE__, "_RWSTD_NO_EXTENSIONS #defined and an extended " "definition of std::count() found"); // call the 4-argument overload of count() and expect Koenig lookup // to find ::count(); the std::count() extension will be preferred // if it exists and is a viable candidate count_if (it, it, predicate, n); rw_assert (1 == count_pred_called, __FILE__, __LINE__, "_RWSTD_NO_EXTENSIONS #defined and an extended " "definition of std::count_if() found"); // exercise _RWSTD_NO_EXT_VOID_DISTANCE rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_VOID_DISTANCE"); #ifndef _RWSTD_NO_EXT_VOID_DISTANCE rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_VOID_DISTANCE not #defined"); #endif // call the 3-argument overload of distance() and expect Koenig // lookup to find ::distance(); std::distance() will be preferred // if it exists and is a viable candidate distance (it, it, n); rw_assert (1 == distance_called, __FILE__, __LINE__, "_RWSTD_NO_EXTENSIONS #defined and an extended " "definition of std::distance() found"); // exercise _RWSTD_NO_EXT_NUM_GET rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_NUM_GET"); #ifndef _RWSTD_NO_EXT_NUM_GET rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_NUM_GET not #defined"); #endif #if !defined (__GNUG__) || __GNUG__ > 2 # define STRING(x) #x # define TEST_GET(T) \ do { \ NumGet::iter_type in; \ std::ios_base::iostate err = std::ios_base::failbit; \ ellipsis_called = 0; \ NumGet ().get (in, in, std::cin, err, convertible()); \ rw_assert (1 == ellipsis_called, __FILE__, __LINE__, \ "_RWSTD_NO_EXTENSIONS #defined and std::" \ "num_get::get(..., " STRING(T) ") found"); \ } while (0) TEST_GET (short); TEST_GET (int); # ifdef _RWSTD_LONG_LONG TEST_GET (_RWSTD_LONG_LONG); TEST_GET (unsigned _RWSTD_LONG_LONG); # endif // _RWSTD_NO_LONG_LONG #endif // gcc > 2.x // exercise _RWSTD_NO_EXT_FAILURE rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_FAILURE"); #ifndef _RWSTD_NO_EXT_FAILURE rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_FAILURE not #defined"); #endif rw_assert (IosBase::check_badbit (), __FILE__, __LINE__, "_RWSTD_NO_EXTENSIONS #defined and " " class std::ios_base::badbit_set found"); rw_assert (IosBase::check_eofbit (), __FILE__, __LINE__, "_RWSTD_NO_EXTENSIONS #defined and " " class std::ios_base::eofbit_set found"); rw_assert (IosBase::check_eofbit (), __FILE__, __LINE__, "_RWSTD_NO_EXTENSIONS #defined and " " class std::ios_base::failbit_set found"); // exercise _RWSTD_NO_EXT_BIN_IO rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_BIN_IO"); #ifndef _RWSTD_NO_EXT_BIN_IO rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_BIN_IO not #defined"); #endif rw_assert (IosBase::check_bin (), __FILE__, __LINE__, "_RWSTD_NO_EXTENSIONS #defined and " " std::ios_base::bin found"); // exercise _RWSTD_NO_EXT_REENTRANT_IO rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_REENTRANT_IO"); #ifndef _RWSTD_NO_EXT_REENTRANT_IO rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_REENTRANT_IO not #defined"); #endif rw_assert (IosBase::check_nolock (), __FILE__, __LINE__, "_RWSTD_NO_EXTENSIONS #defined and " " std::ios_base::nolock found"); rw_assert (IosBase::check_nolockbuf (), __FILE__, __LINE__, "_RWSTD_NO_EXTENSIONS #defined and " " std::ios_base::nolockbuf found"); // exercise _RWSTD_NO_EXT_CHAR_TRAITS_PRIMARY rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_CHAR_TRAITS_PRIMARY"); #ifndef _RWSTD_NO_EXT_CHAR_TRAITS_PRIMARY rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_CHAR_TRAITS_PRIMARY not #defined"); #endif // _RWSTD_NO_EXT_CHAR_TRAITS_PRIMARY // exercise _RWSTD_NO_EXT_CODECVT_PRIMARY rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_CODECVT_PRIMARY"); #ifndef _RWSTD_NO_EXT_CODECVT_PRIMARY rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_CODECVT_PRIMARY not #defined"); #endif // _RWSTD_NO_EXT_CODECVT_PRIMARY // exercise _RWSTD_NO_EXT_COLLATE_PRIMARY rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_COLLATE_PRIMARY"); #ifndef _RWSTD_NO_EXT_COLLATE_PRIMARY rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_COLLATE_PRIMARY not #defined"); #endif // _RWSTD_NO_EXT_COLLATE_PRIMARY // exercise _RWSTD_NO_EXT_CTYPE_PRIMARY rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_CTYPE_PRIMARY"); #ifndef _RWSTD_NO_EXT_CTYPE_PRIMARY rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_CTYPE_PRIMARY not #defined"); #endif // _RWSTD_NO_EXT_CTYPE_PRIMARY // exercise _RWSTD_NO_EXT_MONEYPUNCT_PRIMARY rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_MONEYPUNCT_PRIMARY"); #ifndef _RWSTD_NO_EXT_MONEYPUNCT_PRIMARY rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_MONEYPUNCT_PRIMARY not #defined"); #endif // _RWSTD_NO_EXT_MONEYPUNCT_PRIMARY // exercise _RWSTD_NO_EXT_NUMPUNCT_PRIMARY rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_NUMPUNCT_PRIMARY"); #ifndef _RWSTD_NO_EXT_NUMPUNCT_PRIMARY rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_NUMPUNCT_PRIMARY not #defined"); #endif // _RWSTD_NO_EXT_NUMPUNCT_PRIMARY // exercise _RWSTD_NO_EXT_TIME_GET_PRIMARY rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_TIME_GET_PRIMARY"); #ifndef _RWSTD_NO_EXT_TIME_GET_PRIMARY rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_TIME_GET_PRIMARY not #defined"); #endif // _RWSTD_NO_EXT_TIME_GET_PRIMARY // exercise _RWSTD_NO_EXT_TIME_PUT_PRIMARY rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_TIME_PUT_PRIMARY"); #ifndef _RWSTD_NO_EXT_TIME_PUT_PRIMARY rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_TIME_PUT_PRIMARY not #defined"); #endif // _RWSTD_NO_EXT_TIME_PUT_PRIMARY // exercise _RWSTD_NO_EXT_MESSAGES_PRIMARY rw_info (0, 0, __LINE__, "_RWSTD_NO_EXT_MESSAGES_PRIMARY"); #ifndef _RWSTD_NO_EXT_MESSAGES_PRIMARY rw_assert (0, __FILE__, __LINE__, "_RWSTD_NO_EXT_MESSAGES_PRIMARY not #defined"); #endif // _RWSTD_NO_EXT_MESSAGES_PRIMARY return 0; } /* extern */ int main (int argc, char* argv []) { return rw_test (argc, argv, __FILE__, "intro.compliance", 0, // no comment run_test, "", 0); }