diff --git a/src/goto-cc/armcc_mode.cpp b/src/goto-cc/armcc_mode.cpp index 7150ffe82f6d..bacd0eee1850 100644 --- a/src/goto-cc/armcc_mode.cpp +++ b/src/goto-cc/armcc_mode.cpp @@ -49,6 +49,7 @@ int armcc_modet::doit() cmdline.isset("diag_warning=") ? messaget::M_WARNING : messaget::M_ERROR; const auto verbosity = messaget::eval_verbosity( cmdline.get_value("verbosity"), default_verbosity, message_handler); + message_handler.print_warnings_as_errors(cmdline.isset("diag_error=")); messaget log{message_handler}; log.debug() << "ARM mode" << messaget::eom; diff --git a/src/goto-cc/as_mode.cpp b/src/goto-cc/as_mode.cpp index fee687b2a9ee..805b82b60951 100644 --- a/src/goto-cc/as_mode.cpp +++ b/src/goto-cc/as_mode.cpp @@ -110,6 +110,7 @@ int as_modet::doit() messaget::M_WARNING : messaget::M_ERROR; messaget::eval_verbosity( cmdline.get_value("verbosity"), default_verbosity, message_handler); + message_handler.print_warnings_as_errors(cmdline.isset("fatal-warnings")); if(act_as_as86) { diff --git a/src/goto-cc/cl_message_handler.cpp b/src/goto-cc/cl_message_handler.cpp index c2eb19456a51..e68d1221d5e8 100644 --- a/src/goto-cc/cl_message_handler.cpp +++ b/src/goto-cc/cl_message_handler.cpp @@ -25,6 +25,9 @@ void cl_message_handlert::print( std::ostringstream formatted_message; + if(level == messaget::M_WARNING && warnings_are_errors) + formatted_message << "error: warning treated as error\n"; + const irep_idt file = location.get_file(); const std::string &line = id2string(location.get_line()); formatted_message << file << '(' << line << "): "; diff --git a/src/goto-cc/cl_message_handler.h b/src/goto-cc/cl_message_handler.h index 7a86d4d0b1dd..3eaf91cd7d7e 100644 --- a/src/goto-cc/cl_message_handler.h +++ b/src/goto-cc/cl_message_handler.h @@ -29,6 +29,16 @@ class cl_message_handlert : public console_message_handlert const source_locationt &location) override; using console_message_handlert::print; + + /// With \p yes set to \c true, prefix warnings with an error message. + /// \param yes: Whether or not to prefix warnings. + void print_warnings_as_errors(bool yes) + { + warnings_are_errors = yes; + } + +private: + bool warnings_are_errors = false; }; #endif // CPROVER_GOTO_CC_CL_MESSAGE_HANDLER_H diff --git a/src/goto-cc/gcc_message_handler.cpp b/src/goto-cc/gcc_message_handler.cpp index 814dd836863a..0239266feca9 100644 --- a/src/goto-cc/gcc_message_handler.cpp +++ b/src/goto-cc/gcc_message_handler.cpp @@ -53,8 +53,12 @@ void gcc_message_handlert::print( else out << column << ": "; - if(level == messaget::M_ERROR) + if( + level == messaget::M_ERROR || + (level == messaget::M_WARNING && warnings_are_errors)) + { out << string(messaget::red) << "error: "; + } else if(level == messaget::M_WARNING) out << string(messaget::bright_magenta) << "warning: "; diff --git a/src/goto-cc/gcc_message_handler.h b/src/goto-cc/gcc_message_handler.h index 45b3fd0c51e8..37b5f8a4c593 100644 --- a/src/goto-cc/gcc_message_handler.h +++ b/src/goto-cc/gcc_message_handler.h @@ -30,7 +30,17 @@ class gcc_message_handlert : public console_message_handlert const std::string &message, const source_locationt &location) override; + /// With \p yes set to \c true, prefix warnings with "error:" instead of + /// "warning:". + /// \param yes: Whether or not to prefix warnings with "error:". + void print_warnings_as_errors(bool yes) + { + warnings_are_errors = yes; + } + private: + bool warnings_are_errors = false; + /// feed a command into a string std::string string(const messaget::commandt &c) const { diff --git a/src/goto-cc/gcc_mode.cpp b/src/goto-cc/gcc_mode.cpp index 85fe6831e3b3..955ba856ba3d 100644 --- a/src/goto-cc/gcc_mode.cpp +++ b/src/goto-cc/gcc_mode.cpp @@ -315,6 +315,8 @@ int gcc_modet::doit() messaget::M_WARNING : messaget::M_ERROR; messaget::eval_verbosity( cmdline.get_value("verbosity"), default_verbosity, gcc_message_handler); + gcc_message_handler.print_warnings_as_errors( + cmdline.isset("Werror") && !cmdline.isset("Wno-error")); bool act_as_bcc= base_name=="bcc" || diff --git a/src/goto-cc/ld_mode.cpp b/src/goto-cc/ld_mode.cpp index f24235259cfa..6dabb29e7597 100644 --- a/src/goto-cc/ld_mode.cpp +++ b/src/goto-cc/ld_mode.cpp @@ -77,6 +77,8 @@ int ld_modet::doit() messaget::eval_verbosity( cmdline.get_value("verbosity"), messaget::M_ERROR, gcc_message_handler); + gcc_message_handler.print_warnings_as_errors( + cmdline.isset("fatal-warnings") && !cmdline.isset("no-fatal-warnings")); compilet compiler( cmdline, diff --git a/src/goto-cc/ms_cl_mode.cpp b/src/goto-cc/ms_cl_mode.cpp index a8c0ab077aa1..ca125497ffb3 100644 --- a/src/goto-cc/ms_cl_mode.cpp +++ b/src/goto-cc/ms_cl_mode.cpp @@ -61,6 +61,7 @@ int ms_cl_modet::doit() : messaget::M_ERROR; const auto verbosity = messaget::eval_verbosity( cmdline.get_value("verbosity"), default_verbosity, message_handler); + message_handler.print_warnings_as_errors(cmdline.isset("WX")); ms_cl_versiont ms_cl_version; ms_cl_version.get("cl.exe"); diff --git a/src/goto-cc/ms_link_mode.cpp b/src/goto-cc/ms_link_mode.cpp index 51affadc1817..6f9129ad4218 100644 --- a/src/goto-cc/ms_link_mode.cpp +++ b/src/goto-cc/ms_link_mode.cpp @@ -35,6 +35,7 @@ int ms_link_modet::doit() messaget::eval_verbosity( cmdline.get_value("verbosity"), messaget::M_ERROR, message_handler); + message_handler.print_warnings_as_errors(cmdline.isset("WX")); compilet compiler(cmdline, message_handler, cmdline.isset("WX"));