1f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie//===- unittests/AST/DeclTest.cpp --- Declaration tests -------------------===//
2f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie//
3f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie//                     The LLVM Compiler Infrastructure
4f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie//
5f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie// This file is distributed under the University of Illinois Open Source
6f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie// License. See LICENSE.TXT for details.
7f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie//
8f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie//===----------------------------------------------------------------------===//
9f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie//
10f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie// Unit tests for the ASTVector container.
11f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie//
12f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie//===----------------------------------------------------------------------===//
13f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie
14f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie#include "llvm/Support/Compiler.h"
15f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie#include "clang/AST/ASTContext.h"
16f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie#include "clang/AST/ASTVector.h"
17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/Basic/Builtins.h"
18176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "gtest/gtest.h"
19f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie
20f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikieusing namespace clang;
21f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie
22176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace clang {
23176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace ast {
24176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
25176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace {
26176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesclass ASTVectorTest : public ::testing::Test {
27176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesprotected:
28176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ASTVectorTest()
29176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      : FileMgr(FileMgrOpts), DiagID(new DiagnosticIDs()),
30176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()),
31176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        SourceMgr(Diags, FileMgr), Idents(LangOpts, nullptr),
32176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        Ctxt(LangOpts, SourceMgr, Idents, Sels, Builtins) {}
33176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
34176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  FileSystemOptions FileMgrOpts;
35176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  FileManager FileMgr;
36176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
37176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  DiagnosticsEngine Diags;
38176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  SourceManager SourceMgr;
39176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  LangOptions LangOpts;
40176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  IdentifierTable Idents;
41176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  SelectorTable Sels;
42176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Builtin::Context Builtins;
43176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ASTContext Ctxt;
44176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines};
45176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} // unnamed namespace
46176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
47176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST_F(ASTVectorTest, Compile) {
48f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie  ASTVector<int> V;
49176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  V.insert(Ctxt, V.begin(), 0);
50176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
51176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST_F(ASTVectorTest, InsertFill) {
53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ASTVector<double> V;
54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Ensure returned iterator points to first of inserted elements
56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  auto I = V.insert(Ctxt, V.begin(), 5, 1.0);
57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ASSERT_EQ(V.begin(), I);
58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Check non-empty case as well
60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  I = V.insert(Ctxt, V.begin() + 1, 5, 1.0);
61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ASSERT_EQ(V.begin() + 1, I);
62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // And insert-at-end
64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  I = V.insert(Ctxt, V.end(), 5, 1.0);
65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ASSERT_EQ(V.end() - 5, I);
66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
67176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesTEST_F(ASTVectorTest, InsertEmpty) {
69176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ASTVector<double> V;
70176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
71176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Ensure no pointer overflow when inserting empty range
72176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int Values[] = { 0, 1, 2, 3 };
73176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ArrayRef<int> IntVec(Values);
74176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  auto I = V.insert(Ctxt, V.begin(), IntVec.begin(), IntVec.begin());
75176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ASSERT_EQ(V.begin(), I);
76176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ASSERT_TRUE(V.empty());
77176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Non-empty range
79176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  I = V.insert(Ctxt, V.begin(), IntVec.begin(), IntVec.end());
80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ASSERT_EQ(V.begin(), I);
81176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
82176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Non-Empty Vector, empty range
83176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  I = V.insert(Ctxt, V.end(), IntVec.begin(), IntVec.begin());
84176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ASSERT_EQ(V.begin() + IntVec.size(), I);
85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
86176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Non-Empty Vector, non-empty range
87176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  I = V.insert(Ctxt, V.end(), IntVec.begin(), IntVec.end());
88176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  ASSERT_EQ(V.begin() + IntVec.size(), I);
89f475bf83a45435a211edb4e0ef6ac3481ce7b3feDavid Blaikie}
90176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
91176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} // end namespace ast
92176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} // end namespace clang
93