1 //===- unittests/AST/DeclTest.cpp --- Declaration tests -------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Unit tests for the ASTVector container. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/Support/Compiler.h" 15 #include "clang/AST/ASTContext.h" 16 #include "clang/AST/ASTVector.h" 17 #include "clang/Basic/Builtins.h" 18 #include "gtest/gtest.h" 19 20 using namespace clang; 21 22 namespace clang { 23 namespace ast { 24 25 namespace { 26 class ASTVectorTest : public ::testing::Test { 27 protected: 28 ASTVectorTest() 29 : FileMgr(FileMgrOpts), DiagID(new DiagnosticIDs()), 30 Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()), 31 SourceMgr(Diags, FileMgr), Idents(LangOpts, nullptr), 32 Ctxt(LangOpts, SourceMgr, Idents, Sels, Builtins) {} 33 34 FileSystemOptions FileMgrOpts; 35 FileManager FileMgr; 36 IntrusiveRefCntPtr<DiagnosticIDs> DiagID; 37 DiagnosticsEngine Diags; 38 SourceManager SourceMgr; 39 LangOptions LangOpts; 40 IdentifierTable Idents; 41 SelectorTable Sels; 42 Builtin::Context Builtins; 43 ASTContext Ctxt; 44 }; 45 } // unnamed namespace 46 47 TEST_F(ASTVectorTest, Compile) { 48 ASTVector<int> V; 49 V.insert(Ctxt, V.begin(), 0); 50 } 51 52 TEST_F(ASTVectorTest, InsertFill) { 53 ASTVector<double> V; 54 55 // Ensure returned iterator points to first of inserted elements 56 auto I = V.insert(Ctxt, V.begin(), 5, 1.0); 57 ASSERT_EQ(V.begin(), I); 58 59 // Check non-empty case as well 60 I = V.insert(Ctxt, V.begin() + 1, 5, 1.0); 61 ASSERT_EQ(V.begin() + 1, I); 62 63 // And insert-at-end 64 I = V.insert(Ctxt, V.end(), 5, 1.0); 65 ASSERT_EQ(V.end() - 5, I); 66 } 67 68 TEST_F(ASTVectorTest, InsertEmpty) { 69 ASTVector<double> V; 70 71 // Ensure no pointer overflow when inserting empty range 72 int Values[] = { 0, 1, 2, 3 }; 73 ArrayRef<int> IntVec(Values); 74 auto I = V.insert(Ctxt, V.begin(), IntVec.begin(), IntVec.begin()); 75 ASSERT_EQ(V.begin(), I); 76 ASSERT_TRUE(V.empty()); 77 78 // Non-empty range 79 I = V.insert(Ctxt, V.begin(), IntVec.begin(), IntVec.end()); 80 ASSERT_EQ(V.begin(), I); 81 82 // Non-Empty Vector, empty range 83 I = V.insert(Ctxt, V.end(), IntVec.begin(), IntVec.begin()); 84 ASSERT_EQ(V.begin() + IntVec.size(), I); 85 86 // Non-Empty Vector, non-empty range 87 I = V.insert(Ctxt, V.end(), IntVec.begin(), IntVec.end()); 88 ASSERT_EQ(V.begin() + IntVec.size(), I); 89 } 90 91 } // end namespace ast 92 } // end namespace clang 93