1 //===- unittests/Support/SourceMgrTest.cpp - SourceMgr tests --------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/Support/SourceMgr.h"
11 #include "llvm/Support/MemoryBuffer.h"
12 #include "llvm/Support/raw_ostream.h"
13 #include "gtest/gtest.h"
19 class SourceMgrTest
: public testing::Test
{
22 unsigned MainBufferID
;
25 void setMainBuffer(StringRef Text
, StringRef BufferName
) {
26 std::unique_ptr
<MemoryBuffer
> MainBuffer
=
27 MemoryBuffer::getMemBuffer(Text
, BufferName
);
28 MainBufferID
= SM
.AddNewSourceBuffer(std::move(MainBuffer
), llvm::SMLoc());
31 SMLoc
getLoc(unsigned Offset
) {
32 return SMLoc::getFromPointer(
33 SM
.getMemoryBuffer(MainBufferID
)->getBufferStart() + Offset
);
36 SMRange
getRange(unsigned Offset
, unsigned Length
) {
37 return SMRange(getLoc(Offset
), getLoc(Offset
+ Length
));
40 void printMessage(SMLoc Loc
, SourceMgr::DiagKind Kind
,
41 const Twine
&Msg
, ArrayRef
<SMRange
> Ranges
,
42 ArrayRef
<SMFixIt
> FixIts
) {
43 raw_string_ostream
OS(Output
);
44 SM
.PrintMessage(OS
, Loc
, Kind
, Msg
, Ranges
, FixIts
);
48 } // unnamed namespace
50 TEST_F(SourceMgrTest
, BasicError
) {
51 setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
52 printMessage(getLoc(4), SourceMgr::DK_Error
, "message", None
, None
);
54 EXPECT_EQ("file.in:1:5: error: message\n"
60 TEST_F(SourceMgrTest
, BasicWarning
) {
61 setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
62 printMessage(getLoc(4), SourceMgr::DK_Warning
, "message", None
, None
);
64 EXPECT_EQ("file.in:1:5: warning: message\n"
70 TEST_F(SourceMgrTest
, BasicRemark
) {
71 setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
72 printMessage(getLoc(4), SourceMgr::DK_Remark
, "message", None
, None
);
74 EXPECT_EQ("file.in:1:5: remark: message\n"
80 TEST_F(SourceMgrTest
, BasicNote
) {
81 setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
82 printMessage(getLoc(4), SourceMgr::DK_Note
, "message", None
, None
);
84 EXPECT_EQ("file.in:1:5: note: message\n"
90 TEST_F(SourceMgrTest
, LocationAtEndOfLine
) {
91 setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
92 printMessage(getLoc(6), SourceMgr::DK_Error
, "message", None
, None
);
94 EXPECT_EQ("file.in:1:7: error: message\n"
100 TEST_F(SourceMgrTest
, LocationAtNewline
) {
101 setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
102 printMessage(getLoc(7), SourceMgr::DK_Error
, "message", None
, None
);
104 EXPECT_EQ("file.in:1:8: error: message\n"
110 TEST_F(SourceMgrTest
, LocationAtEmptyBuffer
) {
111 setMainBuffer("", "file.in");
112 printMessage(getLoc(0), SourceMgr::DK_Error
, "message", None
, None
);
114 EXPECT_EQ("file.in:1:1: error: message\n"
120 TEST_F(SourceMgrTest
, LocationJustOnSoleNewline
) {
121 setMainBuffer("\n", "file.in");
122 printMessage(getLoc(0), SourceMgr::DK_Error
, "message", None
, None
);
124 EXPECT_EQ("file.in:1:1: error: message\n"
130 TEST_F(SourceMgrTest
, LocationJustAfterSoleNewline
) {
131 setMainBuffer("\n", "file.in");
132 printMessage(getLoc(1), SourceMgr::DK_Error
, "message", None
, None
);
134 EXPECT_EQ("file.in:2:1: error: message\n"
140 TEST_F(SourceMgrTest
, LocationJustAfterNonNewline
) {
141 setMainBuffer("123", "file.in");
142 printMessage(getLoc(3), SourceMgr::DK_Error
, "message", None
, None
);
144 EXPECT_EQ("file.in:1:4: error: message\n"
150 TEST_F(SourceMgrTest
, LocationOnFirstLineOfMultiline
) {
151 setMainBuffer("1234\n6789\n", "file.in");
152 printMessage(getLoc(3), SourceMgr::DK_Error
, "message", None
, None
);
154 EXPECT_EQ("file.in:1:4: error: message\n"
160 TEST_F(SourceMgrTest
, LocationOnEOLOfFirstLineOfMultiline
) {
161 setMainBuffer("1234\n6789\n", "file.in");
162 printMessage(getLoc(4), SourceMgr::DK_Error
, "message", None
, None
);
164 EXPECT_EQ("file.in:1:5: error: message\n"
170 TEST_F(SourceMgrTest
, LocationOnSecondLineOfMultiline
) {
171 setMainBuffer("1234\n6789\n", "file.in");
172 printMessage(getLoc(5), SourceMgr::DK_Error
, "message", None
, None
);
174 EXPECT_EQ("file.in:2:1: error: message\n"
180 TEST_F(SourceMgrTest
, LocationOnSecondLineOfMultilineNoSecondEOL
) {
181 setMainBuffer("1234\n6789", "file.in");
182 printMessage(getLoc(5), SourceMgr::DK_Error
, "message", None
, None
);
184 EXPECT_EQ("file.in:2:1: error: message\n"
190 TEST_F(SourceMgrTest
, LocationOnEOLOfSecondSecondLineOfMultiline
) {
191 setMainBuffer("1234\n6789\n", "file.in");
192 printMessage(getLoc(9), SourceMgr::DK_Error
, "message", None
, None
);
194 EXPECT_EQ("file.in:2:5: error: message\n"
200 #define STRING_LITERAL_253_BYTES \
201 "1234567890\n1234567890\n" \
202 "1234567890\n1234567890\n" \
203 "1234567890\n1234567890\n" \
204 "1234567890\n1234567890\n" \
205 "1234567890\n1234567890\n" \
206 "1234567890\n1234567890\n" \
207 "1234567890\n1234567890\n" \
208 "1234567890\n1234567890\n" \
209 "1234567890\n1234567890\n" \
210 "1234567890\n1234567890\n" \
211 "1234567890\n1234567890\n" \
214 //===----------------------------------------------------------------------===//
215 // 255-byte buffer tests
216 //===----------------------------------------------------------------------===//
218 TEST_F(SourceMgrTest
, LocationBeforeEndOf255ByteBuffer
) {
219 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
220 "12" // + 2 = 255 bytes
222 printMessage(getLoc(253), SourceMgr::DK_Error
, "message", None
, None
);
223 EXPECT_EQ("file.in:24:1: error: message\n"
229 TEST_F(SourceMgrTest
, LocationAtEndOf255ByteBuffer
) {
230 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
231 "12" // + 2 = 255 bytes
233 printMessage(getLoc(254), SourceMgr::DK_Error
, "message", None
, None
);
234 EXPECT_EQ("file.in:24:2: error: message\n"
240 TEST_F(SourceMgrTest
, LocationPastEndOf255ByteBuffer
) {
241 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
242 "12" // + 2 = 255 bytes
244 printMessage(getLoc(255), SourceMgr::DK_Error
, "message", None
, None
);
245 EXPECT_EQ("file.in:24:3: error: message\n"
251 TEST_F(SourceMgrTest
, LocationBeforeEndOf255ByteBufferEndingInNewline
) {
252 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
253 "1\n" // + 2 = 255 bytes
255 printMessage(getLoc(253), SourceMgr::DK_Error
, "message", None
, None
);
256 EXPECT_EQ("file.in:24:1: error: message\n"
262 TEST_F(SourceMgrTest
, LocationAtEndOf255ByteBufferEndingInNewline
) {
263 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
264 "1\n" // + 2 = 255 bytes
266 printMessage(getLoc(254), SourceMgr::DK_Error
, "message", None
, None
);
267 EXPECT_EQ("file.in:24:2: error: message\n"
273 TEST_F(SourceMgrTest
, LocationPastEndOf255ByteBufferEndingInNewline
) {
274 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
275 "1\n" // + 2 = 255 bytes
277 printMessage(getLoc(255), SourceMgr::DK_Error
, "message", None
, None
);
278 EXPECT_EQ("file.in:25:1: error: message\n"
284 //===----------------------------------------------------------------------===//
285 // 256-byte buffer tests
286 //===----------------------------------------------------------------------===//
288 TEST_F(SourceMgrTest
, LocationBeforeEndOf256ByteBuffer
) {
289 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
290 "123" // + 3 = 256 bytes
292 printMessage(getLoc(254), SourceMgr::DK_Error
, "message", None
, None
);
293 EXPECT_EQ("file.in:24:2: error: message\n"
299 TEST_F(SourceMgrTest
, LocationAtEndOf256ByteBuffer
) {
300 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
301 "123" // + 3 = 256 bytes
303 printMessage(getLoc(255), SourceMgr::DK_Error
, "message", None
, None
);
304 EXPECT_EQ("file.in:24:3: error: message\n"
310 TEST_F(SourceMgrTest
, LocationPastEndOf256ByteBuffer
) {
311 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
312 "123" // + 3 = 256 bytes
314 printMessage(getLoc(256), SourceMgr::DK_Error
, "message", None
, None
);
315 EXPECT_EQ("file.in:24:4: error: message\n"
321 TEST_F(SourceMgrTest
, LocationBeforeEndOf256ByteBufferEndingInNewline
) {
322 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
323 "12\n" // + 3 = 256 bytes
325 printMessage(getLoc(254), SourceMgr::DK_Error
, "message", None
, None
);
326 EXPECT_EQ("file.in:24:2: error: message\n"
332 TEST_F(SourceMgrTest
, LocationAtEndOf256ByteBufferEndingInNewline
) {
333 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
334 "12\n" // + 3 = 256 bytes
336 printMessage(getLoc(255), SourceMgr::DK_Error
, "message", None
, None
);
337 EXPECT_EQ("file.in:24:3: error: message\n"
343 TEST_F(SourceMgrTest
, LocationPastEndOf256ByteBufferEndingInNewline
) {
344 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
345 "12\n" // + 3 = 256 bytes
347 printMessage(getLoc(256), SourceMgr::DK_Error
, "message", None
, None
);
348 EXPECT_EQ("file.in:25:1: error: message\n"
354 //===----------------------------------------------------------------------===//
355 // 257-byte buffer tests
356 //===----------------------------------------------------------------------===//
358 TEST_F(SourceMgrTest
, LocationBeforeEndOf257ByteBuffer
) {
359 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
360 "1234" // + 4 = 257 bytes
362 printMessage(getLoc(255), SourceMgr::DK_Error
, "message", None
, None
);
363 EXPECT_EQ("file.in:24:3: error: message\n"
369 TEST_F(SourceMgrTest
, LocationAtEndOf257ByteBuffer
) {
370 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
371 "1234" // + 4 = 257 bytes
373 printMessage(getLoc(256), SourceMgr::DK_Error
, "message", None
, None
);
374 EXPECT_EQ("file.in:24:4: error: message\n"
380 TEST_F(SourceMgrTest
, LocationPastEndOf257ByteBuffer
) {
381 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
382 "1234" // + 4 = 257 bytes
384 printMessage(getLoc(257), SourceMgr::DK_Error
, "message", None
, None
);
385 EXPECT_EQ("file.in:24:5: error: message\n"
391 TEST_F(SourceMgrTest
, LocationBeforeEndOf257ByteBufferEndingInNewline
) {
392 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
393 "123\n" // + 4 = 257 bytes
395 printMessage(getLoc(255), SourceMgr::DK_Error
, "message", None
, None
);
396 EXPECT_EQ("file.in:24:3: error: message\n"
402 TEST_F(SourceMgrTest
, LocationAtEndOf257ByteBufferEndingInNewline
) {
403 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
404 "123\n" // + 4 = 257 bytes
406 printMessage(getLoc(256), SourceMgr::DK_Error
, "message", None
, None
);
407 EXPECT_EQ("file.in:24:4: error: message\n"
413 TEST_F(SourceMgrTest
, LocationPastEndOf257ByteBufferEndingInNewline
) {
414 setMainBuffer(STRING_LITERAL_253_BYTES
// first 253 bytes
415 "123\n" // + 4 = 257 bytes
417 printMessage(getLoc(257), SourceMgr::DK_Error
, "message", None
, None
);
418 EXPECT_EQ("file.in:25:1: error: message\n"
424 TEST_F(SourceMgrTest
, BasicRange
) {
425 setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
426 printMessage(getLoc(4), SourceMgr::DK_Error
, "message", getRange(4, 3), None
);
428 EXPECT_EQ("file.in:1:5: error: message\n"
434 TEST_F(SourceMgrTest
, RangeWithTab
) {
435 setMainBuffer("aaa\tbbb\nccc ddd\n", "file.in");
436 printMessage(getLoc(4), SourceMgr::DK_Error
, "message", getRange(3, 3), None
);
438 EXPECT_EQ("file.in:1:5: error: message\n"
444 TEST_F(SourceMgrTest
, MultiLineRange
) {
445 setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
446 printMessage(getLoc(4), SourceMgr::DK_Error
, "message", getRange(4, 7), None
);
448 EXPECT_EQ("file.in:1:5: error: message\n"
454 TEST_F(SourceMgrTest
, MultipleRanges
) {
455 setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
456 SMRange Ranges
[] = { getRange(0, 3), getRange(4, 3) };
457 printMessage(getLoc(4), SourceMgr::DK_Error
, "message", Ranges
, None
);
459 EXPECT_EQ("file.in:1:5: error: message\n"
465 TEST_F(SourceMgrTest
, OverlappingRanges
) {
466 setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
467 SMRange Ranges
[] = { getRange(0, 3), getRange(2, 4) };
468 printMessage(getLoc(4), SourceMgr::DK_Error
, "message", Ranges
, None
);
470 EXPECT_EQ("file.in:1:5: error: message\n"
476 TEST_F(SourceMgrTest
, BasicFixit
) {
477 setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
478 printMessage(getLoc(4), SourceMgr::DK_Error
, "message", None
,
479 makeArrayRef(SMFixIt(getRange(4, 3), "zzz")));
481 EXPECT_EQ("file.in:1:5: error: message\n"
488 TEST_F(SourceMgrTest
, FixitForTab
) {
489 setMainBuffer("aaa\tbbb\nccc ddd\n", "file.in");
490 printMessage(getLoc(3), SourceMgr::DK_Error
, "message", None
,
491 makeArrayRef(SMFixIt(getRange(3, 1), "zzz")));
493 EXPECT_EQ("file.in:1:4: error: message\n"