diff options
Diffstat (limited to 'include/clang/AST/NestedNameSpecifier.h')
-rw-r--r-- | include/clang/AST/NestedNameSpecifier.h | 103 |
1 files changed, 55 insertions, 48 deletions
diff --git a/include/clang/AST/NestedNameSpecifier.h b/include/clang/AST/NestedNameSpecifier.h index c81c06e..b5bd824 100644 --- a/include/clang/AST/NestedNameSpecifier.h +++ b/include/clang/AST/NestedNameSpecifier.h @@ -17,6 +17,7 @@ #include "clang/Basic/Diagnostic.h" #include "llvm/ADT/FoldingSet.h" #include "llvm/ADT/PointerIntPair.h" +#include "llvm/Support/Compiler.h" namespace clang { @@ -36,8 +37,9 @@ class LangOptions; /// namespaces. 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), or the global specifier ('::', must be the -/// first specifier). +/// (for dependent names), decltype specifier, or the global specifier ('::'). +/// The last two specifiers can only appear at the start of a +/// nested-namespace-specifier. class NestedNameSpecifier : public llvm::FoldingSetNode { /// \brief Enumeration describing @@ -95,7 +97,8 @@ private: Specifier(Other.Specifier) { } - NestedNameSpecifier &operator=(const NestedNameSpecifier &); // do not implement + NestedNameSpecifier &operator=(const NestedNameSpecifier &); // do not + // implement /// \brief Either find or insert the given nested name specifier /// mockup in the given context. @@ -221,12 +224,12 @@ class NestedNameSpecifierLoc { public: /// \brief Construct an empty nested-name-specifier. NestedNameSpecifierLoc() : Qualifier(0), Data(0) { } - + /// \brief Construct a nested-name-specifier with source location information - /// from + /// from NestedNameSpecifierLoc(NestedNameSpecifier *Qualifier, void *Data) : Qualifier(Qualifier), Data(Data) { } - + /// \brief Evalutes true when this nested-name-specifier location is /// non-empty. operator bool() const { return Qualifier; } @@ -239,14 +242,14 @@ public: /// \brief Retrieve the opaque pointer that refers to source-location data. void *getOpaqueData() const { return Data; } - + /// \brief Retrieve the source range covering the entirety of this /// nested-name-specifier. /// /// For example, if this instance refers to a nested-name-specifier /// \c ::std::vector<int>::, the returned source range would cover /// from the initial '::' to the last '::'. - SourceRange getSourceRange() const; + SourceRange getSourceRange() const LLVM_READONLY; /// \brief Retrieve the source range covering just the last part of /// this nested-name-specifier, not including the prefix. @@ -258,25 +261,25 @@ public: /// \brief Retrieve the location of the beginning of this /// nested-name-specifier. - SourceLocation getBeginLoc() const { + SourceLocation getBeginLoc() const { return getSourceRange().getBegin(); } /// \brief Retrieve the location of the end of this /// nested-name-specifier. - SourceLocation getEndLoc() const { + SourceLocation getEndLoc() const { return getSourceRange().getEnd(); } /// \brief Retrieve the location of the beginning of this /// component of the nested-name-specifier. - SourceLocation getLocalBeginLoc() const { + SourceLocation getLocalBeginLoc() const { return getLocalSourceRange().getBegin(); } - + /// \brief Retrieve the location of the end of this component of the /// nested-name-specifier. - SourceLocation getLocalEndLoc() const { + SourceLocation getLocalEndLoc() const { return getLocalSourceRange().getEnd(); } @@ -300,13 +303,13 @@ public: /// \brief Determines the data length for the entire /// nested-name-specifier. unsigned getDataLength() const { return getDataLength(Qualifier); } - - friend bool operator==(NestedNameSpecifierLoc X, + + friend bool operator==(NestedNameSpecifierLoc X, NestedNameSpecifierLoc Y) { return X.Qualifier == Y.Qualifier && X.Data == Y.Data; } - friend bool operator!=(NestedNameSpecifierLoc X, + friend bool operator!=(NestedNameSpecifierLoc X, NestedNameSpecifierLoc Y) { return !(X == Y); } @@ -316,39 +319,43 @@ public: /// with source-location information for all of the components of the /// nested-name-specifier. class NestedNameSpecifierLocBuilder { - /// \brief The current representation of the nested-name-specifier we're + /// \brief The current representation of the nested-name-specifier we're /// building. NestedNameSpecifier *Representation; - + /// \brief Buffer used to store source-location information for the /// nested-name-specifier. /// - /// Note that we explicitly manage the buffer (rather than using a + /// Note that we explicitly manage the buffer (rather than using a /// SmallVector) because \c Declarator expects it to be possible to memcpy() /// a \c CXXScopeSpec, and CXXScopeSpec uses a NestedNameSpecifierLocBuilder. char *Buffer; - + /// \brief The size of the buffer used to store source-location information /// for the nested-name-specifier. unsigned BufferSize; - - /// \brief The capacity of the buffer used to store source-location + + /// \brief The capacity of the buffer used to store source-location /// information for the nested-name-specifier. unsigned BufferCapacity; public: - NestedNameSpecifierLocBuilder(); - + NestedNameSpecifierLocBuilder() + : Representation(0), Buffer(0), BufferSize(0), BufferCapacity(0) { } + NestedNameSpecifierLocBuilder(const NestedNameSpecifierLocBuilder &Other); - + NestedNameSpecifierLocBuilder & operator=(const NestedNameSpecifierLocBuilder &Other); - - ~NestedNameSpecifierLocBuilder(); - + + ~NestedNameSpecifierLocBuilder() { + if (BufferCapacity) + free(Buffer); + } + /// \brief Retrieve the representation of the nested-name-specifier. NestedNameSpecifier *getRepresentation() const { return Representation; } - + /// \brief Extend the current nested-name-specifier by another /// nested-name-specifier component of the form 'type::'. /// @@ -362,8 +369,8 @@ public: /// \param ColonColonLoc The location of the trailing '::'. void Extend(ASTContext &Context, SourceLocation TemplateKWLoc, TypeLoc TL, SourceLocation ColonColonLoc); - - /// \brief Extend the current nested-name-specifier by another + + /// \brief Extend the current nested-name-specifier by another /// nested-name-specifier component of the form 'identifier::'. /// /// \param Context The AST context in which this nested-name-specifier @@ -376,8 +383,8 @@ public: /// \param ColonColonLoc The location of the trailing '::'. void Extend(ASTContext &Context, IdentifierInfo *Identifier, SourceLocation IdentifierLoc, SourceLocation ColonColonLoc); - - /// \brief Extend the current nested-name-specifier by another + + /// \brief Extend the current nested-name-specifier by another /// nested-name-specifier component of the form 'namespace::'. /// /// \param Context The AST context in which this nested-name-specifier @@ -390,8 +397,8 @@ public: /// \param ColonColonLoc The location of the trailing '::'. void Extend(ASTContext &Context, NamespaceDecl *Namespace, SourceLocation NamespaceLoc, SourceLocation ColonColonLoc); - - /// \brief Extend the current nested-name-specifier by another + + /// \brief Extend the current nested-name-specifier by another /// nested-name-specifier component of the form 'namespace-alias::'. /// /// \param Context The AST context in which this nested-name-specifier @@ -399,35 +406,35 @@ public: /// /// \param Alias The namespace alias. /// - /// \param AliasLoc The location of the namespace alias + /// \param AliasLoc The location of the namespace alias /// name. /// /// \param ColonColonLoc The location of the trailing '::'. void Extend(ASTContext &Context, NamespaceAliasDecl *Alias, SourceLocation AliasLoc, SourceLocation ColonColonLoc); - + /// \brief Turn this (empty) nested-name-specifier into the global /// nested-name-specifier '::'. void MakeGlobal(ASTContext &Context, SourceLocation ColonColonLoc); - + /// \brief Make a new nested-name-specifier from incomplete source-location /// information. /// /// This routine should be used very, very rarely, in cases where we /// need to synthesize a nested-name-specifier. Most code should instead use /// \c Adopt() with a proper \c NestedNameSpecifierLoc. - void MakeTrivial(ASTContext &Context, NestedNameSpecifier *Qualifier, + void MakeTrivial(ASTContext &Context, NestedNameSpecifier *Qualifier, SourceRange R); - - /// \brief Adopt an existing nested-name-specifier (with source-range + + /// \brief Adopt an existing nested-name-specifier (with source-range /// information). void Adopt(NestedNameSpecifierLoc Other); - + /// \brief Retrieve the source range covered by this nested-name-specifier. - SourceRange getSourceRange() const { + SourceRange getSourceRange() const LLVM_READONLY { return NestedNameSpecifierLoc(Representation, Buffer).getSourceRange(); } - + /// \brief Retrieve a nested-name-specifier with location information, /// copied into the given AST context. /// @@ -449,7 +456,7 @@ public: Representation = 0; BufferSize = 0; } - + /// \brief Retrieve the underlying buffer. /// /// \returns A pair containing a pointer to the buffer of source-location @@ -459,9 +466,9 @@ public: return std::make_pair(Buffer, BufferSize); } }; - -/// Insertion operator for diagnostics. This allows sending NestedNameSpecifiers -/// into a diagnostic with <<. + +/// Insertion operator for diagnostics. This allows sending +/// NestedNameSpecifiers into a diagnostic with <<. inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, NestedNameSpecifier *NNS) { DB.AddTaggedVal(reinterpret_cast<intptr_t>(NNS), |