diff options
| author | Will Dietz <wdietz2@illinois.edu> | 2014-08-25 16:09:51 +0000 |
|---|---|---|
| committer | Will Dietz <wdietz2@illinois.edu> | 2014-08-25 16:09:51 +0000 |
| commit | dff50cbe2663d07b2f275f34c95dfc0840d0a2a2 (patch) | |
| tree | 2050f340021d268a1ab1a942cc95aff1f290e0c1 /clang/unittests | |
| parent | d08f0d9c057dfe32ccfcf2a9f8dcc6893f292d6c (diff) | |
| download | bcm5719-llvm-dff50cbe2663d07b2f275f34c95dfc0840d0a2a2.tar.gz bcm5719-llvm-dff50cbe2663d07b2f275f34c95dfc0840d0a2a2.zip | |
ASTVector: Fix return value of various insert() methods.
Error caught using -fsanitize=pointer-overflow.
Expand ASTVectorTest to verify basic behavior,
test fails without functionality in this patch.
llvm-svn: 216385
Diffstat (limited to 'clang/unittests')
| -rw-r--r-- | clang/unittests/AST/ASTVectorTest.cpp | 76 |
1 files changed, 73 insertions, 3 deletions
diff --git a/clang/unittests/AST/ASTVectorTest.cpp b/clang/unittests/AST/ASTVectorTest.cpp index ce6d0a07ce8..3a8e8e89b6e 100644 --- a/clang/unittests/AST/ASTVectorTest.cpp +++ b/clang/unittests/AST/ASTVectorTest.cpp @@ -14,11 +14,81 @@ #include "llvm/Support/Compiler.h" #include "clang/AST/ASTContext.h" #include "clang/AST/ASTVector.h" +#include "clang/Basic/Builtins.h" + +#include "gtest/gtest.h" + +#include <vector> using namespace clang; -LLVM_ATTRIBUTE_UNUSED void CompileTest() { - ASTContext *C = nullptr; +namespace clang { +namespace ast { + +namespace { +class ASTVectorTest : public ::testing::Test { +protected: + ASTVectorTest() + : FileMgr(FileMgrOpts), DiagID(new DiagnosticIDs()), + Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()), + SourceMgr(Diags, FileMgr), Idents(LangOpts, nullptr), + Ctxt(LangOpts, SourceMgr, Idents, Sels, Builtins) {} + + FileSystemOptions FileMgrOpts; + FileManager FileMgr; + IntrusiveRefCntPtr<DiagnosticIDs> DiagID; + DiagnosticsEngine Diags; + SourceManager SourceMgr; + LangOptions LangOpts; + IdentifierTable Idents; + SelectorTable Sels; + Builtin::Context Builtins; + ASTContext Ctxt; +}; +} // unnamed namespace + +TEST_F(ASTVectorTest, Compile) { ASTVector<int> V; - V.insert(*C, V.begin(), 0); + V.insert(Ctxt, V.begin(), 0); } + +TEST_F(ASTVectorTest, InsertFill) { + ASTVector<double> V; + + // Ensure returned iterator points to first of inserted elements + auto I = V.insert(Ctxt, V.begin(), 5, 1.0); + ASSERT_EQ(V.begin(), I); + + // Check non-empty case as well + I = V.insert(Ctxt, V.begin() + 1, 5, 1.0); + ASSERT_EQ(V.begin() + 1, I); + + // And insert-at-end + I = V.insert(Ctxt, V.end(), 5, 1.0); + ASSERT_EQ(V.end() - 5, I); +} + +TEST_F(ASTVectorTest, InsertEmpty) { + ASTVector<double> V; + + // Ensure no pointer overflow when inserting empty range + std::vector<int> IntVec{0, 1, 2, 3}; + auto I = V.insert(Ctxt, V.begin(), IntVec.begin(), IntVec.begin()); + ASSERT_EQ(V.begin(), I); + ASSERT_TRUE(V.empty()); + + // Non-empty range + I = V.insert(Ctxt, V.begin(), IntVec.begin(), IntVec.end()); + ASSERT_EQ(V.begin(), I); + + // Non-Empty Vector, empty range + I = V.insert(Ctxt, V.end(), IntVec.begin(), IntVec.begin()); + ASSERT_EQ(V.begin() + IntVec.size(), I); + + // Non-Empty Vector, non-empty range + I = V.insert(Ctxt, V.end(), IntVec.begin(), IntVec.end()); + ASSERT_EQ(V.begin() + IntVec.size(), I); +} + +} // end namespace ast +} // end namespace clang |

