xref: /llvm-project/clang/unittests/AST/ASTVectorTest.cpp (revision 11b47c103a36371576711cae1f7527c26f78efb5)
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