Skip to content

Commit 6e9d587

Browse files
committed
Add a CL-specific message handler
console_message_handlert does not print source lines, which we do in GCC mode and should also be doing in CL mode.
1 parent ac7c605 commit 6e9d587

File tree

7 files changed

+81
-8
lines changed

7 files changed

+81
-8
lines changed

regression/ansi-c/const1/const-array.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG
1+
CORE
22
const-array.c
33
^.*: .* is constant$
44
^ array\[1\] = 2;$

regression/ansi-c/const1/const-member.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG
1+
CORE
22
const-member.c
33

44
^.*: .* is constant$

src/goto-cc/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ SRC = armcc_cmdline.cpp \
44
as_cmdline.cpp \
55
as_mode.cpp \
66
bcc_cmdline.cpp \
7+
cl_message_handler.cpp \
78
compile.cpp \
89
cw_mode.cpp \
910
gcc_cmdline.cpp \

src/goto-cc/cl_message_handler.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*******************************************************************\
2+
3+
Module: Print messages like CL.exe does
4+
5+
Author: Michael Tautschnig
6+
7+
\*******************************************************************/
8+
9+
#include "cl_message_handler.h"
10+
11+
#include <fstream>
12+
#include <iostream>
13+
14+
#include "unicode.h"
15+
16+
void console_message_handlert::print(
17+
unsigned level,
18+
const std::string &message,
19+
const source_locationt &location)
20+
{
21+
console_message_handlert::print(level, message, location);
22+
23+
const auto file_name = location.full_path();
24+
const std::string &line = id2string(location.get_line());
25+
26+
if(file_name.has_value() && !line.empty())
27+
{
28+
#ifdef _WIN32
29+
std::ifstream in(widen(file_name.value()));
30+
#else
31+
std::ifstream in(file_name.value());
32+
#endif
33+
if(in)
34+
{
35+
const auto line_number = std::stoull(line);
36+
std::string source_line;
37+
for(std::size_t l = 0; l < line_number; l++)
38+
std::getline(in, source_line);
39+
40+
if(in)
41+
{
42+
// Messages level 3 or lower go to cerr, messages level 4 or
43+
// above go to cout.
44+
if(level>=4)
45+
std::cout << ' ' << source_line << '\n';
46+
else
47+
std::cerr << ' ' << source_line << '\n';
48+
}
49+
}
50+
}
51+
}

src/goto-cc/cl_message_handler.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*******************************************************************\
2+
3+
Module: Print messages like CL.exe does
4+
5+
Author: Michael Tautschnig
6+
7+
\*******************************************************************/
8+
9+
#ifndef CPROVER_GOTO_CC_CL_MESSAGE_HANDLER_H
10+
#define CPROVER_GOTO_CC_CL_MESSAGE_HANDLER_H
11+
12+
#include <util/cout_message.h>
13+
14+
class cl_message_handlert : public console_message_handlert
15+
{
16+
public:
17+
void print(
18+
unsigned level,
19+
const std::string &message,
20+
const source_locationt &location) override;
21+
};
22+
23+
#endif // CPROVER_GOTO_CC_CL_MESSAGE_HANDLER_H

src/goto-cc/ms_cl_mode.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ Date: June 2006
1414
#ifndef CPROVER_GOTO_CC_MS_CL_MODE_H
1515
#define CPROVER_GOTO_CC_MS_CL_MODE_H
1616

17-
#include <util/cout_message.h>
18-
17+
#include "cl_message_handler.h"
1918
#include "goto_cc_mode.h"
2019
#include "ms_cl_cmdline.h"
2120

@@ -35,7 +34,7 @@ class ms_cl_modet:public goto_cc_modet
3534

3635
protected:
3736
ms_cl_cmdlinet &cmdline;
38-
console_message_handlert message_handler;
37+
cl_message_handlert message_handler;
3938
};
4039

4140
#endif // CPROVER_GOTO_CC_MS_CL_MODE_H

src/goto-cc/ms_link_mode.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,10 @@ Date: July 2018
1414
#ifndef CPROVER_GOTO_CC_MS_LINK_MODE_H
1515
#define CPROVER_GOTO_CC_MS_LINK_MODE_H
1616

17+
#include "cl_message_handler.h"
1718
#include "compile.h"
1819
#include "goto_cc_mode.h"
1920

20-
#include <util/cout_message.h>
21-
2221
class ms_link_modet : public goto_cc_modet
2322
{
2423
public:
@@ -28,7 +27,7 @@ class ms_link_modet : public goto_cc_modet
2827
explicit ms_link_modet(goto_cc_cmdlinet &);
2928

3029
protected:
31-
console_message_handlert message_handler;
30+
cl_message_handlert message_handler;
3231
};
3332

3433
#endif // CPROVER_GOTO_CC_MS_LINK_MODE_H

0 commit comments

Comments
 (0)