Skip to content

Commit 613289b

Browse files
committed
GCC and CL message handler: print warnings as errors
We already treated warnings as errors (if requested via command-line options), but we should also mimic the output presented by CL/GCC with those command-line options set.
1 parent 587824f commit 613289b

10 files changed

+36
-1
lines changed

src/goto-cc/armcc_mode.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ int armcc_modet::doit()
4949
cmdline.isset("diag_warning=") ? messaget::M_WARNING : messaget::M_ERROR;
5050
const auto verbosity = messaget::eval_verbosity(
5151
cmdline.get_value("verbosity"), default_verbosity, message_handler);
52+
message_handler.print_warnings_as_errors(cmdline.isset("diag_error="));
5253

5354
messaget log{message_handler};
5455
log.debug() << "ARM mode" << messaget::eom;

src/goto-cc/as_mode.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ int as_modet::doit()
110110
messaget::M_WARNING : messaget::M_ERROR;
111111
messaget::eval_verbosity(
112112
cmdline.get_value("verbosity"), default_verbosity, message_handler);
113+
message_handler.print_warnings_as_errors(cmdline.isset("fatal-warnings"));
113114

114115
if(act_as_as86)
115116
{

src/goto-cc/cl_message_handler.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ void cl_message_handlert::print(
2525

2626
std::ostringstream formatted_message;
2727

28+
if(level == messaget::M_WARNING && warnings_are_errors)
29+
formatted_message << "error: warning treated as error\n";
30+
2831
const irep_idt file = location.get_file();
2932
const std::string &line = id2string(location.get_line());
3033
formatted_message << file << '(' << line << "): ";

src/goto-cc/cl_message_handler.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@ class cl_message_handlert : public console_message_handlert
2929
const source_locationt &location) override;
3030

3131
using console_message_handlert::print;
32+
33+
/// With \p yes set to \c true, prefix warnings with an error message.
34+
/// \param yes: Whether or not to prefix warnings.
35+
void print_warnings_as_errors(bool yes)
36+
{
37+
warnings_are_errors = yes;
38+
}
39+
40+
private:
41+
bool warnings_are_errors = false;
3242
};
3343

3444
#endif // CPROVER_GOTO_CC_CL_MESSAGE_HANDLER_H

src/goto-cc/gcc_message_handler.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,12 @@ void gcc_message_handlert::print(
5353
else
5454
out << column << ": ";
5555

56-
if(level == messaget::M_ERROR)
56+
if(
57+
level == messaget::M_ERROR ||
58+
(level == messaget::M_WARNING && warnings_are_errors))
59+
{
5760
out << string(messaget::red) << "error: ";
61+
}
5862
else if(level == messaget::M_WARNING)
5963
out << string(messaget::bright_magenta) << "warning: ";
6064

src/goto-cc/gcc_message_handler.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,17 @@ class gcc_message_handlert : public console_message_handlert
3030
const std::string &message,
3131
const source_locationt &location) override;
3232

33+
/// With \p yes set to \c true, prefix warnings with "error:" instead of
34+
/// "warning:".
35+
/// \param yes: Whether or not to prefix warnings with "error:".
36+
void print_warnings_as_errors(bool yes)
37+
{
38+
warnings_are_errors = yes;
39+
}
40+
3341
private:
42+
bool warnings_are_errors = false;
43+
3444
/// feed a command into a string
3545
std::string string(const messaget::commandt &c) const
3646
{

src/goto-cc/gcc_mode.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,8 @@ int gcc_modet::doit()
315315
messaget::M_WARNING : messaget::M_ERROR;
316316
messaget::eval_verbosity(
317317
cmdline.get_value("verbosity"), default_verbosity, gcc_message_handler);
318+
gcc_message_handler.print_warnings_as_errors(
319+
cmdline.isset("Werror") && !cmdline.isset("Wno-error"));
318320

319321
bool act_as_bcc=
320322
base_name=="bcc" ||

src/goto-cc/ld_mode.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ int ld_modet::doit()
7777

7878
messaget::eval_verbosity(
7979
cmdline.get_value("verbosity"), messaget::M_ERROR, gcc_message_handler);
80+
gcc_message_handler.print_warnings_as_errors(
81+
cmdline.isset("fatal-warnings") && !cmdline.isset("no-fatal-warnings"));
8082

8183
compilet compiler(
8284
cmdline,

src/goto-cc/ms_cl_mode.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ int ms_cl_modet::doit()
6161
: messaget::M_ERROR;
6262
const auto verbosity = messaget::eval_verbosity(
6363
cmdline.get_value("verbosity"), default_verbosity, message_handler);
64+
message_handler.print_warnings_as_errors(cmdline.isset("WX"));
6465

6566
ms_cl_versiont ms_cl_version;
6667
ms_cl_version.get("cl.exe");

src/goto-cc/ms_link_mode.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ int ms_link_modet::doit()
3535

3636
messaget::eval_verbosity(
3737
cmdline.get_value("verbosity"), messaget::M_ERROR, message_handler);
38+
message_handler.print_warnings_as_errors(cmdline.isset("WX"));
3839

3940
compilet compiler(cmdline, message_handler, cmdline.isset("WX"));
4041

0 commit comments

Comments
 (0)