diff --git a/CMakeLists.txt b/CMakeLists.txt index 16b3e650..7313d919 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -131,7 +131,7 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") set(RELEASE_CXX_FLAGS "-O2") set(DEBUG_CXX_FLAGS "-g -O0") set(TEST_CXX_FLAGS "-pthread") - add_definitions(-DNOEXCEPT=noexcept) + add_definitions(-DNOEXCEPT=noexcept -DHAVE_DEMANGLE) elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.1) message(FATAL_ERROR "${PROJECT_NAME} requires Clang 3.1 or greater.") @@ -143,7 +143,7 @@ elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(RELEASE_CXX_FLAGS "-O2") set(DEBUG_CXX_FLAGS "-g -O0") set(TEST_CXX_FLAGS "-pthread") - add_definitions(-DNOEXCEPT=noexcept) + add_definitions(-DNOEXCEPT=noexcept -DHAVE_DEMANGLE) elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") message(STATUS "Detected MSVC compiler") diff --git a/src/app/signal_handlers.cpp b/src/app/signal_handlers.cpp index 6506daff..cd435ccc 100644 --- a/src/app/signal_handlers.cpp +++ b/src/app/signal_handlers.cpp @@ -56,7 +56,8 @@ void CSignalHandlers::SignalHandler(int sig) ReportError(signalStr); } -// TODO: How portable across compilers is this? +#if HAVE_DEMANGLE +// For gcc and clang #include #include #include @@ -67,9 +68,15 @@ std::string demangle(const char* name) { std::free }; - return result != nullptr ? result.get() : name; + return (result != nullptr && status == 0) ? result.get() : name; } -// END OF TODO +#else +// For MSVC and others +// In MSVC typeinfo(e).name() should be already demangled +std::string demangle(const char* name) { + return name; +} +#endif void CSignalHandlers::UnhandledExceptionHandler() {