|
Boost : |
From: Daryle Walker (darylew_at_[hidden])
Date: 2001-04-15 18:13:15
on 4/14/01 3:29 PM, Beman Dawes at bdawes_at_[hidden] wrote:
> At 02:36 PM 4/14/2001, Daryle Walker wrote:
>
>> When testing out the special functions, quaternion, and octonion classes, I
>> got a few warnings about missing prototypes. Could we add forward
>> declarations to the function and template function in
>> <boost/detail/catch_exceptions.hpp>? For <boost/test/test_tools.hpp>, could
>> we put the #includes after their function declarations?
> Please send a diff with fixes for the compiler you're having trouble with?
I originally didn't have any fixes, I just ignored the warnings. I made
some fixes and, since I don't have a diff tool, am sending the altered files
as attachments. All I did was add forward declarations in
catch_exceptions.hpp and move the #includes in test_tools.hpp so the
declarations come before the definitions.
-- Daryle Walker Mac, Internet, and Video Game Junkie darylew AT mac DOT com
// boost/catch_exceptions.hpp -----------------------------------------------//
// (C) Copyright Beman Dawes 1995-2001. Permission to copy, use, modify, sell
// and distribute this software is granted provided this copyright notice
// appears in all copies. This software is provided "as is" without express or
// implied warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for updates, documentation, and revision history.
// Revision History
// 15 Apr 01 Add forward declarations to avoid warnings. (Daryle Walker)
// 26 Feb 01 Numerous changes suggested during formal review. (Beman)
// 25 Jan 01 catch_exceptions.hpp code factored out of cpp_main.cpp.
// 22 Jan 01 Remove test_tools dependencies to reduce coupling.
// 5 Nov 00 Initial boost version (Beman Dawes)
#ifndef BOOST_CATCH_EXCEPTIONS_HPP
#define BOOST_CATCH_EXCEPTIONS_HPP
// header dependencies are deliberately restricted to the standard library
// to reduce coupling to other boost libraries.
#include <string> // for string
#include <new> // for bad_alloc
#include <typeinfo> // for bad_cast, bad_typeid
#include <exception> // for exception, bad_exception
#include <stdexcept> // for std exception hierarchy
#include <boost/cstdlib.hpp> // for exit codes
# if __GNUC__ != 2 || __GNUC_MINOR__ > 95
# include <ostream> // for ostream
# else
# include <iostream> // workaround GNU missing ostream header
# endif
namespace boost
{
// Forward declaration (no particular reason)
template < class Generator >
int catch_exceptions( Generator, ::std::ostream &, ::std::ostream & );
namespace detail
{
// Forward declaration, to avoid a warning on some compilers
void report_exception( ::std::ostream &, char const *, char const * );
// A separate reporting function was requested during formal review.
void report_exception( std::ostream & os,
const char * name, const char * info )
{ os << "\n** uncaught exception: " << name << " " << info << std::endl; }
}
// catch_exceptions ------------------------------------------------------//
template< class Generator > // Generator is function object returning int
int catch_exceptions( Generator function_object,
std::ostream & out, std::ostream & err )
{
int result = 0; // quiet compiler warnings
bool exception_thrown = true; // avoid setting result for each excptn type
try
{
result = function_object();
exception_thrown = false;
}
// As a result of hard experience with strangely interleaved output
// under some compilers, there is a lot of use of endl in the code below
// where a simple '\n' might appear to do.
// The rules for catch & arguments are a bit different from function
// arguments (ISO 15.3 paragraphs 18 & 19). Apparently const isn't
// required, but it doesn't hurt and some programmers ask for it.
catch ( const char * ex )
{ detail::report_exception( out, "", ex ); }
catch ( const std::string & ex )
{ detail::report_exception( out, "", ex.c_str() ); }
// std:: exceptions
catch ( const std::bad_alloc & ex )
{ detail::report_exception( out, "std::bad_alloc:", ex.what() ); }
# if !defined(__BORLANDC__) || __BORLANDC__ > 0x0551
catch ( const std::bad_cast & ex )
{ detail::report_exception( out, "std::bad_cast:", ex.what() ); }
catch ( const std::bad_typeid & ex )
{ detail::report_exception( out, "std::bad_typeid:", ex.what() ); }
# else
catch ( const std::bad_cast & ex )
{ detail::report_exception( out, "std::bad_cast", "" ); }
catch ( const std::bad_typeid & ex )
{ detail::report_exception( out, "std::bad_typeid", "" ); }
# endif
catch ( const std::bad_exception & ex )
{ detail::report_exception( out, "std::bad_exception:", ex.what() ); }
catch ( const std::domain_error & ex )
{ detail::report_exception( out, "std::domain_error:", ex.what() ); }
catch ( const std::invalid_argument & ex )
{ detail::report_exception( out, "std::invalid_argument:", ex.what() ); }
catch ( const std::length_error & ex )
{ detail::report_exception( out, "std::length_error:", ex.what() ); }
catch ( const std::out_of_range & ex )
{ detail::report_exception( out, "std::out_of_range:", ex.what() ); }
catch ( const std::range_error & ex )
{ detail::report_exception( out, "std::range_error:", ex.what() ); }
catch ( const std::overflow_error & ex )
{ detail::report_exception( out, "std::overflow_error:", ex.what() ); }
catch ( const std::underflow_error & ex )
{ detail::report_exception( out, "std::underflow_error:", ex.what() ); }
catch ( const std::logic_error & ex )
{ detail::report_exception( out, "std::logic_error:", ex.what() ); }
catch ( const std::runtime_error & ex )
{ detail::report_exception( out, "std::runtime_error:", ex.what() ); }
catch ( const std::exception & ex )
{ detail::report_exception( out, "std::exception:", ex.what() ); }
catch ( ... )
{ detail::report_exception( out, "unknown exception", "" ); }
if ( exception_thrown ) result = boost::exit_exception_failure;
if ( result != 0 && result != exit_success )
{
out << std::endl << "**** returning with error code "
<< result << std::endl;
err
<< "********** errors detected; see stdout for details ***********"
<< std::endl;
}
else { out << std::flush << "no errors detected" << std::endl; }
return result;
} // catch_exceptions
} // boost
#endif // BOOST_CATCH_EXCEPTIONS_HPP
// test tools header -------------------------------------------------------//
// (C) Copyright Beman Dawes 2000. Permission to copy, use, modify, sell
// and distribute this software is granted provided this copyright notice
// appears in all copies. This software is provided "as is" without express or
// implied warranty, and with no claim as to its suitability for any purpose.
// See http://www.boost.org for updates, documentation, and revision history.
// Revision History
// 15 Apr 01 Moved main #includes to follow declarations (Daryle Walker)
// 26 Feb 01 Numerous changes suggested during formal review. (Beman)
// 7 Feb 01 #include <boost/test/test_main.cpp> if requested. (Beman)
// 22 Jan 01 Remove all header dependencies. (Beman)
// 3 Dec 00 Remove function definitions. (Ed Brey)
// 5 Nov 00 Initial boost version (Beman Dawes)
#ifndef BOOST_TEST_TOOLS_HPP
#define BOOST_TEST_TOOLS_HPP
// header dependencies eliminated to reducing coupling.
// macros (gasp!) ease use of reporting functions
#define BOOST_TEST(exp) ((exp) ? static_cast<void>(0) : boost::report_error(#exp,__FILE__,__LINE__))
// Effects: if (!exp) call report_error().
#define BOOST_CRITICAL_TEST(exp) ((exp) ? static_cast<void>(0) : boost::report_critical_error(#exp,__FILE__,__LINE__))
// Effects: if (!exp) call report_critical_error().
#define BOOST_ERROR(msg) boost::report_error((msg),__FILE__,__LINE__)
#define BOOST_CRITICAL_ERROR(msg) boost::report_critical_error((msg),__FILE__,__LINE__)
namespace boost
{
// Function implementations are not inline because it is better design to
// decouple implementation, and because space is more important than speed
// since error functions get called relatively infrequently. Note that
// separating implementatiion means that this header could be useful
// without using the boost/test_main.hpp header for a main() function,
// and/or a different implementation could be supplied at link time.
void report_error( const char * msg, const char * file, int line );
// Effects: increment test_tools_error counter, write error message to cout.
void report_critical_error( const char * msg, const char * file, int line );
// Effects: report_error(msg,file,line), throw test_tools_exception.
}
// for convenience, allow the user to request inclusion of lower-level layers
#ifdef BOOST_INCLUDE_MAIN
#include <boost/test/cpp_main.cpp>
#include <boost/test/test_main.cpp>
#endif
#endif // BOOST_TEST_TOOLS_HPP
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk