167fc79f9SDavid Blaikie //===- unittests/AST/DeclTest.cpp --- Declaration tests -------------------===//
267fc79f9SDavid Blaikie //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
667fc79f9SDavid Blaikie //
767fc79f9SDavid Blaikie //===----------------------------------------------------------------------===//
867fc79f9SDavid Blaikie //
967fc79f9SDavid Blaikie // Unit tests for the ASTVector container.
1067fc79f9SDavid Blaikie //
1167fc79f9SDavid Blaikie //===----------------------------------------------------------------------===//
1267fc79f9SDavid Blaikie
1367fc79f9SDavid Blaikie #include "clang/AST/ASTVector.h"
140f6959f3SReid Kleckner #include "clang/AST/ASTContext.h"
15dff50cbeSWill Dietz #include "clang/Basic/Builtins.h"
160f6959f3SReid Kleckner #include "clang/Basic/FileManager.h"
170f6959f3SReid Kleckner #include "clang/Basic/SourceManager.h"
18dff50cbeSWill Dietz #include "gtest/gtest.h"
19dff50cbeSWill Dietz
2067fc79f9SDavid Blaikie using namespace clang;
2167fc79f9SDavid Blaikie
22dff50cbeSWill Dietz namespace clang {
23dff50cbeSWill Dietz namespace ast {
24dff50cbeSWill Dietz
25dff50cbeSWill Dietz namespace {
26dff50cbeSWill Dietz class ASTVectorTest : public ::testing::Test {
27dff50cbeSWill Dietz protected:
ASTVectorTest()28dff50cbeSWill Dietz ASTVectorTest()
29dff50cbeSWill Dietz : FileMgr(FileMgrOpts), DiagID(new DiagnosticIDs()),
30dff50cbeSWill Dietz Diags(DiagID, new DiagnosticOptions, new IgnoringDiagConsumer()),
31dff50cbeSWill Dietz SourceMgr(Diags, FileMgr), Idents(LangOpts, nullptr),
32*11b47c10SVassil Vassilev Ctxt(LangOpts, SourceMgr, Idents, Sels, Builtins, TU_Complete) {}
33dff50cbeSWill Dietz
34dff50cbeSWill Dietz FileSystemOptions FileMgrOpts;
35dff50cbeSWill Dietz FileManager FileMgr;
36dff50cbeSWill Dietz IntrusiveRefCntPtr<DiagnosticIDs> DiagID;
37dff50cbeSWill Dietz DiagnosticsEngine Diags;
38dff50cbeSWill Dietz SourceManager SourceMgr;
39dff50cbeSWill Dietz LangOptions LangOpts;
40dff50cbeSWill Dietz IdentifierTable Idents;
41dff50cbeSWill Dietz SelectorTable Sels;
42dff50cbeSWill Dietz Builtin::Context Builtins;
43dff50cbeSWill Dietz ASTContext Ctxt;
44dff50cbeSWill Dietz };
45dff50cbeSWill Dietz } // unnamed namespace
46dff50cbeSWill Dietz
TEST_F(ASTVectorTest,Compile)47dff50cbeSWill Dietz TEST_F(ASTVectorTest, Compile) {
4867fc79f9SDavid Blaikie ASTVector<int> V;
49dff50cbeSWill Dietz V.insert(Ctxt, V.begin(), 0);
5067fc79f9SDavid Blaikie }
51dff50cbeSWill Dietz
TEST_F(ASTVectorTest,InsertFill)52dff50cbeSWill Dietz TEST_F(ASTVectorTest, InsertFill) {
53dff50cbeSWill Dietz ASTVector<double> V;
54dff50cbeSWill Dietz
55dff50cbeSWill Dietz // Ensure returned iterator points to first of inserted elements
56dff50cbeSWill Dietz auto I = V.insert(Ctxt, V.begin(), 5, 1.0);
57dff50cbeSWill Dietz ASSERT_EQ(V.begin(), I);
58dff50cbeSWill Dietz
59dff50cbeSWill Dietz // Check non-empty case as well
60dff50cbeSWill Dietz I = V.insert(Ctxt, V.begin() + 1, 5, 1.0);
61dff50cbeSWill Dietz ASSERT_EQ(V.begin() + 1, I);
62dff50cbeSWill Dietz
63dff50cbeSWill Dietz // And insert-at-end
64dff50cbeSWill Dietz I = V.insert(Ctxt, V.end(), 5, 1.0);
65dff50cbeSWill Dietz ASSERT_EQ(V.end() - 5, I);
66dff50cbeSWill Dietz }
67dff50cbeSWill Dietz
TEST_F(ASTVectorTest,InsertEmpty)68dff50cbeSWill Dietz TEST_F(ASTVectorTest, InsertEmpty) {
69dff50cbeSWill Dietz ASTVector<double> V;
70dff50cbeSWill Dietz
71dff50cbeSWill Dietz // Ensure no pointer overflow when inserting empty range
72cc7f4aa2SAaron Ballman int Values[] = { 0, 1, 2, 3 };
73d71a5c72SAaron Ballman ArrayRef<int> IntVec(Values);
74dff50cbeSWill Dietz auto I = V.insert(Ctxt, V.begin(), IntVec.begin(), IntVec.begin());
75dff50cbeSWill Dietz ASSERT_EQ(V.begin(), I);
76dff50cbeSWill Dietz ASSERT_TRUE(V.empty());
77dff50cbeSWill Dietz
78dff50cbeSWill Dietz // Non-empty range
79dff50cbeSWill Dietz I = V.insert(Ctxt, V.begin(), IntVec.begin(), IntVec.end());
80dff50cbeSWill Dietz ASSERT_EQ(V.begin(), I);
81dff50cbeSWill Dietz
82dff50cbeSWill Dietz // Non-Empty Vector, empty range
83dff50cbeSWill Dietz I = V.insert(Ctxt, V.end(), IntVec.begin(), IntVec.begin());
84dff50cbeSWill Dietz ASSERT_EQ(V.begin() + IntVec.size(), I);
85dff50cbeSWill Dietz
86dff50cbeSWill Dietz // Non-Empty Vector, non-empty range
87dff50cbeSWill Dietz I = V.insert(Ctxt, V.end(), IntVec.begin(), IntVec.end());
88dff50cbeSWill Dietz ASSERT_EQ(V.begin() + IntVec.size(), I);
89dff50cbeSWill Dietz }
90dff50cbeSWill Dietz
91dff50cbeSWill Dietz } // end namespace ast
92dff50cbeSWill Dietz } // end namespace clang
93