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