//===- unittests/AST/DeclTest.cpp --- Declaration tests -------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // Unit tests for the ASTVector container. // //===----------------------------------------------------------------------===// #include "llvm/Support/Compiler.h" #include "clang/AST/ASTContext.h" #include "clang/AST/ASTVector.h" #include "clang/Basic/Builtins.h" #include "gtest/gtest.h" using namespace clang; 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(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 int Values[] = { 0, 1, 2, 3 }; ArrayRef<int> IntVec(Values); 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