diff --git a/CMakeLists.txt b/CMakeLists.txt index 21c0ebe79..2f8808050 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,7 @@ ENABLE_TESTING() OPTION(JSONCPP_WITH_TESTS "Compile and run JsonCpp test executables" ON) OPTION(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post build step" ON) +OPTION(JSONCPP_WITH_WARNING_AS_ERROR "Force compilation to fail if a warning occurs" OFF) # Ensures that CMAKE_BUILD_TYPE is visible in cmake-gui on Unix IF(NOT WIN32) @@ -61,9 +62,27 @@ MESSAGE(STATUS "JsonCpp Version: ${JSONCPP_VERSION_MAJOR}.${JSONCPP_VERSION_MINO CONFIGURE_FILE( "${PROJECT_SOURCE_DIR}/src/lib_json/version.h.in" "${PROJECT_SOURCE_DIR}/include/json/version.h" ) +macro(UseCompilationWarningAsError) + if ( MSVC ) + # Only enabled in debug because some old versions of VS STL generate + # warnings when compiled in release configuration. + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /WX ") + endif( MSVC ) +endmacro() + # Include our configuration header INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/include ) +if ( MSVC ) + # Only enabled in debug because some old versions of VS STL generate + # unreachable code warning when compiled in release configuration. + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W4 ") +endif( MSVC ) + +IF(JSONCPP_WITH_WARNING_AS_ERROR) + UseCompilationWarningAsError() +ENDIF(JSONCPP_WITH_WARNING_AS_ERROR) + # Build the different applications ADD_SUBDIRECTORY( src ) diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp index 4f2e216cc..6fdb2d70a 100644 --- a/src/lib_json/json_value.cpp +++ b/src/lib_json/json_value.cpp @@ -1805,7 +1805,7 @@ Path::makePath( const std::string &path, void -Path::addPathInArg( const std::string &path, +Path::addPathInArg( const std::string &/*path*/, const InArgs &in, InArgs::const_iterator &itInArg, PathArgument::Kind kind ) @@ -1826,8 +1826,8 @@ Path::addPathInArg( const std::string &path, void -Path::invalidPath( const std::string &path, - int location ) +Path::invalidPath( const std::string &/*path*/, + int /*location*/ ) { // Error: invalid path. } diff --git a/src/test_lib_json/jsontest.cpp b/src/test_lib_json/jsontest.cpp index 327d344bc..e27a1ebf0 100644 --- a/src/test_lib_json/jsontest.cpp +++ b/src/test_lib_json/jsontest.cpp @@ -480,10 +480,10 @@ Runner::runCommandLine( int argc, const char *argv[] ) const } -#if defined(_MSC_VER) +#if defined(_MSC_VER) && defined(_DEBUG) // Hook MSVCRT assertions to prevent dialog from appearing static int -msvcrtSilentReportHook( int reportType, char *message, int *returnValue ) +msvcrtSilentReportHook( int reportType, char *message, int * /*returnValue*/ ) { // The default CRT handling of error and assertion is to display // an error dialog to the user. @@ -517,9 +517,11 @@ msvcrtSilentReportHook( int reportType, char *message, int *returnValue ) void Runner::preventDialogOnCrash() { -#if defined(_MSC_VER) +#if defined(_MSC_VER) && defined(_DEBUG) // Install a hook to prevent MSVCRT error and assertion from - // popping a dialog. + // popping a dialog + // This function a NO-OP in release configuration + // (which cause warning since msvcrtSilentReportHook is not referenced) _CrtSetReportHook( &msvcrtSilentReportHook ); #endif // if defined(_MSC_VER) diff --git a/src/test_lib_json/jsontest.h b/src/test_lib_json/jsontest.h index 6dc7535cf..8d3f46af3 100644 --- a/src/test_lib_json/jsontest.h +++ b/src/test_lib_json/jsontest.h @@ -193,7 +193,7 @@ namespace JsonTest { if ( static_cast< U >( expected ) != actual ) { result.addFailure( file, line, expr ); - result << "Expected: " << expected << "\n"; + result << "Expected: " << static_cast< U >( expected ) << "\n"; result << "Actual : " << actual; } return result;