clang 10.0.0git

Public Types | Public Member Functions | Static Public Member Functions | List of all members
clang::NestedNameSpecifier Class Reference

Represents a C++ nested name specifier, such as "\::std::vector<int>::". More...

`#include "clang/AST/NestedNameSpecifier.h"`

Inheritance diagram for clang::NestedNameSpecifier:
[legend]
Collaboration diagram for clang::NestedNameSpecifier:
[legend]

## Public Types
enum | SpecifierKind { Identifier, Namespace, NamespaceAlias, TypeSpec, TypeSpecWithTemplate, Global, Super }
| The kind of specifier that completes this nested name specifier. More...

## Public Member Functions
NestedNameSpecifier & | operator= (const NestedNameSpecifier &)=delete
NestedNameSpecifier * | getPrefix () const
| Return the prefix of this nested name specifier. More...
SpecifierKind | getKind () const
| Determine what kind of nested name specifier is stored. More...
IdentifierInfo * | getAsIdentifier () const
| Retrieve the identifier stored in this nested name specifier. More...
NamespaceDecl * | getAsNamespace () const
| Retrieve the namespace stored in this nested name specifier. More...
NamespaceAliasDecl * | getAsNamespaceAlias () const
| Retrieve the namespace alias stored in this nested name specifier. More...
CXXRecordDecl * | getAsRecordDecl () const
| Retrieve the record declaration stored in this nested name specifier. More...
const Type * | getAsType () const
| Retrieve the type stored in this nested name specifier. More...
bool | isDependent () const
| Whether this nested name specifier refers to a dependent type or not. More...
bool | isInstantiationDependent () const
| Whether this nested name specifier involves a template parameter. More...
bool | containsUnexpandedParameterPack () const
| Whether this nested-name-specifier contains an unexpanded parameter pack (for C++11 variadic templates). More...
void | print (raw_ostream &OS, const PrintingPolicy &Policy, bool ResolveTemplateArguments=false) const
| Print this nested name specifier to the given output stream. More...
void | Profile (llvm::FoldingSetNodeID &ID) const
void | dump (const LangOptions &LO) const
| Dump the nested name specifier to standard output to aid in debugging. More...
void | dump () const
void | dump (llvm::raw_ostream &OS) const
void | dump (llvm::raw_ostream &OS, const LangOptions &LO) const

## Static Public Member Functions
static NestedNameSpecifier * | Create (const ASTContext &Context, NestedNameSpecifier *Prefix, IdentifierInfo *II)
| Builds a specifier combining a prefix and an identifier. More...
static NestedNameSpecifier * | Create (const ASTContext &Context, NestedNameSpecifier *Prefix, const NamespaceDecl *NS)
| Builds a nested name specifier that names a namespace. More...
static NestedNameSpecifier * | Create (const ASTContext &Context, NestedNameSpecifier *Prefix, NamespaceAliasDecl *Alias)
| Builds a nested name specifier that names a namespace alias. More...
static NestedNameSpecifier * | Create (const ASTContext &Context, NestedNameSpecifier *Prefix, bool Template, const Type *T)
| Builds a nested name specifier that names a type. More...
static NestedNameSpecifier * | Create (const ASTContext &Context, IdentifierInfo *II)
| Builds a specifier that consists of just an identifier. More...
static NestedNameSpecifier * | GlobalSpecifier (const ASTContext &Context)
| Returns the nested name specifier representing the global scope. More...
static NestedNameSpecifier * | SuperSpecifier (const ASTContext &Context, CXXRecordDecl *RD)
| Returns the nested name specifier representing the __super scope for the given CXXRecordDecl. More...

## Detailed Description

Represents a C++ nested name specifier, such as "\::std::vector<int>::".

C++ nested name specifiers are the prefixes to qualified names. For example, "foo::" in "foo::x" is a nested name specifier. Nested name specifiers are made up of a sequence of specifiers, each of which can be a namespace, type, identifier (for dependent names), decltype specifier, or the global specifier ('::'). The last two specifiers can only appear at the start of a nested-namespace-specifier.

Definition at line 48 of file NestedNameSpecifier.h.

## Member Enumeration Documentation

## ◆ SpecifierKind

enum clang::NestedNameSpecifier::SpecifierKind

The kind of specifier that completes this nested name specifier.

Enumerator
Identifier | An identifier, stored as an IdentifierInfo*.
Namespace | A namespace, stored as a NamespaceDecl*.
NamespaceAlias | A namespace alias, stored as a NamespaceAliasDecl*.
TypeSpec | A type, stored as a Type*.
TypeSpecWithTemplate | A type that was preceded by the 'template' keyword, stored as a Type*.
Global | The global specifier '::'. There is no stored value.
Super | Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.

Definition at line 77 of file NestedNameSpecifier.h.

## Member Function Documentation

## ◆ containsUnexpandedParameterPack()

bool NestedNameSpecifier::containsUnexpandedParameterPack | ( |  | ) | const

Whether this nested-name-specifier contains an unexpanded parameter pack (for C++11 variadic templates).

Definition at line 252 of file NestedNameSpecifier.cpp.

References containsUnexpandedParameterPack(), clang::Type::containsUnexpandedParameterPack(), getAsType(), getKind(), getPrefix(), Global, Identifier, Namespace, NamespaceAlias, Super, TypeSpec, and TypeSpecWithTemplate.

Referenced by containsUnexpandedParameterPack(), clang::Sema::containsUnexpandedParameterPacks(), clang::Sema::DiagnoseUnexpandedParameterPack(), getAsType(), clang::CXXUnresolvedConstructExpr::getBeginLoc(), clang::OverloadExpr::OverloadExpr(), and clang::ConceptSpecializationExpr::setTemplateArguments().

## ◆ Create() [1/5]

NestedNameSpecifier * NestedNameSpecifier::Create | ( | const ASTContext & | Context,
|  | NestedNameSpecifier * | Prefix,
|  | IdentifierInfo * | II
| ) |  |
| static

Builds a specifier combining a prefix and an identifier.

The prefix must be dependent, since nested name specifiers referencing an identifier are only permitted when the identifier cannot be resolved.

Definition at line 58 of file NestedNameSpecifier.cpp.

References isDependent().

Referenced by clang::Sema::CheckComparisonCategoryType(), compareOverloads(), clang::TypeName::createNestedNameSpecifier(), clang::NestedNameSpecifierLocBuilder::Extend(), clang::ASTContext::getCanonicalNestedNameSpecifier(), clang::ASTImporter::Import(), and clang::serialization::DataStreamBasicReader< ASTRecordReader >::readNestedNameSpecifier().

## ◆ Create() [2/5]

NestedNameSpecifier * NestedNameSpecifier::Create | ( | const ASTContext & | Context,
|  | NestedNameSpecifier * | Prefix,
|  | const NamespaceDecl * | NS
| ) |  |
| static

Builds a nested name specifier that names a namespace.

Definition at line 71 of file NestedNameSpecifier.cpp.

References getAsIdentifier(), and getAsType().

## ◆ Create() [3/5]

NestedNameSpecifier * NestedNameSpecifier::Create | ( | const ASTContext & | Context,
|  | NestedNameSpecifier * | Prefix,
|  | NamespaceAliasDecl * | Alias
| ) |  |
| static

Builds a nested name specifier that names a namespace alias.

Definition at line 87 of file NestedNameSpecifier.cpp.

References getAsIdentifier(), and getAsType().

## ◆ Create() [4/5]

NestedNameSpecifier * NestedNameSpecifier::Create | ( | const ASTContext & | Context,
|  | NestedNameSpecifier * | Prefix,
|  | bool | Template,
|  | const Type * | T
| ) |  |
| static

Builds a nested name specifier that names a type.

Definition at line 103 of file NestedNameSpecifier.cpp.

## ◆ Create() [5/5]

NestedNameSpecifier * NestedNameSpecifier::Create | ( | const ASTContext & | Context,
|  | IdentifierInfo * | II
| ) |  |
| static

Builds a specifier that consists of just an identifier.

The nested-name-specifier is assumed to be dependent, but has no prefix because the prefix is implied by something outside of the nested name specifier, e.g., in "x->Base::f", the "x" has a dependent type.

Definition at line 115 of file NestedNameSpecifier.cpp.

## ◆ dump() [1/4]

LLVM_DUMP_METHOD void NestedNameSpecifier::dump | ( | const LangOptions & | LO | ) | const

Dump the nested name specifier to standard output to aid in debugging.

Definition at line 350 of file NestedNameSpecifier.cpp.

References dump().

## ◆ dump() [2/4]

LLVM_DUMP_METHOD void NestedNameSpecifier::dump | ( |  | ) | const

Definition at line 354 of file NestedNameSpecifier.cpp.

Referenced by dump(), and Profile().

## ◆ dump() [3/4]

LLVM_DUMP_METHOD void NestedNameSpecifier::dump | ( | llvm::raw_ostream & | OS | ) | const

Definition at line 356 of file NestedNameSpecifier.cpp.

References dump().

## ◆ dump() [4/4]

LLVM_DUMP_METHOD void NestedNameSpecifier::dump | ( | llvm::raw_ostream & | OS,
|  | const LangOptions & | LO
| ) |  | const

Definition at line 361 of file NestedNameSpecifier.cpp.

References clang::NestedNameSpecifierLoc::getDataLength(), getKind(), getPrefix(), Global, Identifier, Namespace, NamespaceAlias, print(), Super, TypeSpec, and TypeSpecWithTemplate.

## ◆ getAsIdentifier()

IdentifierInfo* clang::NestedNameSpecifier::getAsIdentifier | ( |  | ) | const
| inline

Retrieve the identifier stored in this nested name specifier.

Definition at line 174 of file NestedNameSpecifier.h.

References getAsNamespace(), getAsNamespaceAlias(), and getAsRecordDecl().

Referenced by clang::ODRHash::AddNestedNameSpecifier(), clang::ASTRecordWriter::AddNestedNameSpecifierLoc(), Create(), clang::ASTContext::getCanonicalNestedNameSpecifier(), getNestedNameSpecifierIdentifiers(), clang::ASTImporter::Import(), isSameQualifier(), print(), clang::TreeTransform< Derived >::TransformNestedNameSpecifierLoc(), and clang::serialization::DataStreamBasicWriter< ASTRecordWriter >::writeNestedNameSpecifier().

## ◆ getAsNamespace()

NamespaceDecl * NestedNameSpecifier::getAsNamespace | ( |  | ) | const

Retrieve the namespace stored in this nested name specifier.

Definition at line 168 of file NestedNameSpecifier.cpp.

Referenced by clang::ODRHash::AddNestedNameSpecifier(), clang::ASTRecordWriter::AddNestedNameSpecifierLoc(), clang::Sema::computeDeclContext(), getAsIdentifier(), clang::ASTContext::getCanonicalNestedNameSpecifier(), clang::TypeName::getFullyQualifiedNestedNameSpecifier(), getNamespace(), getNestedNameSpecifierIdentifiers(), clang::ASTImporter::Import(), clang::index::IndexingContext::indexNestedNameSpecifierLoc(), print(), clang::TreeTransform< Derived >::TransformNestedNameSpecifierLoc(), clang::tooling::RecursiveSymbolVisitor< T >::TraverseNestedNameSpecifierLoc(), and clang::serialization::DataStreamBasicWriter< ASTRecordWriter >::writeNestedNameSpecifier().

## ◆ getAsNamespaceAlias()

NamespaceAliasDecl * NestedNameSpecifier::getAsNamespaceAlias | ( |  | ) | const

Retrieve the namespace alias stored in this nested name specifier.

Definition at line 176 of file NestedNameSpecifier.cpp.

Referenced by clang::ODRHash::AddNestedNameSpecifier(), clang::ASTRecordWriter::AddNestedNameSpecifierLoc(), clang::Sema::computeDeclContext(), getAsIdentifier(), clang::ASTContext::getCanonicalNestedNameSpecifier(), clang::TypeName::getFullyQualifiedNestedNameSpecifier(), getNamespace(), getNestedNameSpecifierIdentifiers(), clang::ASTImporter::Import(), clang::index::IndexingContext::indexNestedNameSpecifierLoc(), print(), clang::TreeTransform< Derived >::TransformNestedNameSpecifierLoc(), and clang::serialization::DataStreamBasicWriter< ASTRecordWriter >::writeNestedNameSpecifier().

## ◆ getAsRecordDecl()

CXXRecordDecl * NestedNameSpecifier::getAsRecordDecl | ( |  | ) | const

Retrieve the record declaration stored in this nested name specifier.

Definition at line 184 of file NestedNameSpecifier.cpp.

References clang::Type::getAsCXXRecordDecl(), and getAsType().

Referenced by clang::ASTRecordWriter::AddNestedNameSpecifierLoc(), clang::Sema::BuildUsingShadowDecl(), clang::Sema::computeDeclContext(), getAsIdentifier(), clang::ConstructorUsingShadowDecl::getNominatedBaseClass(), clang::ASTImporter::Import(), clang::Sema::LookupParsedName(), print(), clang::TreeTransform< Derived >::TransformNestedNameSpecifierLoc(), and clang::serialization::DataStreamBasicWriter< ASTRecordWriter >::writeNestedNameSpecifier().

## ◆ getAsType()

const Type* clang::NestedNameSpecifier::getAsType | ( |  | ) | const
| inline

Retrieve the type stored in this nested name specifier.

Definition at line 194 of file NestedNameSpecifier.h.

References containsUnexpandedParameterPack(), isDependent(), isInstantiationDependent(), and print().

Referenced by clang::TypoCorrectionConsumer::addNamespaces(), clang::ODRHash::AddNestedNameSpecifier(), clang::CodeGen::CodeGenFunction::BuildAppleKextVirtualCall(), clang::Sema::CheckInheritingConstructorUsingDecl(), clang::Sema::computeDeclContext(), containsUnexpandedParameterPack(), Create(), getAsRecordDecl(), clang::ASTContext::getCanonicalNestedNameSpecifier(), clang::Sema::getCurrentInstantiationOf(), clang::TypeName::getFullyQualifiedNestedNameSpecifier(), clang::NestedNameSpecifierLoc::getLocalSourceRange(), getNestedNameSpecifierIdentifiers(), clang::NestedNameSpecifierLoc::getTypeLoc(), clang::ASTImporter::Import(), isDependent(), isEnableIf(), isInstantiationDependent(), isSameQualifier(), MarkUsedTemplateParameters(), print(), ScopeSpecifierHasTemplateId(), clang::RecursiveASTVisitor< CallGraph >::TraverseNestedNameSpecifier(), and clang::serialization::DataStreamBasicWriter< ASTRecordWriter >::writeNestedNameSpecifier().

## ◆ getKind()

NestedNameSpecifier::SpecifierKind NestedNameSpecifier::getKind | ( |  | ) | const

Determine what kind of nested name specifier is stored.

Definition at line 142 of file NestedNameSpecifier.cpp.

References Global, Identifier, Namespace, NamespaceAlias, Super, TypeSpec, and TypeSpecWithTemplate.

Referenced by clang::Sema::ActOnUsingDirective(), clang::ODRHash::AddNestedNameSpecifier(), clang::ASTRecordWriter::AddNestedNameSpecifierLoc(), clang::CodeGen::CodeGenFunction::BuildAppleKextVirtualCall(), clang::Sema::computeDeclContext(), containsUnexpandedParameterPack(), dump(), clang::ASTContext::getCanonicalNestedNameSpecifier(), clang::TypeName::getFullyQualifiedNestedNameSpecifier(), clang::NestedNameSpecifierLoc::getLocalSourceRange(), getNestedNameSpecifierIdentifiers(), getPrefix(), clang::NestedNameSpecifierLoc::getTypeLoc(), clang::ASTImporter::Import(), clang::index::IndexingContext::indexNestedNameSpecifierLoc(), isDependent(), isFullyQualified(), isInstantiationDependent(), isSameQualifier(), clang::Sema::LookupParsedName(), print(), clang::TreeTransform< Derived >::TransformNestedNameSpecifierLoc(), clang::RecursiveASTVisitor< CallGraph >::TraverseNestedNameSpecifier(), clang::RecursiveASTVisitor< CallGraph >::TraverseNestedNameSpecifierLoc(), and clang::serialization::DataStreamBasicWriter< ASTRecordWriter >::writeNestedNameSpecifier().

## ◆ getPrefix()

NestedNameSpecifier* clang::NestedNameSpecifier::getPrefix | ( |  | ) | const
| inline

Return the prefix of this nested name specifier.

The prefix contains all of the parts of the nested name specifier that preced this current specifier. For example, for a nested name specifier that represents "foo::bar::", the current specifier will contain "bar::" and the prefix will contain "foo::".

Definition at line 167 of file NestedNameSpecifier.h.

References getKind().

Referenced by clang::ODRHash::AddNestedNameSpecifier(), containsUnexpandedParameterPack(), dump(), clang::ASTContext::getCanonicalNestedNameSpecifier(), clang::TypeName::getFullyQualifiedNestedNameSpecifier(), clang::NestedNameSpecifierLoc::getLocalSourceRange(), getNestedNameSpecifierIdentifiers(), clang::NestedNameSpecifierLoc::getPrefix(), clang::NestedNameSpecifierLoc::getTypeLoc(), clang::ASTImporter::Import(), isFullyQualified(), isSameQualifier(), MarkUsedTemplateParameters(), print(), ScopeSpecifierHasTemplateId(), clang::RecursiveASTVisitor< CallGraph >::TraverseNestedNameSpecifier(), warnAboutRedundantParens(), and clang::serialization::DataStreamBasicWriter< ASTRecordWriter >::writeNestedNameSpecifier().

## ◆ GlobalSpecifier()

NestedNameSpecifier * NestedNameSpecifier::GlobalSpecifier | ( | const ASTContext & | Context | ) |
| static

Returns the nested name specifier representing the global scope.

Definition at line 125 of file NestedNameSpecifier.cpp.

Referenced by clang::TypeName::createNestedNameSpecifierForScopeOf(), clang::TypeName::createOuterNNS(), clang::ASTImporter::Import(), clang::NestedNameSpecifierLocBuilder::MakeGlobal(), and clang::serialization::DataStreamBasicReader< ASTRecordReader >::readNestedNameSpecifier().

## ◆ isDependent()

bool NestedNameSpecifier::isDependent | ( |  | ) | const

Whether this nested name specifier refers to a dependent type or not.

Definition at line 202 of file NestedNameSpecifier.cpp.

References clang::CXXRecordDecl::bases(), getAsType(), getKind(), Global, Identifier, clang::Type::isDependentType(), Namespace, NamespaceAlias, Super, TypeSpec, and TypeSpecWithTemplate.

Referenced by clang::Sema::CheckTypenameType(), clang::Sema::CheckUsingDeclRedeclaration(), clang::Sema::computeDeclContext(), Create(), getAsType(), clang::Sema::getCurrentInstantiationOf(), clang::ASTContext::getDependentTemplateName(), clang::Sema::isDependentScopeSpecifier(), and clang::TreeTransform< Derived >::RebuildDependentNameType().

## ◆ isInstantiationDependent()

bool NestedNameSpecifier::isInstantiationDependent | ( |  | ) | const

Whether this nested name specifier involves a template parameter.

Whether this nested name specifier refers to a dependent type or not.

Definition at line 232 of file NestedNameSpecifier.cpp.

References getAsType(), getKind(), Global, Identifier, clang::Type::isInstantiationDependentType(), Namespace, NamespaceAlias, Super, TypeSpec, and TypeSpecWithTemplate.

Referenced by getAsType(), clang::OverloadExpr::OverloadExpr(), and clang::ConceptSpecializationExpr::setTemplateArguments().

## ◆ operator=()

NestedNameSpecifier& clang::NestedNameSpecifier::operator= | ( | const NestedNameSpecifier & |  | ) |
| delete

## ◆ print()

void NestedNameSpecifier::print | ( | raw_ostream & | OS,
|  | const PrintingPolicy & | Policy,
|  | bool | ResolveTemplateArguments = `false`
| ) |  | const

Print this nested name specifier to the given output stream.

If `ResolveTemplateArguments` is true, we'll print actual types, e.g. `ns::SomeTemplate<int, MyClass>` instead of `ns::SomeTemplate<Container::value_type, T>`.

Definition at line 273 of file NestedNameSpecifier.cpp.

References getAsIdentifier(), getAsNamespace(), getAsNamespaceAlias(), getAsRecordDecl(), getAsType(), getKind(), clang::IdentifierInfo::getName(), clang::NamedDecl::getName(), getPrefix(), Global, Identifier, Namespace, NamespaceAlias, print(), clang::QualType::print(), clang::printTemplateArgumentList(), Super, clang::PrintingPolicy::SuppressScope, TypeSpec, and TypeSpecWithTemplate.

Referenced by dump(), getAsType(), getExpressionTraitName(), clang::getParameterABISpelling(), lookThroughRangesV3Condition(), print(), clang::TextNodeDumper::VisitUnresolvedUsingTypenameDecl(), clang::TextNodeDumper::VisitUnresolvedUsingValueDecl(), and clang::TextNodeDumper::VisitUsingDecl().

## ◆ Profile()

void clang::NestedNameSpecifier::Profile | ( | llvm::FoldingSetNodeID & | ID | ) | const
| inline

Definition at line 221 of file NestedNameSpecifier.h.

References dump().

## ◆ SuperSpecifier()

NestedNameSpecifier * NestedNameSpecifier::SuperSpecifier | ( | const ASTContext & | Context,
|  | CXXRecordDecl * | RD
| ) |  |
| static

Returns the nested name specifier representing the __super scope for the given CXXRecordDecl.

Definition at line 133 of file NestedNameSpecifier.cpp.

Referenced by clang::ASTImporter::Import(), clang::NestedNameSpecifierLocBuilder::MakeSuper(), and clang::serialization::DataStreamBasicReader< ASTRecordReader >::readNestedNameSpecifier().

The documentation for this class was generated from the following files:

- include/clang/AST/NestedNameSpecifier.h
- lib/AST/NestedNameSpecifier.cpp