diff --git a/modules/core/include/opencv2/core.hpp b/modules/core/include/opencv2/core.hpp index 216a8bcc92..c0c6c178f8 100644 --- a/modules/core/include/opencv2/core.hpp +++ b/modules/core/include/opencv2/core.hpp @@ -144,7 +144,7 @@ It is possible to alternate error processing by using #redirectError(). @param exc the exception raisen. @deprecated drop this version */ -CV_EXPORTS void error( const Exception& exc ); +CV_EXPORTS CV_NORETURN void error(const Exception& exc); enum SortFlags { SORT_EVERY_ROW = 0, //!< each matrix row is sorted independently SORT_EVERY_COLUMN = 1, //!< each matrix column is sorted diff --git a/modules/core/include/opencv2/core/base.hpp b/modules/core/include/opencv2/core/base.hpp index f6bc601492..710524df7b 100644 --- a/modules/core/include/opencv2/core/base.hpp +++ b/modules/core/include/opencv2/core/base.hpp @@ -373,32 +373,7 @@ It is possible to alternate error processing by using redirectError(). @param _line - line number in the source file where the error has occurred @see CV_Error, CV_Error_, CV_Assert, CV_DbgAssert */ -CV_EXPORTS void error(int _code, const String& _err, const char* _func, const char* _file, int _line); - -#ifdef __GNUC__ -# if defined __clang__ || defined __APPLE__ -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Winvalid-noreturn" -# endif -#endif - -/** same as cv::error, but does not return */ -CV_INLINE CV_NORETURN void errorNoReturn(int _code, const String& _err, const char* _func, const char* _file, int _line) -{ - error(_code, _err, _func, _file, _line); -#ifdef __GNUC__ -# if !defined __clang__ && !defined __APPLE__ - // this suppresses this warning: "noreturn" function does return [enabled by default] - __builtin_trap(); - // or use infinite loop: for (;;) {} -# endif -#endif -} -#ifdef __GNUC__ -# if defined __clang__ || defined __APPLE__ -# pragma GCC diagnostic pop -# endif -#endif +CV_EXPORTS CV_NORETURN void error(int _code, const String& _err, const char* _func, const char* _file, int _line); #if defined __GNUC__ #define CV_Func __func__ @@ -446,25 +421,19 @@ for example: #define CV_Assert_1( expr ) if(!!(expr)) ; else cv::error( cv::Error::StsAssert, #expr, CV_Func, __FILE__, __LINE__ ) +#endif // CV_STATIC_ANALYSIS + //! @cond IGNORED -#define CV__ErrorNoReturn( code, msg ) cv::errorNoReturn( code, msg, CV_Func, __FILE__, __LINE__ ) -#define CV__ErrorNoReturn_( code, args ) cv::errorNoReturn( code, cv::format args, CV_Func, __FILE__, __LINE__ ) -#ifdef __OPENCV_BUILD -#undef CV_Error -#define CV_Error CV__ErrorNoReturn -#undef CV_Error_ -#define CV_Error_ CV__ErrorNoReturn_ -#undef CV_Assert_1 -#define CV_Assert_1( expr ) if(!!(expr)) ; else cv::errorNoReturn( cv::Error::StsAssert, #expr, CV_Func, __FILE__, __LINE__ ) -#else -// backward compatibility -#define CV_ErrorNoReturn CV__ErrorNoReturn -#define CV_ErrorNoReturn_ CV__ErrorNoReturn_ +#if !defined(__OPENCV_BUILD) // TODO: backward compatibility only +#ifndef CV_ErrorNoReturn +#define CV_ErrorNoReturn CV_Error +#endif +#ifndef CV_ErrorNoReturn_ +#define CV_ErrorNoReturn_ CV_Error_ +#endif #endif //! @endcond -#endif // CV_STATIC_ANALYSIS - #define CV_Assert_2( expr1, expr2 ) CV_Assert_1(expr1); CV_Assert_1(expr2) #define CV_Assert_3( expr1, expr2, expr3 ) CV_Assert_2(expr1, expr2); CV_Assert_1(expr3) #define CV_Assert_4( expr1, expr2, expr3, expr4 ) CV_Assert_3(expr1, expr2, expr3); CV_Assert_1(expr4) diff --git a/modules/core/src/check.cpp b/modules/core/src/check.cpp index 966d2cad20..a214201196 100644 --- a/modules/core/src/check.cpp +++ b/modules/core/src/check.cpp @@ -67,7 +67,7 @@ void check_failed_auto_(const T& v1, const T& v2, const CheckContext& ctx) ss << "must be " << getTestOpPhraseStr(ctx.testOp) << std::endl; } ss << " '" << ctx.p2_str << "' is " << v2; - cv::errorNoReturn(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line); + cv::error(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line); } void check_failed_MatDepth(const int v1, const int v2, const CheckContext& ctx) { @@ -79,7 +79,7 @@ void check_failed_MatDepth(const int v1, const int v2, const CheckContext& ctx) ss << "must be " << getTestOpPhraseStr(ctx.testOp) << std::endl; } ss << " '" << ctx.p2_str << "' is " << v2 << " (" << depthToString(v2) << ")"; - cv::errorNoReturn(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line); + cv::error(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line); } void check_failed_MatType(const int v1, const int v2, const CheckContext& ctx) { @@ -91,7 +91,7 @@ void check_failed_MatType(const int v1, const int v2, const CheckContext& ctx) ss << "must be " << getTestOpPhraseStr(ctx.testOp) << std::endl; } ss << " '" << ctx.p2_str << "' is " << v2 << " (" << typeToString(v2) << ")"; - cv::errorNoReturn(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line); + cv::error(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line); } void check_failed_MatChannels(const int v1, const int v2, const CheckContext& ctx) { @@ -119,7 +119,7 @@ void check_failed_auto_(const T& v, const CheckContext& ctx) << " '" << ctx.p2_str << "'" << std::endl << "where" << std::endl << " '" << ctx.p1_str << "' is " << v; - cv::errorNoReturn(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line); + cv::error(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line); } void check_failed_MatDepth(const int v, const CheckContext& ctx) { @@ -128,7 +128,7 @@ void check_failed_MatDepth(const int v, const CheckContext& ctx) << " '" << ctx.p2_str << "'" << std::endl << "where" << std::endl << " '" << ctx.p1_str << "' is " << v << " (" << depthToString(v) << ")"; - cv::errorNoReturn(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line); + cv::error(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line); } void check_failed_MatType(const int v, const CheckContext& ctx) { @@ -137,7 +137,7 @@ void check_failed_MatType(const int v, const CheckContext& ctx) << " '" << ctx.p2_str << "'" << std::endl << "where" << std::endl << " '" << ctx.p1_str << "' is " << v << " (" << typeToString(v) << ")"; - cv::errorNoReturn(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line); + cv::error(cv::Error::StsError, ss.str(), ctx.func, ctx.file, ctx.line); } void check_failed_MatChannels(const int v, const CheckContext& ctx) { diff --git a/modules/core/src/opengl.cpp b/modules/core/src/opengl.cpp index 08cfb4ed90..ff9da998bf 100644 --- a/modules/core/src/opengl.cpp +++ b/modules/core/src/opengl.cpp @@ -82,7 +82,7 @@ inline static bool checkError(const char* file, const int line, const char* func default: msg = "Unknown error"; }; - cv::errorNoReturn(Error::OpenGlApiCallError, func, msg, file, line); + cv::error(Error::OpenGlApiCallError, func, msg, file, line); } return true; } diff --git a/modules/core/src/persistence.cpp b/modules/core/src/persistence.cpp index 9b67a97e80..6fbad8b72f 100644 --- a/modules/core/src/persistence.cpp +++ b/modules/core/src/persistence.cpp @@ -149,7 +149,7 @@ void icvParseError( CvFileStorage* fs, const char* func_name, const char* err_msg, const char* source_file, int source_line ) { cv::String msg = cv::format("%s(%d): %s", fs->filename, fs->lineno, err_msg); - cv::errorNoReturn(cv::Error::StsParseError, func_name, msg.c_str(), source_file, source_line ); + cv::error(cv::Error::StsParseError, func_name, msg.c_str(), source_file, source_line ); } void icvFSCreateCollection( CvFileStorage* fs, int tag, CvFileNode* collection ) diff --git a/modules/core/src/system.cpp b/modules/core/src/system.cpp index 0569924aee..f1a837064e 100644 --- a/modules/core/src/system.cpp +++ b/modules/core/src/system.cpp @@ -970,6 +970,13 @@ static void cv_terminate_handler() { #endif +#ifdef __GNUC__ +# if defined __clang__ || defined __APPLE__ +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Winvalid-noreturn" +# endif +#endif + void error( const Exception& exc ) { #ifdef CV_ERROR_SET_TERMINATE_HANDLER @@ -1000,13 +1007,33 @@ void error( const Exception& exc ) } CV_THROW(exc); +#ifdef __GNUC__ +# if !defined __clang__ && !defined __APPLE__ + // this suppresses this warning: "noreturn" function does return [enabled by default] + __builtin_trap(); + // or use infinite loop: for (;;) {} +# endif +#endif } void error(int _code, const String& _err, const char* _func, const char* _file, int _line) { error(cv::Exception(_code, _err, _func, _file, _line)); +#ifdef __GNUC__ +# if !defined __clang__ && !defined __APPLE__ + // this suppresses this warning: "noreturn" function does return [enabled by default] + __builtin_trap(); + // or use infinite loop: for (;;) {} +# endif +#endif } +#ifdef __GNUC__ +# if defined __clang__ || defined __APPLE__ +# pragma GCC diagnostic pop +# endif +#endif + ErrorCallback redirectError( ErrorCallback errCallback, void* userdata, void** prevUserdata) diff --git a/modules/dnn/include/opencv2/dnn/dnn.inl.hpp b/modules/dnn/include/opencv2/dnn/dnn.inl.hpp index 4231896187..d2317fc44e 100644 --- a/modules/dnn/include/opencv2/dnn/dnn.inl.hpp +++ b/modules/dnn/include/opencv2/dnn/dnn.inl.hpp @@ -274,11 +274,7 @@ inline int DictValue::size() const case Param::REAL: return (int)pd->size(); } -#ifdef __OPENCV_BUILD CV_Error(Error::StsInternal, ""); -#else - CV_ErrorNoReturn(Error::StsInternal, ""); -#endif } inline std::ostream &operator<<(std::ostream &stream, const DictValue &dictv) diff --git a/modules/highgui/src/window.cpp b/modules/highgui/src/window.cpp index 663b4458fc..7bc9d432c3 100644 --- a/modules/highgui/src/window.cpp +++ b/modules/highgui/src/window.cpp @@ -603,7 +603,7 @@ void cv::setWindowTitle(const String&, const String&) } #define CV_NO_GUI_ERROR(funcname) \ - cv::errorNoReturn(cv::Error::StsError, \ + cv::error(cv::Error::StsError, \ "The function is not implemented. " \ "Rebuild the library with Windows, GTK+ 2.x or Carbon support. "\ "If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script", \