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);
6914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  Mockup.Prefix.setInt(StoredNamespaceOrAlias);
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);
8514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  Mockup.Prefix.setInt(StoredNamespaceOrAlias);
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
12114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas GregorNestedNameSpecifier::SpecifierKind NestedNameSpecifier::getKind() const {
1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!Specifier)
12314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return Global;
12414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
12514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  switch (Prefix.getInt()) {
12614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case StoredIdentifier:
12714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return Identifier;
12814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
12914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case StoredNamespaceOrAlias:
13014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return isa<NamespaceDecl>(static_cast<NamedDecl *>(Specifier))? Namespace
13114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                                                            : NamespaceAlias;
13214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
13314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case StoredTypeSpec:
13414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return TypeSpec;
13514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
13614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case StoredTypeSpecWithTemplate:
13714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return TypeSpecWithTemplate;
13814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  }
13914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
1403026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid NNS Kind!");
14114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor}
14214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
14314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor/// \brief Retrieve the namespace stored in this nested name
14414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor/// specifier.
14514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas GregorNamespaceDecl *NestedNameSpecifier::getAsNamespace() const {
14614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  if (Prefix.getInt() == StoredNamespaceOrAlias)
14714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return dyn_cast<NamespaceDecl>(static_cast<NamedDecl *>(Specifier));
14814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
1496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
15014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor}
15114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
15214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor/// \brief Retrieve the namespace alias stored in this nested name
15314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor/// specifier.
15414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas GregorNamespaceAliasDecl *NestedNameSpecifier::getAsNamespaceAlias() const {
15514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  if (Prefix.getInt() == StoredNamespaceOrAlias)
15614aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    return dyn_cast<NamespaceAliasDecl>(static_cast<NamedDecl *>(Specifier));
15714aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
1586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return nullptr;
15914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor}
16014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
16114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
162ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor/// \brief Whether this nested name specifier refers to a dependent
163ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor/// type or not.
164ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregorbool NestedNameSpecifier::isDependent() const {
165ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  switch (getKind()) {
166ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case Identifier:
167ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    // Identifier specifiers always represent dependent types
168ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    return true;
169ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
170ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case Namespace:
17114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case NamespaceAlias:
172ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case Global:
173ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    return false;
174ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
175ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case TypeSpec:
176ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case TypeSpecWithTemplate:
177ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    return getAsType()->isDependentType();
178bad351822117eaf280081494e3dbe4a06c0dbfcfDouglas Gregor  }
179ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
1803026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid NNS Kind!");
181ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor}
182ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
183561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor/// \brief Whether this nested name specifier refers to a dependent
184561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor/// type or not.
185561f81243f665cf2001caadc45df505f826b72d6Douglas Gregorbool NestedNameSpecifier::isInstantiationDependent() const {
186561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  switch (getKind()) {
187561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Identifier:
188561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    // Identifier specifiers always represent dependent types
189561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return true;
190561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
191561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Namespace:
192561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case NamespaceAlias:
193561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case Global:
194561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return false;
195561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
196561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case TypeSpec:
197561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  case TypeSpecWithTemplate:
198561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor    return getAsType()->isInstantiationDependentType();
199561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor  }
2003026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
2013026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid NNS Kind!");
202561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor}
203561f81243f665cf2001caadc45df505f826b72d6Douglas Gregor
204d0937224f383c7cc72c947119380f9713a070c73Douglas Gregorbool NestedNameSpecifier::containsUnexpandedParameterPack() const {
205d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  switch (getKind()) {
206d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Identifier:
207d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    return getPrefix() && getPrefix()->containsUnexpandedParameterPack();
208d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
209d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Namespace:
21014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case NamespaceAlias:
211d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case Global:
212d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    return false;
213d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
214d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case TypeSpec:
215d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  case TypeSpecWithTemplate:
216d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor    return getAsType()->containsUnexpandedParameterPack();
217d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor  }
218d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
2193026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid NNS Kind!");
220d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor}
221d0937224f383c7cc72c947119380f9713a070c73Douglas Gregor
222ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor/// \brief Print this nested name specifier to the given output
223ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor/// stream.
2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpvoid
2255f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerNestedNameSpecifier::print(raw_ostream &OS,
226d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor                           const PrintingPolicy &Policy) const {
2271734317845d60307d474b5da8a8d33adbaf5e723Douglas Gregor  if (getPrefix())
228d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    getPrefix()->print(OS, Policy);
229ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
230ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  switch (getKind()) {
231ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case Identifier:
232ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    OS << getAsIdentifier()->getName();
233ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    break;
234ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
235ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case Namespace:
23625270b6e6a8416b7532cfe552b41794418ea19b1Douglas Gregor    if (getAsNamespace()->isAnonymousNamespace())
23725270b6e6a8416b7532cfe552b41794418ea19b1Douglas Gregor      return;
23825270b6e6a8416b7532cfe552b41794418ea19b1Douglas Gregor
23914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    OS << getAsNamespace()->getName();
24014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    break;
24114aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
24214aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  case NamespaceAlias:
24314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    OS << getAsNamespaceAlias()->getName();
244ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    break;
245ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
246ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case Global:
247ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    break;
248ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
249ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case TypeSpecWithTemplate:
250ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    OS << "template ";
251ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    // Fall through to print the type.
252ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
253ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  case TypeSpec: {
254f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    const Type *T = getAsType();
255ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
256d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor    PrintingPolicy InnerPolicy(Policy);
2572191b20bfb31fc0e22a158f6b4204cd0b7dbd0fdJohn McCall    InnerPolicy.SuppressScope = true;
2581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
259dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    // Nested-name-specifiers are intended to contain minimally-qualified
260465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    // types. An actual ElaboratedType will not occur, since we'll store
261dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    // just the type that is referred to in the nested-name-specifier (e.g.,
262dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    // a TypedefType, TagType, etc.). However, when we are dealing with
2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    // dependent template-id types (e.g., Outer<T>::template Inner<U>),
264dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    // the type requires its own nested-name-specifier for uniqueness, so we
265dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    // suppress that nested-name-specifier during printing.
266465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara    assert(!isa<ElaboratedType>(T) &&
267465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara           "Elaborated type in nested-name-specifier");
268dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    if (const TemplateSpecializationType *SpecType
269dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor          = dyn_cast<TemplateSpecializationType>(T)) {
2701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      // Print the template name without its corresponding
271dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor      // nested-name-specifier.
272dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor      SpecType->getTemplateName().print(OS, InnerPolicy, true);
2731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
274dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor      // Print the template argument list.
2755eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer      TemplateSpecializationType::PrintTemplateArgumentList(
2765eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer          OS, SpecType->getArgs(), SpecType->getNumArgs(), InnerPolicy);
277dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    } else {
278dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor      // Print the type normally
2795eada844fa70b6e2bc941dd7306f7a4fb1e8529dBenjamin Kramer      QualType(T, 0).print(OS, InnerPolicy);
280dacd434c49658286c380c7b4c357d76d53cb4aa1Douglas Gregor    }
281ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    break;
282ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  }
283ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  }
284ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
285ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor  OS << "::";
286ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor}
287ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
288e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattnervoid NestedNameSpecifier::dump(const LangOptions &LO) {
289e4f2142d00fa5fdb580c4e2413da91882d955381Chris Lattner  print(llvm::errs(), PrintingPolicy(LO));
290d57959af02b4af695276f4204443afe6e5d86bd8Douglas Gregor}
291c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
292c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregorunsigned
293c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas GregorNestedNameSpecifierLoc::getLocalDataLength(NestedNameSpecifier *Qualifier) {
294c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  assert(Qualifier && "Expected a non-NULL qualifier");
295c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
296c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  // Location of the trailing '::'.
297c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  unsigned Length = sizeof(unsigned);
298c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
299c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  switch (Qualifier->getKind()) {
300c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::Global:
301c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    // Nothing more to add.
302c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    break;
303c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
304c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::Identifier:
305c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::Namespace:
306c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::NamespaceAlias:
307c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    // The location of the identifier or namespace name.
308c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    Length += sizeof(unsigned);
309c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    break;
310c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
311c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
312c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::TypeSpec:
313c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    // The "void*" that points at the TypeLoc data.
314c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    // Note: the 'template' keyword is part of the TypeLoc.
315c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    Length += sizeof(void *);
316c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    break;
317c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  }
318c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
319c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  return Length;
320c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor}
321c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
322c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregorunsigned
323c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas GregorNestedNameSpecifierLoc::getDataLength(NestedNameSpecifier *Qualifier) {
324c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  unsigned Length = 0;
325c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  for (; Qualifier; Qualifier = Qualifier->getPrefix())
326c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    Length += getLocalDataLength(Qualifier);
327c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  return Length;
328c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor}
329c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
330c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregornamespace {
331c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  /// \brief Load a (possibly unaligned) source location from a given address
332c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  /// and offset.
333c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  SourceLocation LoadSourceLocation(void *Data, unsigned Offset) {
334c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    unsigned Raw;
335c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    memcpy(&Raw, static_cast<char *>(Data) + Offset, sizeof(unsigned));
336c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    return SourceLocation::getFromRawEncoding(Raw);
337c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  }
338c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
339c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  /// \brief Load a (possibly unaligned) pointer from a given address and
340c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  /// offset.
341c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  void *LoadPointer(void *Data, unsigned Offset) {
342c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    void *Result;
343c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    memcpy(&Result, static_cast<char *>(Data) + Offset, sizeof(void*));
344c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    return Result;
345c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  }
346c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor}
347c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
348dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas GregorSourceRange NestedNameSpecifierLoc::getSourceRange() const {
349db9924191092b4d426cc066637d81698211846aaDouglas Gregor  if (!Qualifier)
350db9924191092b4d426cc066637d81698211846aaDouglas Gregor    return SourceRange();
351db9924191092b4d426cc066637d81698211846aaDouglas Gregor
352c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  NestedNameSpecifierLoc First = *this;
353db9924191092b4d426cc066637d81698211846aaDouglas Gregor  while (NestedNameSpecifierLoc Prefix = First.getPrefix())
354c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    First = Prefix;
355c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
356c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  return SourceRange(First.getLocalSourceRange().getBegin(),
357c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor                     getLocalSourceRange().getEnd());
358c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor}
359c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
360dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas GregorSourceRange NestedNameSpecifierLoc::getLocalSourceRange() const {
361db9924191092b4d426cc066637d81698211846aaDouglas Gregor  if (!Qualifier)
362db9924191092b4d426cc066637d81698211846aaDouglas Gregor    return SourceRange();
363db9924191092b4d426cc066637d81698211846aaDouglas Gregor
364c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  unsigned Offset = getDataLength(Qualifier->getPrefix());
365c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  switch (Qualifier->getKind()) {
366c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::Global:
367c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    return LoadSourceLocation(Data, Offset);
368c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
369c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::Identifier:
370c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::Namespace:
371c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::NamespaceAlias:
372c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    return SourceRange(LoadSourceLocation(Data, Offset),
373c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor                       LoadSourceLocation(Data, Offset + sizeof(unsigned)));
374c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
375c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::TypeSpecWithTemplate:
376c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  case NestedNameSpecifier::TypeSpec: {
377c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    // The "void*" that points at the TypeLoc data.
378c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    // Note: the 'template' keyword is part of the TypeLoc.
379c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    void *TypeData = LoadPointer(Data, Offset);
380c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    TypeLoc TL(Qualifier->getAsType(), TypeData);
381c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    return SourceRange(TL.getBeginLoc(),
382c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor                       LoadSourceLocation(Data, Offset + sizeof(void*)));
383c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  }
384c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  }
3853026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie
3863026348bd4c13a0f83b59839f64065e0fcbea253David Blaikie  llvm_unreachable("Invalid NNS Kind!");
387c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor}
388dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
389dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas GregorTypeLoc NestedNameSpecifierLoc::getTypeLoc() const {
390dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  assert((Qualifier->getKind() == NestedNameSpecifier::TypeSpec ||
391dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor          Qualifier->getKind() == NestedNameSpecifier::TypeSpecWithTemplate) &&
392dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor         "Nested-name-specifier location is not a type");
393dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor
394dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  // The "void*" that points at the TypeLoc data.
395dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  unsigned Offset = getDataLength(Qualifier->getPrefix());
396dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  void *TypeData = LoadPointer(Data, Offset);
397dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor  return TypeLoc(Qualifier->getAsType(), TypeData);
398dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor}
3995f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4005f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregornamespace {
4015f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  void Append(char *Start, char *End, char *&Buffer, unsigned &BufferSize,
4025f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor              unsigned &BufferCapacity) {
4035f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    if (BufferSize + (End - Start) > BufferCapacity) {
4045f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      // Reallocate the buffer.
4055f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      unsigned NewCapacity
4065f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      = std::max((unsigned)(BufferCapacity? BufferCapacity * 2
4075f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                            : sizeof(void*) * 2),
4085f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                 (unsigned)(BufferSize + (End - Start)));
4095f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      char *NewBuffer = static_cast<char *>(malloc(NewCapacity));
4105f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      memcpy(NewBuffer, Buffer, BufferSize);
4115f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4125f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      if (BufferCapacity)
4135f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        free(Buffer);
4145f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      Buffer = NewBuffer;
4155f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      BufferCapacity = NewCapacity;
4165f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    }
4175f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4185f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    memcpy(Buffer + BufferSize, Start, End - Start);
4195f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferSize += End-Start;
4205f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
4215f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4225f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  /// \brief Save a source location to the given buffer.
4235f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  void SaveSourceLocation(SourceLocation Loc, char *&Buffer,
4245f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                          unsigned &BufferSize, unsigned &BufferCapacity) {
4255f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    unsigned Raw = Loc.getRawEncoding();
4265f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    Append(reinterpret_cast<char *>(&Raw),
4275f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor           reinterpret_cast<char *>(&Raw) + sizeof(unsigned),
4285f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor           Buffer, BufferSize, BufferCapacity);
4295f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
4305f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4315f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  /// \brief Save a pointer to the given buffer.
4325f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  void SavePointer(void *Ptr, char *&Buffer, unsigned &BufferSize,
4335f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                   unsigned &BufferCapacity) {
4345f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    Append(reinterpret_cast<char *>(&Ptr),
4355f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor           reinterpret_cast<char *>(&Ptr) + sizeof(void *),
4365f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor           Buffer, BufferSize, BufferCapacity);
4375f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
4385f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
4395f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4405f791bb44417ecc201ed57a85d0fe02001d8a615Douglas GregorNestedNameSpecifierLocBuilder::
4415f791bb44417ecc201ed57a85d0fe02001d8a615Douglas GregorNestedNameSpecifierLocBuilder(const NestedNameSpecifierLocBuilder &Other)
4426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  : Representation(Other.Representation), Buffer(nullptr),
4435f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferSize(0), BufferCapacity(0)
4445f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor{
4455f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (!Other.Buffer)
4465f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return;
4475f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4485f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (Other.BufferCapacity == 0) {
4495f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    // Shallow copy is okay.
4505f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    Buffer = Other.Buffer;
4515f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferSize = Other.BufferSize;
4525f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return;
4535f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
4545f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4555f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Deep copy
4565f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  BufferSize = Other.BufferSize;
4575f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  BufferCapacity = Other.BufferSize;
4585f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Buffer = static_cast<char *>(malloc(BufferCapacity));
4595f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  memcpy(Buffer, Other.Buffer, BufferSize);
4605f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
4615f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4625f791bb44417ecc201ed57a85d0fe02001d8a615Douglas GregorNestedNameSpecifierLocBuilder &
4635f791bb44417ecc201ed57a85d0fe02001d8a615Douglas GregorNestedNameSpecifierLocBuilder::
4645f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregoroperator=(const NestedNameSpecifierLocBuilder &Other) {
4655f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = Other.Representation;
4665f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4675f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (Buffer && Other.Buffer && BufferCapacity >= Other.BufferSize) {
4685f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    // Re-use our storage.
4695f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferSize = Other.BufferSize;
4705f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    memcpy(Buffer, Other.Buffer, BufferSize);
4715f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return *this;
4725f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
4735f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4745f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Free our storage, if we have any.
4755f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (BufferCapacity) {
4765f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    free(Buffer);
4775f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferCapacity = 0;
4785f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
4795f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4805f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (!Other.Buffer) {
4815f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    // Empty.
4826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Buffer = nullptr;
4835f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferSize = 0;
4845f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return *this;
4855f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
4865f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4875f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (Other.BufferCapacity == 0) {
4885f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    // Shallow copy is okay.
4895f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    Buffer = Other.Buffer;
4905f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferSize = Other.BufferSize;
4915f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return *this;
4925f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
4935f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
4945f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Deep copy.
4955f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  BufferSize = Other.BufferSize;
4965f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  BufferCapacity = BufferSize;
4975f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Buffer = static_cast<char *>(malloc(BufferSize));
4985f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  memcpy(Buffer, Other.Buffer, BufferSize);
4995f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  return *this;
5005f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
5015f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5025f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregorvoid NestedNameSpecifierLocBuilder::Extend(ASTContext &Context,
5035f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation TemplateKWLoc,
5045f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           TypeLoc TL,
5055f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation ColonColonLoc) {
5065f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = NestedNameSpecifier::Create(Context, Representation,
5075f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                               TemplateKWLoc.isValid(),
5085f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                               TL.getTypePtr());
5095f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5105f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Push source-location info into the buffer.
5115f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SavePointer(TL.getOpaqueData(), Buffer, BufferSize, BufferCapacity);
5125f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(ColonColonLoc, Buffer, BufferSize, BufferCapacity);
5135f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
5145f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5155f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregorvoid NestedNameSpecifierLocBuilder::Extend(ASTContext &Context,
5165f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           IdentifierInfo *Identifier,
5175f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation IdentifierLoc,
5185f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation ColonColonLoc) {
5195f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = NestedNameSpecifier::Create(Context, Representation,
5205f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                               Identifier);
5215f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5225f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Push source-location info into the buffer.
5235f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(IdentifierLoc, Buffer, BufferSize, BufferCapacity);
5245f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(ColonColonLoc, Buffer, BufferSize, BufferCapacity);
5255f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
5265f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5275f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregorvoid NestedNameSpecifierLocBuilder::Extend(ASTContext &Context,
5285f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           NamespaceDecl *Namespace,
5295f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation NamespaceLoc,
5305f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation ColonColonLoc) {
5315f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = NestedNameSpecifier::Create(Context, Representation,
5325f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                               Namespace);
5335f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5345f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Push source-location info into the buffer.
5355f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(NamespaceLoc, Buffer, BufferSize, BufferCapacity);
5365f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(ColonColonLoc, Buffer, BufferSize, BufferCapacity);
5375f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
5385f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5395f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregorvoid NestedNameSpecifierLocBuilder::Extend(ASTContext &Context,
5405f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           NamespaceAliasDecl *Alias,
5415f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation AliasLoc,
5425f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           SourceLocation ColonColonLoc) {
5435f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = NestedNameSpecifier::Create(Context, Representation, Alias);
5445f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5455f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Push source-location info into the buffer.
5465f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(AliasLoc, Buffer, BufferSize, BufferCapacity);
5475f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(ColonColonLoc, Buffer, BufferSize, BufferCapacity);
5485f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
5495f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5505f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregorvoid NestedNameSpecifierLocBuilder::MakeGlobal(ASTContext &Context,
5515f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                               SourceLocation ColonColonLoc) {
5525f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  assert(!Representation && "Already have a nested-name-specifier!?");
5535f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = NestedNameSpecifier::GlobalSpecifier(Context);
5545f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5555f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Push source-location info into the buffer.
5565f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  SaveSourceLocation(ColonColonLoc, Buffer, BufferSize, BufferCapacity);
5575f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
5585f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5595f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregorvoid NestedNameSpecifierLocBuilder::MakeTrivial(ASTContext &Context,
5605f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                                NestedNameSpecifier *Qualifier,
5615f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                                SourceRange R) {
5625f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = Qualifier;
5635f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5645f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Construct bogus (but well-formed) source information for the
5655f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // nested-name-specifier.
5665f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  BufferSize = 0;
5675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<NestedNameSpecifier *, 4> Stack;
5685f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  for (NestedNameSpecifier *NNS = Qualifier; NNS; NNS = NNS->getPrefix())
5695f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    Stack.push_back(NNS);
5705f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  while (!Stack.empty()) {
571344472ebeded2fca2ed5013b9e87f81d09bfa908Robert Wilhelm    NestedNameSpecifier *NNS = Stack.pop_back_val();
5725f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    switch (NNS->getKind()) {
5735f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      case NestedNameSpecifier::Identifier:
5745f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      case NestedNameSpecifier::Namespace:
5755f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      case NestedNameSpecifier::NamespaceAlias:
5765f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        SaveSourceLocation(R.getBegin(), Buffer, BufferSize, BufferCapacity);
5775f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        break;
5785f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5795f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      case NestedNameSpecifier::TypeSpec:
5805f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      case NestedNameSpecifier::TypeSpecWithTemplate: {
5815f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        TypeSourceInfo *TSInfo
5825f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        = Context.getTrivialTypeSourceInfo(QualType(NNS->getAsType(), 0),
5835f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                                           R.getBegin());
5845f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        SavePointer(TSInfo->getTypeLoc().getOpaqueData(), Buffer, BufferSize,
5855f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                    BufferCapacity);
5865f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        break;
5875f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      }
5885f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5895f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor      case NestedNameSpecifier::Global:
5905f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor        break;
5915f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    }
5925f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5935f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    // Save the location of the '::'.
5945f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    SaveSourceLocation(Stack.empty()? R.getEnd() : R.getBegin(),
5955f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor                       Buffer, BufferSize, BufferCapacity);
5965f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
5975f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
5985f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
5995f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregorvoid NestedNameSpecifierLocBuilder::Adopt(NestedNameSpecifierLoc Other) {
6005f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (BufferCapacity)
6015f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    free(Buffer);
6025f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6035f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (!Other) {
6046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Representation = nullptr;
6055f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    BufferSize = 0;
6065f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return;
6075f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  }
6085f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6095f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Rather than copying the data (which is wasteful), "adopt" the
6105f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // pointer (which points into the ASTContext) but set the capacity to zero to
6115f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // indicate that we don't own it.
6125f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Representation = Other.getNestedNameSpecifier();
6135f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Buffer = static_cast<char *>(Other.getOpaqueData());
6145f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  BufferSize = Other.getDataLength();
6155f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  BufferCapacity = 0;
6165f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
6175f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6185f791bb44417ecc201ed57a85d0fe02001d8a615Douglas GregorNestedNameSpecifierLoc
6195f791bb44417ecc201ed57a85d0fe02001d8a615Douglas GregorNestedNameSpecifierLocBuilder::getWithLocInContext(ASTContext &Context) const {
6205f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (!Representation)
6215f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return NestedNameSpecifierLoc();
6225f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6235f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // If we adopted our data pointer from elsewhere in the AST context, there's
6245f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // no need to copy the memory.
6255f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  if (BufferCapacity == 0)
6265f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    return NestedNameSpecifierLoc(Representation, Buffer);
6275f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
6285f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // FIXME: After copying the source-location information, should we free
6295f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // our (temporary) buffer and adopt the ASTContext-allocated memory?
6305f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  // Doing so would optimize repeated calls to getWithLocInContext().
6315f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  void *Mem = Context.Allocate(BufferSize, llvm::alignOf<void *>());
6325f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  memcpy(Mem, Buffer, BufferSize);
6335f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  return NestedNameSpecifierLoc(Representation, Mem);
6345f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor}
635