1e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor//===--- NestedNameSpecifier.cpp - C++ nested name specifiers -----*- C++ -*-=//
2e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor//
3e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor//                     The LLVM Compiler Infrastructure
4e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor//
5e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor// This file is distributed under the University of Illinois Open Source
6e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor// License. See LICENSE.TXT for details.
7e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor//
8e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor//===----------------------------------------------------------------------===//
9e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor//
10e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor//  This file defines the NestedNameSpecifier class, which represents
11e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor//  a C++ nested-name-specifier.
12e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor//
13e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor//===----------------------------------------------------------------------===//
14e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor#include "clang/AST/NestedNameSpecifier.h"
15e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor#include "clang/AST/ASTContext.h"
16e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor#include "clang/AST/Decl.h"
1714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor#include "clang/AST/DeclCXX.h"
18d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor#include "clang/AST/PrettyPrinter.h"
19e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor#include "clang/AST/Type.h"
20c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor#include "clang/AST/TypeLoc.h"
2147467041f629aa287a988be3073e230de3e56a3cRichard Smith#include "llvm/Support/AlignOf.h"
22bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor#include "llvm/Support/raw_ostream.h"
23ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor#include <cassert>
24bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor
25e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregorusing namespace clang;
26e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor
27ab452ba8323d1985e08bade2bced588cddf2cc28Douglas GregorNestedNameSpecifier *
284ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNestedNameSpecifier::FindOrInsert(const ASTContext &Context,
29ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor                                  const NestedNameSpecifier &Mockup) {
30ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  llvm::FoldingSetNodeID ID;
31ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  Mockup.Profile(ID);
32ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void *InsertPos = nullptr;
341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  NestedNameSpecifier *NNS
35ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    = Context.NestedNameSpecifiers.FindNodeOrInsertPos(ID, InsertPos);
36ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  if (!NNS) {
3747467041f629aa287a988be3073e230de3e56a3cRichard Smith    NNS = new (Context, llvm::alignOf<NestedNameSpecifier>())
3847467041f629aa287a988be3073e230de3e56a3cRichard Smith        NestedNameSpecifier(Mockup);
39ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    Context.NestedNameSpecifiers.InsertNode(NNS, InsertPos);
40ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  }
41ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
42ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  return NNS;
43ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor}
44ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
45ab452ba8323d1985e08bade2bced588cddf2cc28Douglas GregorNestedNameSpecifier *
464ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNestedNameSpecifier::Create(const ASTContext &Context,
474ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                            NestedNameSpecifier *Prefix, IdentifierInfo *II) {
48ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  assert(II && "Identifier cannot be NULL");
493b6afbb99a1c44b4076f8e15fb7311405941b306Douglas Gregor  assert((!Prefix || Prefix->isDependent()) && "Prefix must be dependent");
50ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
51ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  NestedNameSpecifier Mockup;
521734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  Mockup.Prefix.setPointer(Prefix);
5314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  Mockup.Prefix.setInt(StoredIdentifier);
541734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  Mockup.Specifier = II;
55ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  return FindOrInsert(Context, Mockup);
56ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor}
57ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
58ab452ba8323d1985e08bade2bced588cddf2cc28Douglas GregorNestedNameSpecifier *
594ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNestedNameSpecifier::Create(const ASTContext &Context,
608441fffda14c5d9ac704f24173fcb117d4999a8eDmitri Gribenko                            NestedNameSpecifier *Prefix,
618441fffda14c5d9ac704f24173fcb117d4999a8eDmitri Gribenko                            const NamespaceDecl *NS) {
62ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  assert(NS && "Namespace cannot be NULL");
631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  assert((!Prefix ||
646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          (Prefix->getAsType() == nullptr &&
656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines           Prefix->getAsIdentifier() == nullptr)) &&
66ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor         "Broken nested name specifier");
67ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  NestedNameSpecifier Mockup;
681734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  Mockup.Prefix.setPointer(Prefix);
69176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Mockup.Prefix.setInt(StoredDecl);
708441fffda14c5d9ac704f24173fcb117d4999a8eDmitri Gribenko  Mockup.Specifier = const_cast<NamespaceDecl *>(NS);
71ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  return FindOrInsert(Context, Mockup);
72ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor}
73ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
74ab452ba8323d1985e08bade2bced588cddf2cc28Douglas GregorNestedNameSpecifier *
754ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNestedNameSpecifier::Create(const ASTContext &Context,
7614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                            NestedNameSpecifier *Prefix,
7714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                            NamespaceAliasDecl *Alias) {
7814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  assert(Alias && "Namespace alias cannot be NULL");
7914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  assert((!Prefix ||
806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          (Prefix->getAsType() == nullptr &&
816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines           Prefix->getAsIdentifier() == nullptr)) &&
8214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor         "Broken nested name specifier");
8314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  NestedNameSpecifier Mockup;
8414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  Mockup.Prefix.setPointer(Prefix);
85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Mockup.Prefix.setInt(StoredDecl);
8614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  Mockup.Specifier = Alias;
8714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  return FindOrInsert(Context, Mockup);
8814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor}
8914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
9014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas GregorNestedNameSpecifier *
9114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas GregorNestedNameSpecifier::Create(const ASTContext &Context,
924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                            NestedNameSpecifier *Prefix,
93f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall                            bool Template, const Type *T) {
94ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  assert(T && "Type cannot be NULL");
95ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  NestedNameSpecifier Mockup;
961734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  Mockup.Prefix.setPointer(Prefix);
9714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  Mockup.Prefix.setInt(Template? StoredTypeSpecWithTemplate : StoredTypeSpec);
98f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall  Mockup.Specifier = const_cast<Type*>(T);
99ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  return FindOrInsert(Context, Mockup);
100ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor}
1012700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
1022700dcde044893642b9b77638e052aa90be7cd51Douglas GregorNestedNameSpecifier *
1034ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNestedNameSpecifier::Create(const ASTContext &Context, IdentifierInfo *II) {
1042700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  assert(II && "Identifier cannot be NULL");
1052700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  NestedNameSpecifier Mockup;
1066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Mockup.Prefix.setPointer(nullptr);
10714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  Mockup.Prefix.setInt(StoredIdentifier);
1082700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  Mockup.Specifier = II;
1092700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor  return FindOrInsert(Context, Mockup);
1102700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor}
1112700dcde044893642b9b77638e052aa90be7cd51Douglas Gregor
1124ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNestedNameSpecifier *
1134ba2a17694148e16eaa8d3917f657ffcd3667be4Jay FoadNestedNameSpecifier::GlobalSpecifier(const ASTContext &Context) {
114ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  if (!Context.GlobalNestedNameSpecifier)
11547467041f629aa287a988be3073e230de3e56a3cRichard Smith    Context.GlobalNestedNameSpecifier =
11647467041f629aa287a988be3073e230de3e56a3cRichard Smith        new (Context, llvm::alignOf<NestedNameSpecifier>())
11747467041f629aa287a988be3073e230de3e56a3cRichard Smith            NestedNameSpecifier();
118ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  return Context.GlobalNestedNameSpecifier;
119ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor}
120ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
121176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesNestedNameSpecifier *
122176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesNestedNameSpecifier::SuperSpecifier(const ASTContext &Context,
123176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                    CXXRecordDecl *RD) {
124176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  NestedNameSpecifier Mockup;
125176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Mockup.Prefix.setPointer(nullptr);
126176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Mockup.Prefix.setInt(StoredDecl);
127176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Mockup.Specifier = RD;
128176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return FindOrInsert(Context, Mockup);
129176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
130176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
13114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas GregorNestedNameSpecifier::SpecifierKind NestedNameSpecifier::getKind() const {
1326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!Specifier)
13314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return Global;
13414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
13514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  switch (Prefix.getInt()) {
13614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case StoredIdentifier:
13714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return Identifier;
13814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
139176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case StoredDecl: {
140176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    NamedDecl *ND = static_cast<NamedDecl *>(Specifier);
141176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    if (isa<CXXRecordDecl>(ND))
142176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      return Super;
143176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return isa<NamespaceDecl>(ND) ? Namespace : NamespaceAlias;
144176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
14514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
14614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case StoredTypeSpec:
14714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return TypeSpec;
14814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
14914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case StoredTypeSpecWithTemplate:
15014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return TypeSpecWithTemplate;
15114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  }
15214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
1533026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid NNS Kind!");
15414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor}
15514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
156176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief Retrieve the namespace stored in this nested name specifier.
15714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas GregorNamespaceDecl *NestedNameSpecifier::getAsNamespace() const {
158176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines	if (Prefix.getInt() == StoredDecl)
15914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return dyn_cast<NamespaceDecl>(static_cast<NamedDecl *>(Specifier));
16014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
1616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
16214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor}
16314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
164176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief Retrieve the namespace alias stored in this nested name specifier.
16514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas GregorNamespaceAliasDecl *NestedNameSpecifier::getAsNamespaceAlias() const {
166176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines	if (Prefix.getInt() == StoredDecl)
16714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return dyn_cast<NamespaceAliasDecl>(static_cast<NamedDecl *>(Specifier));
16814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
1696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
17014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor}
17114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
172176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/// \brief Retrieve the record declaration stored in this nested name specifier.
173176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesCXXRecordDecl *NestedNameSpecifier::getAsRecordDecl() const {
174176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  if (Prefix.getInt() == StoredDecl)
175176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return dyn_cast<CXXRecordDecl>(static_cast<NamedDecl *>(Specifier));
176176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
177176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  return nullptr;
178176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
17914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
180ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor/// \brief Whether this nested name specifier refers to a dependent
181ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor/// type or not.
182ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregorbool NestedNameSpecifier::isDependent() const {
183ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  switch (getKind()) {
184ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case Identifier:
185ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    // Identifier specifiers always represent dependent types
186ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    return true;
187ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
188ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case Namespace:
18914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case NamespaceAlias:
190ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case Global:
191ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    return false;
192ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
193176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case Super: {
194176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    CXXRecordDecl *RD = static_cast<CXXRecordDecl *>(Specifier);
195176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    for (const auto &Base : RD->bases())
196176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      if (Base.getType()->isDependentType())
197176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines        return true;
198176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
199176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    return false;
200176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
201176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
202ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case TypeSpec:
203ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case TypeSpecWithTemplate:
204ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    return getAsType()->isDependentType();
205bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor  }
206ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
2073026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid NNS Kind!");
208ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor}
209ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
210561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor/// \brief Whether this nested name specifier refers to a dependent
211561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor/// type or not.
212561f81243f665cf2001caadc45df505f826b72d6Douglas Gregorbool NestedNameSpecifier::isInstantiationDependent() const {
213561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  switch (getKind()) {
214561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Identifier:
215561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    // Identifier specifiers always represent dependent types
216561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return true;
217561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
218561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Namespace:
219561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case NamespaceAlias:
220561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Global:
221176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case Super:
222561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return false;
223176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
224561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case TypeSpec:
225561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case TypeSpecWithTemplate:
226561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return getAsType()->isInstantiationDependentType();
227561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  }
2283026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
2293026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid NNS Kind!");
230561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor}
231561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
232d0937224f383c7cc72c947119380f9713a070c73Douglas Gregorbool NestedNameSpecifier::containsUnexpandedParameterPack() const {
233d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  switch (getKind()) {
234d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Identifier:
235d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    return getPrefix() && getPrefix()->containsUnexpandedParameterPack();
236d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
237d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Namespace:
23814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case NamespaceAlias:
239d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Global:
240176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case Super:
241d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    return false;
242d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
243d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case TypeSpec:
244d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case TypeSpecWithTemplate:
245d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    return getAsType()->containsUnexpandedParameterPack();
246d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  }
247d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
2483026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid NNS Kind!");
249d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor}
250d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
251ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor/// \brief Print this nested name specifier to the given output
252ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor/// stream.
2531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
2545f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerNestedNameSpecifier::print(raw_ostream &OS,
255d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                           const PrintingPolicy &Policy) const {
2561734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  if (getPrefix())
257d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    getPrefix()->print(OS, Policy);
258ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
259ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  switch (getKind()) {
260ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case Identifier:
261ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    OS << getAsIdentifier()->getName();
262ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    break;
263ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
264ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case Namespace:
26525270b6e6a8416b7532cfe552b41794418ea19b1Douglas Gregor    if (getAsNamespace()->isAnonymousNamespace())
26625270b6e6a8416b7532cfe552b41794418ea19b1Douglas Gregor      return;
26725270b6e6a8416b7532cfe552b41794418ea19b1Douglas Gregor
26814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    OS << getAsNamespace()->getName();
26914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    break;
27014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
27114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case NamespaceAlias:
27214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    OS << getAsNamespaceAlias()->getName();
273ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    break;
274ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
275ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case Global:
276ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    break;
277ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
278176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case Super:
279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    OS << "__super";
280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    break;
281176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
282ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case TypeSpecWithTemplate:
283ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    OS << "template ";
284ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    // Fall through to print the type.
285ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
286ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case TypeSpec: {
287f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    const Type *T = getAsType();
288ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
289d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    PrintingPolicy InnerPolicy(Policy);
2902191b20bfb31fc0e22a158f6b4204cd0b7dbd0fdJohn McCall    InnerPolicy.SuppressScope = true;
2911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
292dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    // Nested-name-specifiers are intended to contain minimally-qualified
293465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    // types. An actual ElaboratedType will not occur, since we'll store
294dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    // just the type that is referred to in the nested-name-specifier (e.g.,
295dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    // a TypedefType, TagType, etc.). However, when we are dealing with
2961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // dependent template-id types (e.g., Outer<T>::template Inner<U>),
297dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    // the type requires its own nested-name-specifier for uniqueness, so we
298dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    // suppress that nested-name-specifier during printing.
299465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    assert(!isa<ElaboratedType>(T) &&
300465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara           "Elaborated type in nested-name-specifier");
301dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    if (const TemplateSpecializationType *SpecType
302dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor          = dyn_cast<TemplateSpecializationType>(T)) {
3031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // Print the template name without its corresponding
304dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor      // nested-name-specifier.
305dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor      SpecType->getTemplateName().print(OS, InnerPolicy, true);
3061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
307dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor      // Print the template argument list.
3085eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer      TemplateSpecializationType::PrintTemplateArgumentList(
3095eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer          OS, SpecType->getArgs(), SpecType->getNumArgs(), InnerPolicy);
310dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    } else {
311dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor      // Print the type normally
3125eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer      QualType(T, 0).print(OS, InnerPolicy);
313dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    }
314ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    break;
315ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  }
316ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  }
317ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
318ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  OS << "::";
319ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor}
320ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
321e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattnervoid NestedNameSpecifier::dump(const LangOptions &LO) {
322e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  print(llvm::errs(), PrintingPolicy(LO));
323d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor}
324c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
325c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregorunsigned
326c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas GregorNestedNameSpecifierLoc::getLocalDataLength(NestedNameSpecifier *Qualifier) {
327c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  assert(Qualifier && "Expected a non-NULL qualifier");
328c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
329c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  // Location of the trailing '::'.
330c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  unsigned Length = sizeof(unsigned);
331c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
332c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  switch (Qualifier->getKind()) {
333c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::Global:
334c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    // Nothing more to add.
335c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    break;
336c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
337c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::Identifier:
338c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::Namespace:
339c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::NamespaceAlias:
340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case NestedNameSpecifier::Super:
341c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    // The location of the identifier or namespace name.
342c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    Length += sizeof(unsigned);
343c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    break;
344c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
345c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
346c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::TypeSpec:
347c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    // The "void*" that points at the TypeLoc data.
348c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    // Note: the 'template' keyword is part of the TypeLoc.
349c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    Length += sizeof(void *);
350c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    break;
351c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  }
352c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
353c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  return Length;
354c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor}
355c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
356c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregorunsigned
357c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas GregorNestedNameSpecifierLoc::getDataLength(NestedNameSpecifier *Qualifier) {
358c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  unsigned Length = 0;
359c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  for (; Qualifier; Qualifier = Qualifier->getPrefix())
360c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    Length += getLocalDataLength(Qualifier);
361c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  return Length;
362c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor}
363c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
364c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregornamespace {
365c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  /// \brief Load a (possibly unaligned) source location from a given address
366c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  /// and offset.
367c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  SourceLocation LoadSourceLocation(void *Data, unsigned Offset) {
368c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    unsigned Raw;
369c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    memcpy(&Raw, static_cast<char *>(Data) + Offset, sizeof(unsigned));
370c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    return SourceLocation::getFromRawEncoding(Raw);
371c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  }
372c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
373c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  /// \brief Load a (possibly unaligned) pointer from a given address and
374c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  /// offset.
375c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  void *LoadPointer(void *Data, unsigned Offset) {
376c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    void *Result;
377c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    memcpy(&Result, static_cast<char *>(Data) + Offset, sizeof(void*));
378c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    return Result;
379c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  }
380c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor}
381c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
382dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas GregorSourceRange NestedNameSpecifierLoc::getSourceRange() const {
383db9924191092b4d426cc066637d81698211846aaDouglas Gregor  if (!Qualifier)
384db9924191092b4d426cc066637d81698211846aaDouglas Gregor    return SourceRange();
385db9924191092b4d426cc066637d81698211846aaDouglas Gregor
386c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  NestedNameSpecifierLoc First = *this;
387db9924191092b4d426cc066637d81698211846aaDouglas Gregor  while (NestedNameSpecifierLoc Prefix = First.getPrefix())
388c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    First = Prefix;
389c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
390c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  return SourceRange(First.getLocalSourceRange().getBegin(),
391c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor                     getLocalSourceRange().getEnd());
392c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor}
393c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
394dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas GregorSourceRange NestedNameSpecifierLoc::getLocalSourceRange() const {
395db9924191092b4d426cc066637d81698211846aaDouglas Gregor  if (!Qualifier)
396db9924191092b4d426cc066637d81698211846aaDouglas Gregor    return SourceRange();
397db9924191092b4d426cc066637d81698211846aaDouglas Gregor
398c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  unsigned Offset = getDataLength(Qualifier->getPrefix());
399c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  switch (Qualifier->getKind()) {
400c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::Global:
401c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    return LoadSourceLocation(Data, Offset);
402c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
403c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::Identifier:
404c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::Namespace:
405c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::NamespaceAlias:
406176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  case NestedNameSpecifier::Super:
407c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    return SourceRange(LoadSourceLocation(Data, Offset),
408c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor                       LoadSourceLocation(Data, Offset + sizeof(unsigned)));
409c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
410c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
411c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
412c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    // The "void*" that points at the TypeLoc data.
413c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    // Note: the 'template' keyword is part of the TypeLoc.
414c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    void *TypeData = LoadPointer(Data, Offset);
415c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    TypeLoc TL(Qualifier->getAsType(), TypeData);
416c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    return SourceRange(TL.getBeginLoc(),
417c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor                       LoadSourceLocation(Data, Offset + sizeof(void*)));
418c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  }
419c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  }
4203026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
4213026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid NNS Kind!");
422c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor}
423dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
424dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas GregorTypeLoc NestedNameSpecifierLoc::getTypeLoc() const {
425dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  assert((Qualifier->getKind() == NestedNameSpecifier::TypeSpec ||
426dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor          Qualifier->getKind() == NestedNameSpecifier::TypeSpecWithTemplate) &&
427dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor         "Nested-name-specifier location is not a type");
428dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
429dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  // The "void*" that points at the TypeLoc data.
430dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  unsigned Offset = getDataLength(Qualifier->getPrefix());
431dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  void *TypeData = LoadPointer(Data, Offset);
432dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  return TypeLoc(Qualifier->getAsType(), TypeData);
433dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor}
4345f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4355f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregornamespace {
4365f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  void Append(char *Start, char *End, char *&Buffer, unsigned &BufferSize,
4375f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor              unsigned &BufferCapacity) {
438a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar    if (Start == End)
439a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar      return;
440a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar
4415f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    if (BufferSize + (End - Start) > BufferCapacity) {
4425f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      // Reallocate the buffer.
443a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar      unsigned NewCapacity = std::max(
444a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar          (unsigned)(BufferCapacity ? BufferCapacity * 2 : sizeof(void *) * 2),
445a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar          (unsigned)(BufferSize + (End - Start)));
4465f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      char *NewBuffer = static_cast<char *>(malloc(NewCapacity));
447a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar      if (BufferCapacity) {
448a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar        memcpy(NewBuffer, Buffer, BufferSize);
4495f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        free(Buffer);
450a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar      }
4515f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      Buffer = NewBuffer;
4525f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      BufferCapacity = NewCapacity;
4535f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    }
4545f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4555f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    memcpy(Buffer + BufferSize, Start, End - Start);
4565f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferSize += End-Start;
4575f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
4585f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4595f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  /// \brief Save a source location to the given buffer.
4605f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  void SaveSourceLocation(SourceLocation Loc, char *&Buffer,
4615f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                          unsigned &BufferSize, unsigned &BufferCapacity) {
4625f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    unsigned Raw = Loc.getRawEncoding();
4635f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    Append(reinterpret_cast<char *>(&Raw),
4645f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor           reinterpret_cast<char *>(&Raw) + sizeof(unsigned),
4655f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor           Buffer, BufferSize, BufferCapacity);
4665f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
4675f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4685f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  /// \brief Save a pointer to the given buffer.
4695f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  void SavePointer(void *Ptr, char *&Buffer, unsigned &BufferSize,
4705f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                   unsigned &BufferCapacity) {
4715f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    Append(reinterpret_cast<char *>(&Ptr),
4725f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor           reinterpret_cast<char *>(&Ptr) + sizeof(void *),
4735f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor           Buffer, BufferSize, BufferCapacity);
4745f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
4755f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
4765f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4775f791bb44417ecc201ed57a85d0fe02001d8a615Douglas GregorNestedNameSpecifierLocBuilder::
4785f791bb44417ecc201ed57a85d0fe02001d8a615Douglas GregorNestedNameSpecifierLocBuilder(const NestedNameSpecifierLocBuilder &Other)
4796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  : Representation(Other.Representation), Buffer(nullptr),
4805f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferSize(0), BufferCapacity(0)
4815f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor{
4825f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (!Other.Buffer)
4835f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return;
4845f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4855f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (Other.BufferCapacity == 0) {
4865f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    // Shallow copy is okay.
4875f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    Buffer = Other.Buffer;
4885f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferSize = Other.BufferSize;
4895f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return;
4905f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
4915f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4925f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Deep copy
493176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Append(Other.Buffer, Other.Buffer + Other.BufferSize, Buffer, BufferSize,
494176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines         BufferCapacity);
4955f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
4965f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4975f791bb44417ecc201ed57a85d0fe02001d8a615Douglas GregorNestedNameSpecifierLocBuilder &
4985f791bb44417ecc201ed57a85d0fe02001d8a615Douglas GregorNestedNameSpecifierLocBuilder::
4995f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregoroperator=(const NestedNameSpecifierLocBuilder &Other) {
5005f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = Other.Representation;
5015f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5025f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (Buffer && Other.Buffer && BufferCapacity >= Other.BufferSize) {
5035f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    // Re-use our storage.
5045f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferSize = Other.BufferSize;
5055f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    memcpy(Buffer, Other.Buffer, BufferSize);
5065f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return *this;
5075f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
5085f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5095f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Free our storage, if we have any.
5105f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (BufferCapacity) {
5115f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    free(Buffer);
5125f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferCapacity = 0;
5135f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
5145f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5155f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (!Other.Buffer) {
5165f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    // Empty.
5176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Buffer = nullptr;
5185f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferSize = 0;
5195f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return *this;
5205f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
5215f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5225f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (Other.BufferCapacity == 0) {
5235f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    // Shallow copy is okay.
5245f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    Buffer = Other.Buffer;
5255f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferSize = Other.BufferSize;
5265f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return *this;
5275f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
5285f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5295f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Deep copy.
530176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Append(Other.Buffer, Other.Buffer + Other.BufferSize, Buffer, BufferSize,
531176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines         BufferCapacity);
5325f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  return *this;
5335f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
5345f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5355f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregorvoid NestedNameSpecifierLocBuilder::Extend(ASTContext &Context,
5365f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation TemplateKWLoc,
5375f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           TypeLoc TL,
5385f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation ColonColonLoc) {
5395f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = NestedNameSpecifier::Create(Context, Representation,
5405f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                               TemplateKWLoc.isValid(),
5415f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                               TL.getTypePtr());
5425f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5435f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Push source-location info into the buffer.
5445f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SavePointer(TL.getOpaqueData(), Buffer, BufferSize, BufferCapacity);
5455f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(ColonColonLoc, Buffer, BufferSize, BufferCapacity);
5465f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
5475f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5485f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregorvoid NestedNameSpecifierLocBuilder::Extend(ASTContext &Context,
5495f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           IdentifierInfo *Identifier,
5505f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation IdentifierLoc,
5515f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation ColonColonLoc) {
5525f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = NestedNameSpecifier::Create(Context, Representation,
5535f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                               Identifier);
5545f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5555f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Push source-location info into the buffer.
5565f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(IdentifierLoc, Buffer, BufferSize, BufferCapacity);
5575f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(ColonColonLoc, Buffer, BufferSize, BufferCapacity);
5585f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
5595f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5605f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregorvoid NestedNameSpecifierLocBuilder::Extend(ASTContext &Context,
5615f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           NamespaceDecl *Namespace,
5625f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation NamespaceLoc,
5635f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation ColonColonLoc) {
5645f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = NestedNameSpecifier::Create(Context, Representation,
5655f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                               Namespace);
5665f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5675f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Push source-location info into the buffer.
5685f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(NamespaceLoc, Buffer, BufferSize, BufferCapacity);
5695f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(ColonColonLoc, Buffer, BufferSize, BufferCapacity);
5705f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
5715f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5725f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregorvoid NestedNameSpecifierLocBuilder::Extend(ASTContext &Context,
5735f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           NamespaceAliasDecl *Alias,
5745f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation AliasLoc,
5755f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation ColonColonLoc) {
5765f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = NestedNameSpecifier::Create(Context, Representation, Alias);
5775f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5785f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Push source-location info into the buffer.
5795f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(AliasLoc, Buffer, BufferSize, BufferCapacity);
5805f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(ColonColonLoc, Buffer, BufferSize, BufferCapacity);
5815f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
5825f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5835f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregorvoid NestedNameSpecifierLocBuilder::MakeGlobal(ASTContext &Context,
5845f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                               SourceLocation ColonColonLoc) {
5855f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  assert(!Representation && "Already have a nested-name-specifier!?");
5865f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = NestedNameSpecifier::GlobalSpecifier(Context);
5875f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5885f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Push source-location info into the buffer.
5895f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(ColonColonLoc, Buffer, BufferSize, BufferCapacity);
5905f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
5915f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
592176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid NestedNameSpecifierLocBuilder::MakeSuper(ASTContext &Context,
593176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                              CXXRecordDecl *RD,
594176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                              SourceLocation SuperLoc,
595176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines                                              SourceLocation ColonColonLoc) {
596176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  Representation = NestedNameSpecifier::SuperSpecifier(Context, RD);
597176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
598176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  // Push source-location info into the buffer.
599176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  SaveSourceLocation(SuperLoc, Buffer, BufferSize, BufferCapacity);
600176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  SaveSourceLocation(ColonColonLoc, Buffer, BufferSize, BufferCapacity);
601176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}
602176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
6035f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregorvoid NestedNameSpecifierLocBuilder::MakeTrivial(ASTContext &Context,
6045f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                                NestedNameSpecifier *Qualifier,
6055f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                                SourceRange R) {
6065f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = Qualifier;
6075f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6085f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Construct bogus (but well-formed) source information for the
6095f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // nested-name-specifier.
6105f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  BufferSize = 0;
6115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<NestedNameSpecifier *, 4> Stack;
6125f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  for (NestedNameSpecifier *NNS = Qualifier; NNS; NNS = NNS->getPrefix())
6135f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    Stack.push_back(NNS);
6145f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  while (!Stack.empty()) {
615344472ebeded2fca2ed5013b9e87f81d09bfa908Robert Wilhelm    NestedNameSpecifier *NNS = Stack.pop_back_val();
6165f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    switch (NNS->getKind()) {
6175f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      case NestedNameSpecifier::Identifier:
6185f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      case NestedNameSpecifier::Namespace:
6195f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      case NestedNameSpecifier::NamespaceAlias:
6205f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        SaveSourceLocation(R.getBegin(), Buffer, BufferSize, BufferCapacity);
6215f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        break;
6225f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6235f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      case NestedNameSpecifier::TypeSpec:
6245f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      case NestedNameSpecifier::TypeSpecWithTemplate: {
6255f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        TypeSourceInfo *TSInfo
6265f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        = Context.getTrivialTypeSourceInfo(QualType(NNS->getAsType(), 0),
6275f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           R.getBegin());
6285f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        SavePointer(TSInfo->getTypeLoc().getOpaqueData(), Buffer, BufferSize,
6295f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                    BufferCapacity);
6305f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        break;
6315f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      }
6325f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6335f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      case NestedNameSpecifier::Global:
634176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines      case NestedNameSpecifier::Super:
6355f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        break;
6365f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    }
6375f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6385f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    // Save the location of the '::'.
6395f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    SaveSourceLocation(Stack.empty()? R.getEnd() : R.getBegin(),
6405f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                       Buffer, BufferSize, BufferCapacity);
6415f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
6425f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
6435f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6445f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregorvoid NestedNameSpecifierLocBuilder::Adopt(NestedNameSpecifierLoc Other) {
6455f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (BufferCapacity)
6465f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    free(Buffer);
6475f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6485f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (!Other) {
6496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Representation = nullptr;
6505f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferSize = 0;
6515f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return;
6525f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
6535f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6545f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Rather than copying the data (which is wasteful), "adopt" the
6555f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // pointer (which points into the ASTContext) but set the capacity to zero to
6565f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // indicate that we don't own it.
6575f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = Other.getNestedNameSpecifier();
6585f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Buffer = static_cast<char *>(Other.getOpaqueData());
6595f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  BufferSize = Other.getDataLength();
6605f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  BufferCapacity = 0;
6615f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
6625f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6635f791bb44417ecc201ed57a85d0fe02001d8a615Douglas GregorNestedNameSpecifierLoc
6645f791bb44417ecc201ed57a85d0fe02001d8a615Douglas GregorNestedNameSpecifierLocBuilder::getWithLocInContext(ASTContext &Context) const {
6655f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (!Representation)
6665f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return NestedNameSpecifierLoc();
6675f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6685f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // If we adopted our data pointer from elsewhere in the AST context, there's
6695f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // no need to copy the memory.
6705f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (BufferCapacity == 0)
6715f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return NestedNameSpecifierLoc(Representation, Buffer);
6725f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6735f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // FIXME: After copying the source-location information, should we free
6745f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // our (temporary) buffer and adopt the ASTContext-allocated memory?
6755f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Doing so would optimize repeated calls to getWithLocInContext().
6765f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  void *Mem = Context.Allocate(BufferSize, llvm::alignOf<void *>());
6775f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  memcpy(Mem, Buffer, BufferSize);
6785f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  return NestedNameSpecifierLoc(Representation, Mem);
6795f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
680