diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Basic/SourceManager.cpp | 5 | ||||
| -rw-r--r-- | clang/test/Lexer/newline-eof.c | 4 | ||||
| -rw-r--r-- | clang/unittests/Basic/SourceManagerTest.cpp | 48 | 
3 files changed, 55 insertions, 2 deletions
diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp index 66b06ef6ab1..24bd51928c9 100644 --- a/clang/lib/Basic/SourceManager.cpp +++ b/clang/lib/Basic/SourceManager.cpp @@ -1015,9 +1015,10 @@ unsigned SourceManager::getColumnNumber(FileID FID, unsigned FilePos,    if (MyInvalid)      return 1; -  if (FilePos >= MemBuf->getBufferSize()) { +  // It is okay to request a position just past the end of the buffer. +  if (FilePos > MemBuf->getBufferSize()) {      if (Invalid) -      *Invalid = MyInvalid; +      *Invalid = true;      return 1;    } diff --git a/clang/test/Lexer/newline-eof.c b/clang/test/Lexer/newline-eof.c index 825a266a0a3..a4a18835cf5 100644 --- a/clang/test/Lexer/newline-eof.c +++ b/clang/test/Lexer/newline-eof.c @@ -1,5 +1,9 @@  // RUN: %clang_cc1 -fsyntax-only -Wnewline-eof -verify %s +// RUN: %clang_cc1 -fsyntax-only -Wnewline-eof %s 2>&1 | FileCheck %s  // rdar://9133072 +// Make sure the diagnostic shows up properly at the end of the last line. +// CHECK: newline-eof.c:9:63 +  // The following line isn't terminated, don't fix it.  void foo() {} // expected-warning{{no newline at end of file}}
\ No newline at end of file diff --git a/clang/unittests/Basic/SourceManagerTest.cpp b/clang/unittests/Basic/SourceManagerTest.cpp index 429b58d7ea4..de3b72318cc 100644 --- a/clang/unittests/Basic/SourceManagerTest.cpp +++ b/clang/unittests/Basic/SourceManagerTest.cpp @@ -107,6 +107,54 @@ TEST_F(SourceManagerTest, isBeforeInTranslationUnit) {    EXPECT_TRUE(SourceMgr.isBeforeInTranslationUnit(idLoc, macroExpEndLoc));  } +TEST_F(SourceManagerTest, getColumnNumber) { +  const char *Source = +    "int x;\n" +    "int y;"; + +  MemoryBuffer *Buf = MemoryBuffer::getMemBuffer(Source); +  FileID MainFileID = SourceMgr.createMainFileIDForMemBuffer(Buf); + +  bool Invalid; + +  Invalid = false; +  EXPECT_EQ(1U, SourceMgr.getColumnNumber(MainFileID, 0, &Invalid)); +  EXPECT_TRUE(!Invalid); + +  Invalid = false; +  EXPECT_EQ(5U, SourceMgr.getColumnNumber(MainFileID, 4, &Invalid)); +  EXPECT_TRUE(!Invalid); + +  Invalid = false; +  EXPECT_EQ(1U, SourceMgr.getColumnNumber(MainFileID, 7, &Invalid)); +  EXPECT_TRUE(!Invalid); + +  Invalid = false; +  EXPECT_EQ(5U, SourceMgr.getColumnNumber(MainFileID, 11, &Invalid)); +  EXPECT_TRUE(!Invalid); + +  Invalid = false; +  EXPECT_EQ(7U, SourceMgr.getColumnNumber(MainFileID, strlen(Source), +                                         &Invalid)); +  EXPECT_TRUE(!Invalid); + +  Invalid = false; +  SourceMgr.getColumnNumber(MainFileID, strlen(Source)+1, &Invalid); +  EXPECT_TRUE(Invalid); + +  // Test invalid files +  Invalid = false; +  SourceMgr.getColumnNumber(FileID(), 0, &Invalid); +  EXPECT_TRUE(Invalid); + +  Invalid = false; +  SourceMgr.getColumnNumber(FileID(), 1, &Invalid); +  EXPECT_TRUE(Invalid); + +  // Test with no invalid flag. +  EXPECT_EQ(1U, SourceMgr.getColumnNumber(MainFileID, 0, NULL)); +} +  #if defined(LLVM_ON_UNIX)  TEST_F(SourceManagerTest, getMacroArgExpandedLocation) {  | 

