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