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