123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498 |
- //===- unittests/Support/SourceMgrTest.cpp - SourceMgr tests --------------===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #include "llvm/Support/SourceMgr.h"
- #include "llvm/Support/MemoryBuffer.h"
- #include "llvm/Support/raw_ostream.h"
- #include "gtest/gtest.h"
- using namespace llvm;
- namespace {
- class SourceMgrTest : public testing::Test {
- public:
- SourceMgr SM;
- unsigned MainBufferID;
- std::string Output;
- void setMainBuffer(StringRef Text, StringRef BufferName) {
- std::unique_ptr<MemoryBuffer> MainBuffer =
- MemoryBuffer::getMemBuffer(Text, BufferName);
- MainBufferID = SM.AddNewSourceBuffer(std::move(MainBuffer), llvm::SMLoc());
- }
- SMLoc getLoc(unsigned Offset) {
- return SMLoc::getFromPointer(
- SM.getMemoryBuffer(MainBufferID)->getBufferStart() + Offset);
- }
- SMRange getRange(unsigned Offset, unsigned Length) {
- return SMRange(getLoc(Offset), getLoc(Offset + Length));
- }
- void printMessage(SMLoc Loc, SourceMgr::DiagKind Kind,
- const Twine &Msg, ArrayRef<SMRange> Ranges,
- ArrayRef<SMFixIt> FixIts) {
- raw_string_ostream OS(Output);
- SM.PrintMessage(OS, Loc, Kind, Msg, Ranges, FixIts);
- }
- };
- } // unnamed namespace
- TEST_F(SourceMgrTest, BasicError) {
- setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
- printMessage(getLoc(4), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:1:5: error: message\n"
- "aaa bbb\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, BasicWarning) {
- setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
- printMessage(getLoc(4), SourceMgr::DK_Warning, "message", None, None);
- EXPECT_EQ("file.in:1:5: warning: message\n"
- "aaa bbb\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, BasicRemark) {
- setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
- printMessage(getLoc(4), SourceMgr::DK_Remark, "message", None, None);
- EXPECT_EQ("file.in:1:5: remark: message\n"
- "aaa bbb\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, BasicNote) {
- setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
- printMessage(getLoc(4), SourceMgr::DK_Note, "message", None, None);
- EXPECT_EQ("file.in:1:5: note: message\n"
- "aaa bbb\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationAtEndOfLine) {
- setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
- printMessage(getLoc(6), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:1:7: error: message\n"
- "aaa bbb\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationAtNewline) {
- setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
- printMessage(getLoc(7), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:1:8: error: message\n"
- "aaa bbb\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationAtEmptyBuffer) {
- setMainBuffer("", "file.in");
- printMessage(getLoc(0), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:1:1: error: message\n"
- "\n"
- "^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationJustOnSoleNewline) {
- setMainBuffer("\n", "file.in");
- printMessage(getLoc(0), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:1:1: error: message\n"
- "\n"
- "^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationJustAfterSoleNewline) {
- setMainBuffer("\n", "file.in");
- printMessage(getLoc(1), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:2:1: error: message\n"
- "\n"
- "^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationJustAfterNonNewline) {
- setMainBuffer("123", "file.in");
- printMessage(getLoc(3), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:1:4: error: message\n"
- "123\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationOnFirstLineOfMultiline) {
- setMainBuffer("1234\n6789\n", "file.in");
- printMessage(getLoc(3), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:1:4: error: message\n"
- "1234\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationOnEOLOfFirstLineOfMultiline) {
- setMainBuffer("1234\n6789\n", "file.in");
- printMessage(getLoc(4), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:1:5: error: message\n"
- "1234\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationOnSecondLineOfMultiline) {
- setMainBuffer("1234\n6789\n", "file.in");
- printMessage(getLoc(5), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:2:1: error: message\n"
- "6789\n"
- "^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationOnSecondLineOfMultilineNoSecondEOL) {
- setMainBuffer("1234\n6789", "file.in");
- printMessage(getLoc(5), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:2:1: error: message\n"
- "6789\n"
- "^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationOnEOLOfSecondSecondLineOfMultiline) {
- setMainBuffer("1234\n6789\n", "file.in");
- printMessage(getLoc(9), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:2:5: error: message\n"
- "6789\n"
- " ^\n",
- Output);
- }
- #define STRING_LITERAL_253_BYTES \
- "1234567890\n1234567890\n" \
- "1234567890\n1234567890\n" \
- "1234567890\n1234567890\n" \
- "1234567890\n1234567890\n" \
- "1234567890\n1234567890\n" \
- "1234567890\n1234567890\n" \
- "1234567890\n1234567890\n" \
- "1234567890\n1234567890\n" \
- "1234567890\n1234567890\n" \
- "1234567890\n1234567890\n" \
- "1234567890\n1234567890\n" \
- "1234567890\n"
- //===----------------------------------------------------------------------===//
- // 255-byte buffer tests
- //===----------------------------------------------------------------------===//
- TEST_F(SourceMgrTest, LocationBeforeEndOf255ByteBuffer) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "12" // + 2 = 255 bytes
- , "file.in");
- printMessage(getLoc(253), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:1: error: message\n"
- "12\n"
- "^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationAtEndOf255ByteBuffer) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "12" // + 2 = 255 bytes
- , "file.in");
- printMessage(getLoc(254), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:2: error: message\n"
- "12\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationPastEndOf255ByteBuffer) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "12" // + 2 = 255 bytes
- , "file.in");
- printMessage(getLoc(255), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:3: error: message\n"
- "12\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationBeforeEndOf255ByteBufferEndingInNewline) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "1\n" // + 2 = 255 bytes
- , "file.in");
- printMessage(getLoc(253), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:1: error: message\n"
- "1\n"
- "^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationAtEndOf255ByteBufferEndingInNewline) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "1\n" // + 2 = 255 bytes
- , "file.in");
- printMessage(getLoc(254), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:2: error: message\n"
- "1\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationPastEndOf255ByteBufferEndingInNewline) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "1\n" // + 2 = 255 bytes
- , "file.in");
- printMessage(getLoc(255), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:25:1: error: message\n"
- "\n"
- "^\n",
- Output);
- }
- //===----------------------------------------------------------------------===//
- // 256-byte buffer tests
- //===----------------------------------------------------------------------===//
- TEST_F(SourceMgrTest, LocationBeforeEndOf256ByteBuffer) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "123" // + 3 = 256 bytes
- , "file.in");
- printMessage(getLoc(254), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:2: error: message\n"
- "123\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationAtEndOf256ByteBuffer) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "123" // + 3 = 256 bytes
- , "file.in");
- printMessage(getLoc(255), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:3: error: message\n"
- "123\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationPastEndOf256ByteBuffer) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "123" // + 3 = 256 bytes
- , "file.in");
- printMessage(getLoc(256), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:4: error: message\n"
- "123\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationBeforeEndOf256ByteBufferEndingInNewline) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "12\n" // + 3 = 256 bytes
- , "file.in");
- printMessage(getLoc(254), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:2: error: message\n"
- "12\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationAtEndOf256ByteBufferEndingInNewline) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "12\n" // + 3 = 256 bytes
- , "file.in");
- printMessage(getLoc(255), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:3: error: message\n"
- "12\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationPastEndOf256ByteBufferEndingInNewline) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "12\n" // + 3 = 256 bytes
- , "file.in");
- printMessage(getLoc(256), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:25:1: error: message\n"
- "\n"
- "^\n",
- Output);
- }
- //===----------------------------------------------------------------------===//
- // 257-byte buffer tests
- //===----------------------------------------------------------------------===//
- TEST_F(SourceMgrTest, LocationBeforeEndOf257ByteBuffer) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "1234" // + 4 = 257 bytes
- , "file.in");
- printMessage(getLoc(255), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:3: error: message\n"
- "1234\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationAtEndOf257ByteBuffer) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "1234" // + 4 = 257 bytes
- , "file.in");
- printMessage(getLoc(256), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:4: error: message\n"
- "1234\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationPastEndOf257ByteBuffer) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "1234" // + 4 = 257 bytes
- , "file.in");
- printMessage(getLoc(257), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:5: error: message\n"
- "1234\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationBeforeEndOf257ByteBufferEndingInNewline) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "123\n" // + 4 = 257 bytes
- , "file.in");
- printMessage(getLoc(255), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:3: error: message\n"
- "123\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationAtEndOf257ByteBufferEndingInNewline) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "123\n" // + 4 = 257 bytes
- , "file.in");
- printMessage(getLoc(256), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:24:4: error: message\n"
- "123\n"
- " ^\n",
- Output);
- }
- TEST_F(SourceMgrTest, LocationPastEndOf257ByteBufferEndingInNewline) {
- setMainBuffer(STRING_LITERAL_253_BYTES // first 253 bytes
- "123\n" // + 4 = 257 bytes
- , "file.in");
- printMessage(getLoc(257), SourceMgr::DK_Error, "message", None, None);
- EXPECT_EQ("file.in:25:1: error: message\n"
- "\n"
- "^\n",
- Output);
- }
- TEST_F(SourceMgrTest, BasicRange) {
- setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
- printMessage(getLoc(4), SourceMgr::DK_Error, "message", getRange(4, 3), None);
- EXPECT_EQ("file.in:1:5: error: message\n"
- "aaa bbb\n"
- " ^~~\n",
- Output);
- }
- TEST_F(SourceMgrTest, RangeWithTab) {
- setMainBuffer("aaa\tbbb\nccc ddd\n", "file.in");
- printMessage(getLoc(4), SourceMgr::DK_Error, "message", getRange(3, 3), None);
- EXPECT_EQ("file.in:1:5: error: message\n"
- "aaa bbb\n"
- " ~~~~~^~\n",
- Output);
- }
- TEST_F(SourceMgrTest, MultiLineRange) {
- setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
- printMessage(getLoc(4), SourceMgr::DK_Error, "message", getRange(4, 7), None);
- EXPECT_EQ("file.in:1:5: error: message\n"
- "aaa bbb\n"
- " ^~~\n",
- Output);
- }
- TEST_F(SourceMgrTest, MultipleRanges) {
- setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
- SMRange Ranges[] = { getRange(0, 3), getRange(4, 3) };
- printMessage(getLoc(4), SourceMgr::DK_Error, "message", Ranges, None);
- EXPECT_EQ("file.in:1:5: error: message\n"
- "aaa bbb\n"
- "~~~ ^~~\n",
- Output);
- }
- TEST_F(SourceMgrTest, OverlappingRanges) {
- setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
- SMRange Ranges[] = { getRange(0, 3), getRange(2, 4) };
- printMessage(getLoc(4), SourceMgr::DK_Error, "message", Ranges, None);
- EXPECT_EQ("file.in:1:5: error: message\n"
- "aaa bbb\n"
- "~~~~^~\n",
- Output);
- }
- TEST_F(SourceMgrTest, BasicFixit) {
- setMainBuffer("aaa bbb\nccc ddd\n", "file.in");
- printMessage(getLoc(4), SourceMgr::DK_Error, "message", None,
- makeArrayRef(SMFixIt(getRange(4, 3), "zzz")));
- EXPECT_EQ("file.in:1:5: error: message\n"
- "aaa bbb\n"
- " ^~~\n"
- " zzz\n",
- Output);
- }
- TEST_F(SourceMgrTest, FixitForTab) {
- setMainBuffer("aaa\tbbb\nccc ddd\n", "file.in");
- printMessage(getLoc(3), SourceMgr::DK_Error, "message", None,
- makeArrayRef(SMFixIt(getRange(3, 1), "zzz")));
- EXPECT_EQ("file.in:1:4: error: message\n"
- "aaa bbb\n"
- " ^^^^^\n"
- " zzz\n",
- Output);
- }
|