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 20using namespace clang; 21 22namespace clang { 23namespace ast { 24 25namespace { 26class ASTVectorTest : public ::testing::Test { 27protected: 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 47TEST_F(ASTVectorTest, Compile) { 48 ASTVector<int> V; 49 V.insert(Ctxt, V.begin(), 0); 50} 51 52TEST_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 68TEST_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