| /************************************************************************ |
| * |
| * 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 <time.h> |
| #endif // SunPro && SunOS 5.{8,9} |
| |
| #include <cassert> |
| #include <cctype> |
| #include <cerrno> |
| #include <cfloat> |
| #include <ciso646> |
| #include <climits> |
| #include <clocale> |
| #include <cmath> |
| #include <csetjmp> |
| #include <csignal> |
| #include <cstdarg> |
| #include <cstddef> |
| #include <cstdio> |
| #include <cstdlib> |
| #include <cstring> |
| #include <ctime> |
| #include <cwchar> |
| #include <cwctype> |
| |
| #include <assert.h> |
| #include <ctype.h> |
| #include <errno.h> |
| #include <float.h> |
| #include <iso646.h> |
| #include <limits.h> |
| #include <locale.h> |
| #include <math.h> |
| #include <setjmp.h> |
| #include <signal.h> |
| #include <stdarg.h> |
| #include <stddef.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <time.h> |
| #include <wchar.h> |
| #include <wctype.h> |
| |
| #include <algorithm> |
| #include <bitset> |
| #include <complex> |
| #include <deque> |
| #include <exception> |
| #include <fstream> |
| #include <functional> |
| #include <iomanip> |
| #include <ios> |
| #include <iosfwd> |
| #include <iostream> |
| #include <istream> |
| #include <iterator> |
| #include <limits> |
| #include <list> |
| #include <locale> |
| #include <map> |
| #include <memory> |
| #include <new> |
| #include <numeric> |
| #include <ostream> |
| #include <queue> |
| #include <set> |
| #include <sstream> |
| #include <stack> |
| #include <stdexcept> |
| #include <streambuf> |
| #include <string> |
| #include <typeinfo> |
| #include <utility> |
| #include <valarray> |
| #include <vector> |
| |
| /***********************************************************************/ |
| |
| int count_called = 0; |
| int count_pred_called = 0; |
| int distance_called = 0; |
| |
| |
| #if !defined (__SUNPRO_CC) || __SUNPRO_CC > 0x550 |
| |
| template <class T, class U> |
| void count (T, T, const U&, ...) { ++count_called; } |
| |
| |
| template <class T, class U> |
| void count_if (T, T, U, ...) { ++count_pred_called; } |
| |
| |
| template <class T> |
| void distance (T, T, ...) { ++distance_called; } |
| |
| #else |
| |
| // working around a SunPro bug (PR #28678) |
| |
| template <class T, class U> |
| void count (T, T, const U&, std::size_t&) { ++count_called; } |
| |
| |
| template <class T, class U> |
| void count_if (T, T, U, std::size_t&) { ++count_pred_called; } |
| |
| |
| template <class T> |
| 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<char> |
| { |
| typedef std::num_get<char> 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 <class T> |
| 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 <class charT> |
| struct char_traits { /* empty */ }; |
| |
| #endif // _RWSTD_NO_EXT_CHAR_TRAITS_PRIMARY |
| |
| |
| #ifdef _RWSTD_NO_EXT_CODECVT_PRIMARY |
| |
| template <class internT, class externT, class stateT> |
| struct codecvt { /* empty */ }; |
| |
| #endif // _RWSTD_NO_EXT_CODECVT_PRIMARY |
| |
| |
| #ifdef _RWSTD_NO_EXT_CTYPE_PRIMARY |
| |
| template <class charT> |
| struct ctype { /* empty */ }; |
| |
| #endif // _RWSTD_NO_EXT_CTYPE_PRIMARY |
| |
| |
| #ifdef _RWSTD_NO_EXT_COLLATE_PRIMARY |
| |
| template <class charT> |
| struct collate { /* empty */ }; |
| |
| #endif // _RWSTD_NO_EXT_COLLATE_PRIMARY |
| |
| |
| #ifdef _RWSTD_NO_EXT_MONEYPUNCT_PRIMARY |
| |
| template <class charT, bool Intl> |
| struct moneypunct { /* empty */ }; |
| |
| #endif // _RWSTD_NO_EXT_MONEYPUNCT_PRIMARY |
| |
| |
| #ifdef _RWSTD_NO_EXT_NUMPUNCT_PRIMARY |
| |
| template <class charT> |
| struct numpunct { /* empty */ }; |
| |
| #endif // _RWSTD_NO_EXT_NUMPUNCT_PRIMARY |
| |
| |
| #ifdef _RWSTD_NO_EXT_TIME_GET_PRIMARY |
| |
| template <class charT, class InputIterator> |
| struct time_get { /* empty */ }; |
| |
| #endif // _RWSTD_NO_EXT_TIME_GET_PRIMARY |
| |
| |
| #ifdef _RWSTD_NO_EXT_TIME_PUT_PRIMARY |
| |
| template <class charT, class OutputIterator> |
| struct time_put { /* empty */ }; |
| |
| #endif // _RWSTD_NO_EXT_TIME_PUT_PRIMARY |
| |
| |
| #ifdef _RWSTD_NO_EXT_MESSAGES_PRIMARY |
| |
| template <class charT> |
| struct messages { /* empty */ }; |
| |
| #endif // _RWSTD_NO_EXT_MESSAGES_PRIMARY |
| |
| } // namespace std |
| |
| /***********************************************************************/ |
| |
| #include <rw_driver.h> |
| |
| 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<int*> 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<T&>()); \ |
| rw_assert (1 == ellipsis_called, __FILE__, __LINE__, \ |
| "_RWSTD_NO_EXTENSIONS #defined and std::" \ |
| "num_get<char>::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); |
| } |
| |