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