DeclSpec.h revision 561d3abc881033776ece385a01a510e1cbc1fa92
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===--- DeclSpec.h - Parsed declaration specifiers -------------*- C++ -*-===//
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// License. See LICENSE.TXT for details.
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//===----------------------------------------------------------------------===//
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file defines the classes used to store parsed information about
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// declaration-specifiers and declarators.
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)//   static const int volatile x, *y, *(*(*z)[10])(const void *x);
1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)//   ------------------------- -  --  ---------------------------
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//     declaration-specifiers  \  |   /
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//                            declarators
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//===----------------------------------------------------------------------===//
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#ifndef LLVM_CLANG_SEMA_DECLSPEC_H
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define LLVM_CLANG_SEMA_DECLSPEC_H
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "clang/Sema/AttributeList.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "clang/Sema/Ownership.h"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "clang/AST/NestedNameSpecifier.h"
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "clang/Lex/Token.h"
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "clang/Basic/ExceptionSpecificationType.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "clang/Basic/OperatorKinds.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "clang/Basic/Specifiers.h"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/ADT/SmallVector.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/Support/ErrorHandling.h"
32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace clang {
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class ASTContext;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class TypeLoc;
36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  class LangOptions;
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  class DiagnosticsEngine;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class IdentifierInfo;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class NamespaceAliasDecl;
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class NamespaceDecl;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class NestedNameSpecifier;
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  class NestedNameSpecifierLoc;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class ObjCDeclSpec;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class Preprocessor;
45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  class Sema;
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class Declarator;
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  struct TemplateIdAnnotation;
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)/// CXXScopeSpec - Represents a C++ nested-name-specifier or a global scope
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)/// specifier.  These can be in 3 states:
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)///   1) Not present, identified by isEmpty()
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)///   2) Present, identified by isNotEmpty()
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)///      2.a) Valid, idenified by isValid()
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)///      2.b) Invalid, identified by isInvalid().
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)///
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)/// isSet() is deprecated because it mostly corresponded to "valid" but was
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)/// often used as if it meant "present".
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch///
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// The actual scope is described by getScopeRep().
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass CXXScopeSpec {
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SourceRange Range;
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  NestedNameSpecifierLocBuilder Builder;
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochpublic:
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const SourceRange &getRange() const { return Range; }
667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void setRange(const SourceRange &R) { Range = R; }
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void setBeginLoc(SourceLocation Loc) { Range.setBegin(Loc); }
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void setEndLoc(SourceLocation Loc) { Range.setEnd(Loc); }
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SourceLocation getBeginLoc() const { return Range.getBegin(); }
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SourceLocation getEndLoc() const { return Range.getEnd(); }
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \brief Retrieve the representation of the nested-name-specifier.
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NestedNameSpecifier *getScopeRep() const {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return Builder.getRepresentation();
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \brief Extend the current nested-name-specifier by another
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// nested-name-specifier component of the form 'type::'.
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  /// \param Context The AST context in which this nested-name-specifier
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /// resides.
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  /// \param TemplateKWLoc The location of the 'template' keyword, if present.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \param TL The TypeLoc that describes the type preceding the '::'.
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ///
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// \param ColonColonLoc The location of the trailing '::'.
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Extend(ASTContext &Context, SourceLocation TemplateKWLoc, TypeLoc TL,
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch              SourceLocation ColonColonLoc);
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// \brief Extend the current nested-name-specifier by another
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// nested-name-specifier component of the form 'identifier::'.
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ///
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \param Context The AST context in which this nested-name-specifier
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// resides.
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \param Identifier The identifier.
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ///
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// \param IdentifierLoc The location of the identifier.
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// \param ColonColonLoc The location of the trailing '::'.
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void Extend(ASTContext &Context, IdentifierInfo *Identifier,
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              SourceLocation IdentifierLoc, SourceLocation ColonColonLoc);
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// \brief Extend the current nested-name-specifier by another
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// nested-name-specifier component of the form 'namespace::'.
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ///
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// \param Context The AST context in which this nested-name-specifier
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// resides.
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ///
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \param Namespace The namespace.
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \param NamespaceLoc The location of the namespace name.
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \param ColonColonLoc The location of the trailing '::'.
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Extend(ASTContext &Context, NamespaceDecl *Namespace,
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)              SourceLocation NamespaceLoc, SourceLocation ColonColonLoc);
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// \brief Extend the current nested-name-specifier by another
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// nested-name-specifier component of the form 'namespace-alias::'.
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ///
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// \param Context The AST context in which this nested-name-specifier
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// resides.
12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ///
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// \param Alias The namespace alias.
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ///
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// \param AliasLoc The location of the namespace alias
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// name.
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ///
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// \param ColonColonLoc The location of the trailing '::'.
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void Extend(ASTContext &Context, NamespaceAliasDecl *Alias,
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)              SourceLocation AliasLoc, SourceLocation ColonColonLoc);
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// \brief Turn this (empty) nested-name-specifier into the global
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// nested-name-specifier '::'.
13658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  void MakeGlobal(ASTContext &Context, SourceLocation ColonColonLoc);
13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
13858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  /// \brief Make a new nested-name-specifier from incomplete source-location
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// information.
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ///
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// FIXME: This routine should be used very, very rarely, in cases where we
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// need to synthesize a nested-name-specifier. Most code should instead use
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// \c Adopt() with a proper \c NestedNameSpecifierLoc.
1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void MakeTrivial(ASTContext &Context, NestedNameSpecifier *Qualifier,
1453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                   SourceRange R);
1463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  /// \brief Adopt an existing nested-name-specifier (with source-range
1483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  /// information).
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void Adopt(NestedNameSpecifierLoc Other);
1503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  /// \brief Retrieve a nested-name-specifier with location information, copied
1523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  /// into the given AST context.
1533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ///
1543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  /// \param Context The context into which this nested-name-specifier will be
1553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  /// copied.
1563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const;
1573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  /// \brief Retrieve the location of the name in the last qualifier
1593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  /// in this nested name specifier.  For example:
1603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ///   ::foo::bar<0>::
1613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ///          ^~~
1623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  SourceLocation getLastQualifierNameLoc() const;
1633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// No scope specifier.
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool isEmpty() const { return !Range.isValid(); }
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// A scope specifier is present, but may be valid or invalid.
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool isNotEmpty() const { return !isEmpty(); }
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// An error occurred during parsing of the scope specifier.
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool isInvalid() const { return isNotEmpty() && getScopeRep() == 0; }
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// A scope specifier is present, and it refers to a real scope.
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool isValid() const { return isNotEmpty() && getScopeRep() != 0; }
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// \brief Indicate that this nested-name-specifier is invalid.
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetInvalid(SourceRange R) {
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    assert(R.isValid() && "Must have a valid source range");
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (Range.getBegin().isInvalid())
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Range.setBegin(R.getBegin());
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Range.setEnd(R.getEnd());
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Builder.Clear();
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// Deprecated.  Some call sites intend isNotEmpty() while others intend
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// isValid().
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool isSet() const { return getScopeRep() != 0; }
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void clear() {
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Range = SourceRange();
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    Builder.Clear();
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \brief Retrieve the data associated with the source-location information.
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  char *location_data() const { return Builder.getBuffer().first; }
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  /// \brief Retrieve the size of the data associated with source-location
196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  /// information.
197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  unsigned location_size() const { return Builder.getBuffer().second; }
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/// DeclSpec - This class captures information about "declaration specifiers",
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// which encompasses storage-class-specifiers, type-specifiers,
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// type-qualifiers, and function-specifiers.
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DeclSpec {
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)public:
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // storage-class-specifier
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Note: The order of these enumerators is important for diagnostics.
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum SCS {
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SCS_unspecified = 0,
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SCS_typedef,
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SCS_extern,
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SCS_static,
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    SCS_auto,
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SCS_register,
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SCS_private_extern,
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SCS_mutable
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Import type specifier width enumeration and constants.
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef TypeSpecifierWidth TSW;
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static const TSW TSW_unspecified = clang::TSW_unspecified;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const TSW TSW_short = clang::TSW_short;
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static const TSW TSW_long = clang::TSW_long;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const TSW TSW_longlong = clang::TSW_longlong;
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum TSC {
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    TSC_unspecified,
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    TSC_imaginary,
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    TSC_complex
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Import type specifier sign enumeration and constants.
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef TypeSpecifierSign TSS;
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const TSS TSS_unspecified = clang::TSS_unspecified;
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static const TSS TSS_signed = clang::TSS_signed;
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static const TSS TSS_unsigned = clang::TSS_unsigned;
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Import type specifier type enumeration and constants.
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef TypeSpecifierType TST;
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static const TST TST_unspecified = clang::TST_unspecified;
2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static const TST TST_void = clang::TST_void;
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const TST TST_char = clang::TST_char;
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static const TST TST_wchar = clang::TST_wchar;
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static const TST TST_char16 = clang::TST_char16;
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static const TST TST_char32 = clang::TST_char32;
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  static const TST TST_int = clang::TST_int;
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const TST TST_half = clang::TST_half;
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const TST TST_float = clang::TST_float;
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const TST TST_double = clang::TST_double;
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const TST TST_bool = clang::TST_bool;
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const TST TST_decimal32 = clang::TST_decimal32;
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const TST TST_decimal64 = clang::TST_decimal64;
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const TST TST_decimal128 = clang::TST_decimal128;
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const TST TST_enum = clang::TST_enum;
25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static const TST TST_union = clang::TST_union;
255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static const TST TST_struct = clang::TST_struct;
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const TST TST_class = clang::TST_class;
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const TST TST_typename = clang::TST_typename;
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const TST TST_typeofType = clang::TST_typeofType;
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const TST TST_typeofExpr = clang::TST_typeofExpr;
260010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  static const TST TST_decltype = clang::TST_decltype;
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const TST TST_underlyingType = clang::TST_underlyingType;
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const TST TST_auto = clang::TST_auto;
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const TST TST_unknown_anytype = clang::TST_unknown_anytype;
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static const TST TST_atomic = clang::TST_atomic;
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const TST TST_error = clang::TST_error;
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // type-qualifiers
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  enum TQ {   // NOTE: These flags must be kept in sync with Qualifiers::TQ.
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TQ_unspecified = 0,
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TQ_const       = 1,
27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TQ_restrict    = 2,
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    TQ_volatile    = 4
27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// ParsedSpecifiers - Flags to query which specifiers were applied.  This is
27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// returned by getParsedSpecifiers.
27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  enum ParsedSpecifiers {
27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PQ_None                  = 0,
27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PQ_StorageClassSpecifier = 1,
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PQ_TypeSpecifier         = 2,
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PQ_TypeQualifier         = 4,
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    PQ_FunctionSpecifier     = 8
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)private:
28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // storage-class-specifier
28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /*SCS*/unsigned StorageClassSpec : 3;
28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  unsigned SCS_thread_specified : 1;
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  unsigned SCS_extern_in_linkage_spec : 1;
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // type-specifier
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /*TSW*/unsigned TypeSpecWidth : 2;
293868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /*TSC*/unsigned TypeSpecComplex : 2;
294868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /*TSS*/unsigned TypeSpecSign : 2;
295868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /*TST*/unsigned TypeSpecType : 5;
296868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  unsigned TypeAltiVecVector : 1;
297868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  unsigned TypeAltiVecPixel : 1;
298868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  unsigned TypeAltiVecBool : 1;
299868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  unsigned TypeSpecOwned : 1;
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
301868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // type-qualifiers
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  unsigned TypeQualifiers : 3;  // Bitwise OR of TQ.
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // function-specifier
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  unsigned FS_inline_specified : 1;
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  unsigned FS_virtual_specified : 1;
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  unsigned FS_explicit_specified : 1;
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // friend-specifier
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  unsigned Friend_specified : 1;
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // constexpr-specifier
31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  unsigned Constexpr_specified : 1;
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /*SCS*/unsigned StorageClassSpecAsWritten : 3;
316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
317a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  union {
318a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    UnionParsedType TypeRep;
31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    Decl *DeclRep;
32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    Expr *ExprRep;
32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // attributes.
3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ParsedAttributes Attrs;
3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Scope specifier for the type spec, if applicable.
3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CXXScopeSpec TypeScope;
3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // List of protocol qualifiers for objective-c classes.  Used for
3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // protocol-qualified interfaces "NString<foo>" and protocol-qualified id
3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // "id<foo>".
3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Decl * const *ProtocolQualifiers;
3337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  unsigned NumProtocolQualifiers;
3347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SourceLocation ProtocolLAngleLoc;
3357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SourceLocation *ProtocolLocs;
3367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // SourceLocation info.  These are null if the item wasn't specified or if
3387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // the setting was synthesized.
3397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SourceRange Range;
3407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SourceLocation StorageClassSpecLoc, SCS_threadLoc;
34258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SourceLocation TSWLoc, TSCLoc, TSSLoc, TSTLoc, AltiVecLoc;
34358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// TSTNameLoc - If TypeSpecType is any of class, enum, struct, union,
34458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// typename, then this is the location of the named type (if present);
34558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// otherwise, it is the same as TSTLoc. Hence, the pair TSTLoc and
34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// TSTNameLoc provides source range info for tag types.
3477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SourceLocation TSTNameLoc;
34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SourceRange TypeofParensRange;
34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SourceLocation TQ_constLoc, TQ_restrictLoc, TQ_volatileLoc;
35058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SourceLocation FS_inlineLoc, FS_virtualLoc, FS_explicitLoc;
35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SourceLocation FriendLoc, ModulePrivateLoc, ConstexprLoc;
35258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  WrittenBuiltinSpecs writtenBS;
354ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void SaveWrittenBuiltinSpecs();
35558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void SaveStorageSpecifierAsWritten();
356ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ObjCDeclSpec *ObjCQualifiers;
35858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
359ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  static bool isTypeRep(TST T) {
36058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return (T == TST_typename || T == TST_typeofType ||
36158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            T == TST_underlyingType || T == TST_atomic);
36258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
36358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static bool isExprRep(TST T) {
36458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return (T == TST_typeofExpr || T == TST_decltype);
36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static bool isDeclRep(TST T) {
36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return (T == TST_enum || T == TST_struct ||
36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            T == TST_union || T == TST_class);
36958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
37058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
37158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DeclSpec(const DeclSpec&);       // DO NOT IMPLEMENT
37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void operator=(const DeclSpec&); // DO NOT IMPLEMENT
37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)public:
3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DeclSpec(AttributeFactory &attrFactory)
3764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : StorageClassSpec(SCS_unspecified),
37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SCS_thread_specified(false),
378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      SCS_extern_in_linkage_spec(false),
3794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      TypeSpecWidth(TSW_unspecified),
38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      TypeSpecComplex(TSC_unspecified),
381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      TypeSpecSign(TSS_unspecified),
3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      TypeSpecType(TST_unspecified),
3834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      TypeAltiVecVector(false),
3844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      TypeAltiVecPixel(false),
38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      TypeAltiVecBool(false),
386ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      TypeSpecOwned(false),
3877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      TypeQualifiers(TQ_unspecified),
388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FS_inline_specified(false),
389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FS_virtual_specified(false),
39058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      FS_explicit_specified(false),
391ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      Friend_specified(false),
39258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      Constexpr_specified(false),
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      StorageClassSpecAsWritten(SCS_unspecified),
3944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      Attrs(attrFactory),
39558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ProtocolQualifiers(0),
396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      NumProtocolQualifiers(0),
3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ProtocolLocs(0),
3984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      writtenBS(),
3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      ObjCQualifiers(0) {
40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ~DeclSpec() {
4027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    delete [] ProtocolQualifiers;
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    delete [] ProtocolLocs;
4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
40558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // storage-class-specifier
4067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SCS getStorageClassSpec() const { return (SCS)StorageClassSpec; }
4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool isThreadSpecified() const { return SCS_thread_specified; }
408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool isExternInLinkageSpec() const { return SCS_extern_in_linkage_spec; }
4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void setExternInLinkageSpec(bool Value) {
41058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SCS_extern_in_linkage_spec = Value;
411ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SourceLocation getStorageClassSpecLoc() const { return StorageClassSpecLoc; }
4144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SourceLocation getThreadSpecLoc() const { return SCS_threadLoc; }
41558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
416ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void ClearStorageClassSpecs() {
4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    StorageClassSpec     = DeclSpec::SCS_unspecified;
4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SCS_thread_specified = false;
4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    SCS_extern_in_linkage_spec = false;
42058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    StorageClassSpecLoc  = SourceLocation();
421ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    SCS_threadLoc        = SourceLocation();
4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
4234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // type-specifier
42558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TSW getTypeSpecWidth() const { return (TSW)TypeSpecWidth; }
42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TSC getTypeSpecComplex() const { return (TSC)TypeSpecComplex; }
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TSS getTypeSpecSign() const { return (TSS)TypeSpecSign; }
428a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  TST getTypeSpecType() const { return (TST)TypeSpecType; }
429a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool isTypeAltiVecVector() const { return TypeAltiVecVector; }
430a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool isTypeAltiVecPixel() const { return TypeAltiVecPixel; }
431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool isTypeAltiVecBool() const { return TypeAltiVecBool; }
432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool isTypeSpecOwned() const { return TypeSpecOwned; }
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ParsedType getRepAsType() const {
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    assert(isTypeRep((TST) TypeSpecType) && "DeclSpec does not store a type");
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return TypeRep;
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Decl *getRepAsDecl() const {
438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    assert(isDeclRep((TST) TypeSpecType) && "DeclSpec does not store a decl");
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return DeclRep;
44058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
4417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Expr *getRepAsExpr() const {
4427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    assert(isExprRep((TST) TypeSpecType) && "DeclSpec does not store an expr");
4434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return ExprRep;
44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CXXScopeSpec &getTypeSpecScope() { return TypeScope; }
44658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const CXXScopeSpec &getTypeSpecScope() const { return TypeScope; }
4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
44858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const SourceRange &getSourceRange() const { return Range; }
44958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SourceLocation getTypeSpecWidthLoc() const { return TSWLoc; }
4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SourceLocation getTypeSpecComplexLoc() const { return TSCLoc; }
4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SourceLocation getTypeSpecSignLoc() const { return TSSLoc; }
4524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SourceLocation getTypeSpecTypeLoc() const { return TSTLoc; }
4534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SourceLocation getAltiVecLoc() const { return AltiVecLoc; }
4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  SourceLocation getTypeSpecTypeNameLoc() const {
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    assert(isDeclRep((TST) TypeSpecType) || TypeSpecType == TST_typename);
4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return TSTNameLoc;
4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SourceRange getTypeofParensRange() const { return TypeofParensRange; }
46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void setTypeofParensRange(SourceRange range) { TypeofParensRange = range; }
46258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// getSpecifierName - Turn a type-specifier-type into a string like "_Bool"
46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// or "union".
46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char *getSpecifierName(DeclSpec::TST T);
46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char *getSpecifierName(DeclSpec::TQ Q);
46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char *getSpecifierName(DeclSpec::TSS S);
46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char *getSpecifierName(DeclSpec::TSC C);
46958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char *getSpecifierName(DeclSpec::TSW W);
47058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static const char *getSpecifierName(DeclSpec::SCS S);
47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // type-qualifiers
47358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// getTypeQualifiers - Return a set of TQs.
47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  unsigned getTypeQualifiers() const { return TypeQualifiers; }
47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SourceLocation getConstSpecLoc() const { return TQ_constLoc; }
47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SourceLocation getRestrictSpecLoc() const { return TQ_restrictLoc; }
47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SourceLocation getVolatileSpecLoc() const { return TQ_volatileLoc; }
47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// \brief Clear out all of the type qualifiers.
48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void ClearTypeQualifiers() {
48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    TypeQualifiers = 0;
48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    TQ_constLoc = SourceLocation();
48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    TQ_restrictLoc = SourceLocation();
48558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    TQ_volatileLoc = SourceLocation();
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
48758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
48858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // function-specifier
489d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool isInlineSpecified() const { return FS_inline_specified; }
490d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  SourceLocation getInlineSpecLoc() const { return FS_inlineLoc; }
491d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
492d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool isVirtualSpecified() const { return FS_virtual_specified; }
493d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  SourceLocation getVirtualSpecLoc() const { return FS_virtualLoc; }
494d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
495d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool isExplicitSpecified() const { return FS_explicit_specified; }
4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SourceLocation getExplicitSpecLoc() const { return FS_explicitLoc; }
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
498d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void ClearFunctionSpecs() {
4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    FS_inline_specified = false;
500d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    FS_inlineLoc = SourceLocation();
501d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    FS_virtual_specified = false;
502d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    FS_virtualLoc = SourceLocation();
503d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    FS_explicit_specified = false;
504d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    FS_explicitLoc = SourceLocation();
505d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
506d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
507d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  /// hasTypeSpecifier - Return true if any type-specifier has been found.
508d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool hasTypeSpecifier() const {
509d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return getTypeSpecType() != DeclSpec::TST_unspecified ||
510d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)           getTypeSpecWidth() != DeclSpec::TSW_unspecified ||
511d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)           getTypeSpecComplex() != DeclSpec::TSC_unspecified ||
5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)           getTypeSpecSign() != DeclSpec::TSS_unspecified;
5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// getParsedSpecifiers - Return a bitmask of which flavors of specifiers this
5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// DeclSpec includes.
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ///
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  unsigned getParsedSpecifiers() const;
5195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SCS getStorageClassSpecAsWritten() const {
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return (SCS)StorageClassSpecAsWritten;
522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /// isEmpty - Return true if this declaration specifier is completely empty:
525a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  /// no tokens were parsed in the production of it.
526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool isEmpty() const {
527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return getParsedSpecifiers() == DeclSpec::PQ_None;
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetRangeStart(SourceLocation Loc) { Range.setBegin(Loc); }
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetRangeEnd(SourceLocation Loc) { Range.setEnd(Loc); }
5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// These methods set the specified attribute of the DeclSpec and
53423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  /// return false if there was no error.  If an error occurs (for
53523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  /// example, if we tried to set "auto" on a spec with "extern"
53623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  /// already set), they return true and set PrevSpec and DiagID
53723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  /// such that
53823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ///   Diag(Loc, DiagID) << PrevSpec;
53923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  /// will yield a useful result.
54023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  ///
54123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  /// TODO: use a more general approach that still allows these
54223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  /// diagnostics to be ignored when desired.
54323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc,
54423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                           const char *&PrevSpec, unsigned &DiagID);
54523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool SetStorageClassSpecThread(SourceLocation Loc, const char *&PrevSpec,
54623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                 unsigned &DiagID);
54723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool SetTypeSpecWidth(TSW W, SourceLocation Loc, const char *&PrevSpec,
54823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                        unsigned &DiagID);
54923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool SetTypeSpecComplex(TSC C, SourceLocation Loc, const char *&PrevSpec,
55023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                          unsigned &DiagID);
55123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool SetTypeSpecSign(TSS S, SourceLocation Loc, const char *&PrevSpec,
55223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       unsigned &DiagID);
55323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec,
55423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       unsigned &DiagID);
555010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec,
556010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       unsigned &DiagID, ParsedType Rep);
557010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec,
558010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       unsigned &DiagID, Decl *Rep, bool Owned);
559010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetTypeSpecType(TST T, SourceLocation TagKwLoc,
560010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       SourceLocation TagNameLoc, const char *&PrevSpec,
561010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       unsigned &DiagID, ParsedType Rep);
562010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetTypeSpecType(TST T, SourceLocation TagKwLoc,
563010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       SourceLocation TagNameLoc, const char *&PrevSpec,
564010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       unsigned &DiagID, Decl *Rep, bool Owned);
565010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
566010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec,
567010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       unsigned &DiagID, Expr *Rep);
568010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetTypeAltiVecVector(bool isAltiVecVector, SourceLocation Loc,
569010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       const char *&PrevSpec, unsigned &DiagID);
570010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetTypeAltiVecPixel(bool isAltiVecPixel, SourceLocation Loc,
571010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                       const char *&PrevSpec, unsigned &DiagID);
572010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetTypeSpecError();
573010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void UpdateDeclRep(Decl *Rep) {
574010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    assert(isDeclRep((TST) TypeSpecType));
575010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DeclRep = Rep;
576010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
577010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void UpdateTypeRep(ParsedType Rep) {
578010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    assert(isTypeRep((TST) TypeSpecType));
579010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    TypeRep = Rep;
580010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
581010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void UpdateExprRep(Expr *Rep) {
582010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    assert(isExprRep((TST) TypeSpecType));
583010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ExprRep = Rep;
584010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
585010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
586010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetTypeQual(TQ T, SourceLocation Loc, const char *&PrevSpec,
587010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                   unsigned &DiagID, const LangOptions &Lang);
588010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
589010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetFunctionSpecInline(SourceLocation Loc, const char *&PrevSpec,
590010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                             unsigned &DiagID);
591010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetFunctionSpecVirtual(SourceLocation Loc, const char *&PrevSpec,
592010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                              unsigned &DiagID);
593010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetFunctionSpecExplicit(SourceLocation Loc, const char *&PrevSpec,
594010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                               unsigned &DiagID);
595010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
596010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetFriendSpec(SourceLocation Loc, const char *&PrevSpec,
597010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                     unsigned &DiagID);
598010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool setModulePrivateSpec(SourceLocation Loc, const char *&PrevSpec,
599010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                            unsigned &DiagID);
600010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool SetConstexprSpec(SourceLocation Loc, const char *&PrevSpec,
601010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                        unsigned &DiagID);
602010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
603010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool isFriendSpecified() const { return Friend_specified; }
604010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SourceLocation getFriendSpecLoc() const { return FriendLoc; }
605010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
606010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool isModulePrivateSpecified() const { return ModulePrivateLoc.isValid(); }
607010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SourceLocation getModulePrivateSpecLoc() const { return ModulePrivateLoc; }
608010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
609010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool isConstexprSpecified() const { return Constexpr_specified; }
610010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  SourceLocation getConstexprSpecLoc() const { return ConstexprLoc; }
611010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
612010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  AttributePool &getAttributePool() const {
613010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return Attrs.getPool();
614010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
615010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  /// AddAttributes - contatenates two attribute lists.
617010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  /// The GCC attribute syntax allows for the following:
618010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ///
619010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  /// short __attribute__(( unused, deprecated ))
620010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  /// int __attribute__(( may_alias, aligned(16) )) var;
621010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ///
622010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  /// This declares 4 attributes using 2 lists. The following syntax is
623010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  /// also allowed and equivalent to the previous declaration.
624010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ///
625010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  /// short __attribute__((unused)) __attribute__((deprecated))
626010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  /// int __attribute__((may_alias)) __attribute__((aligned(16))) var;
627010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ///
628010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void addAttributes(AttributeList *AL) {
629010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Attrs.addAll(AL);
630010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
631010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void setAttributes(AttributeList *AL) {
632010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    Attrs.set(AL);
633010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
634010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
635010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool hasAttributes() const { return !Attrs.empty(); }
636010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
637010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ParsedAttributes &getAttributes() { return Attrs; }
638010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const ParsedAttributes &getAttributes() const { return Attrs; }
639010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
640010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  /// TakeAttributes - Return the current attribute list and remove them from
641010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  /// the DeclSpec so that it doesn't own them.
642010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ParsedAttributes takeAttributes() {
643010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // The non-const "copy" constructor clears the operand automatically.
644010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return Attrs;
645010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void takeAttributesFrom(ParsedAttributes &attrs) {
6483240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    Attrs.takeAllFrom(attrs);
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  typedef Decl * const *ProtocolQualifierListTy;
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ProtocolQualifierListTy getProtocolQualifiers() const {
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return ProtocolQualifiers;
65458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SourceLocation *getProtocolLocs() const { return ProtocolLocs; }
656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  unsigned getNumProtocolQualifiers() const {
657116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return NumProtocolQualifiers;
658116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
659116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SourceLocation getProtocolLAngleLoc() const { return ProtocolLAngleLoc; }
660116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void setProtocolQualifiers(Decl * const *Protos, unsigned NP,
661116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             SourceLocation *ProtoLocs,
662116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                             SourceLocation LAngleLoc);
663116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
664116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// Finish - This does final analysis of the declspec, issuing diagnostics for
665116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// things like "_Imaginary" (lacking an FP type).  After calling this method,
666116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// DeclSpec is guaranteed self-consistent, even if an error occurred.
667116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void Finish(DiagnosticsEngine &D, Preprocessor &PP);
668116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
669116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const WrittenBuiltinSpecs& getWrittenBuiltinSpecs() const {
670116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return writtenBS;
671116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
672116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
673116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ObjCDeclSpec *getObjCQualifiers() const { return ObjCQualifiers; }
674116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void setObjCQualifiers(ObjCDeclSpec *quals) { ObjCQualifiers = quals; }
675116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
676116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// isMissingDeclaratorOk - This checks if this DeclSpec can stand alone,
677116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// without a Declarator. Only tag declspecs can stand alone.
678116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool isMissingDeclaratorOk();
679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
681a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/// ObjCDeclSpec - This class captures information about
682a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/// "declaration specifiers" specific to objective-c
683a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ObjCDeclSpec {
684a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public:
685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// ObjCDeclQualifier - Qualifier used on types in method
686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// declarations.  Not all combinations are sensible.  Parameters
687f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  /// can be one of { in, out, inout } with one of { bycopy, byref }.
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// Returns can either be { oneway } or not.
689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ///
690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// This should be kept in sync with Decl::ObjCDeclQualifier.
691f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  enum ObjCDeclQualifier {
692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DQ_None = 0x0,
693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DQ_In = 0x1,
694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DQ_Inout = 0x2,
695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DQ_Out = 0x4,
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DQ_Bycopy = 0x8,
697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DQ_Byref = 0x10,
698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DQ_Oneway = 0x20
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// PropertyAttributeKind - list of property attributes.
7020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  enum ObjCPropertyAttributeKind {
7030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    DQ_PR_noattr = 0x0,
7040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    DQ_PR_readonly = 0x01,
7050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    DQ_PR_getter = 0x02,
7060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    DQ_PR_assign = 0x04,
7070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    DQ_PR_readwrite = 0x08,
708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DQ_PR_retain = 0x10,
709868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DQ_PR_copy = 0x20,
710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DQ_PR_nonatomic = 0x40,
711868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DQ_PR_setter = 0x80,
712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DQ_PR_atomic = 0x100,
71390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DQ_PR_weak =   0x200,
71490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DQ_PR_strong = 0x400,
71590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DQ_PR_unsafe_unretained = 0x800
71658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
71758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
71858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
71958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ObjCDeclSpec()
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : objcDeclQualifier(DQ_None), PropertyAttributes(DQ_PR_noattr),
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetterName(0), SetterName(0) { }
7225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ObjCDeclQualifier getObjCDeclQualifier() const { return objcDeclQualifier; }
7235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void setObjCDeclQualifier(ObjCDeclQualifier DQVal) {
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    objcDeclQualifier = (ObjCDeclQualifier) (objcDeclQualifier | DQVal);
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
726ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
727ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ObjCPropertyAttributeKind getPropertyAttributes() const {
728ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return ObjCPropertyAttributeKind(PropertyAttributes);
729ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
730ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void setPropertyAttributes(ObjCPropertyAttributeKind PRVal) {
731f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PropertyAttributes =
732ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      (ObjCPropertyAttributeKind)(PropertyAttributes | PRVal);
733ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
734ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
735ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const IdentifierInfo *getGetterName() const { return GetterName; }
736ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  IdentifierInfo *getGetterName() { return GetterName; }
737ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  void setGetterName(IdentifierInfo *name) { GetterName = name; }
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const IdentifierInfo *getSetterName() const { return SetterName; }
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  IdentifierInfo *getSetterName() { return SetterName; }
7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void setSetterName(IdentifierInfo *name) { SetterName = name; }
7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)private:
7445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // FIXME: These two are unrelated and mutially exclusive. So perhaps
7455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // we can put them in a union to reflect their mutual exclusiveness
7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // (space saving is negligible).
7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ObjCDeclQualifier objcDeclQualifier : 6;
7485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
749a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // NOTE: VC++ treats enums as signed, avoid using ObjCPropertyAttributeKind
750f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  unsigned PropertyAttributes : 12;
751a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  IdentifierInfo *GetterName;    // getter name of NULL if no getter
752a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  IdentifierInfo *SetterName;    // setter name of NULL if no setter
7535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
7545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/// \brief Represents a C++ unqualified-id that has been parsed.
7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UnqualifiedId {
7570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochprivate:
7580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const UnqualifiedId &operator=(const UnqualifiedId &); // DO NOT IMPLEMENT
7590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
7600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochpublic:
7610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  /// \brief Describes the kind of unqualified-id parsed.
7620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  enum IdKind {
7630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    /// \brief An identifier.
7640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    IK_Identifier,
7650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    /// \brief An overloaded operator name, e.g., operator+.
7660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    IK_OperatorFunctionId,
7670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    /// \brief A conversion function name, e.g., operator int.
7680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    IK_ConversionFunctionId,
769f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    /// \brief A user-defined literal name, e.g., operator "" _i.
770f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    IK_LiteralOperatorId,
771f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    /// \brief A constructor name.
772f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    IK_ConstructorName,
773f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    /// \brief A constructor named via a template-id.
7740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    IK_ConstructorTemplateId,
7750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    /// \brief A destructor name.
7760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    IK_DestructorName,
7770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    /// \brief A template-id, e.g., f<int>.
778116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    IK_TemplateId,
779116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    /// \brief An implicit 'self' parameter
780a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    IK_ImplicitSelfParam
781116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } Kind;
782116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
783116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// \brief Anonymous union that holds extra data associated with the
784116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// parsed unqualified-id.
785116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  union {
786116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    /// \brief When Kind == IK_Identifier, the parsed identifier, or when Kind
787a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    /// == IK_UserLiteralId, the identifier suffix.
788116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    IdentifierInfo *Identifier;
789116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    /// \brief When Kind == IK_OperatorFunctionId, the overloaded operator
791116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    /// that we parsed.
792116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    struct {
793116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      /// \brief The kind of overloaded operator.
794116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      OverloadedOperatorKind Operator;
795116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
796116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      /// \brief The source locations of the individual tokens that name
797116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      /// the operator, e.g., the "new", "[", and "]" tokens in
798116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      /// operator new [].
799116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ///
800116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      /// Different operators have different numbers of tokens in their name,
801a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      /// up to three. Any remaining source locations in this array will be
8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      /// set to an invalid value for operators with fewer than three tokens.
8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      unsigned SymbolLocations[3];
8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } OperatorFunctionId;
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    /// \brief When Kind == IK_ConversionFunctionId, the type that the
8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    /// conversion function names.
808f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    UnionParsedType ConversionFunctionId;
809f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
810f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    /// \brief When Kind == IK_ConstructorName, the class-name of the type
811f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    /// whose constructor is being referenced.
812f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    UnionParsedType ConstructorName;
813f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
814f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    /// \brief When Kind == IK_DestructorName, the type referred to by the
815f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    /// class-name.
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UnionParsedType DestructorName;
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /// \brief When Kind == IK_TemplateId or IK_ConstructorTemplateId,
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /// the template-id annotation that contains the template name and
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /// template arguments.
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TemplateIdAnnotation *TemplateId;
8225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \brief The location of the first token that describes this unqualified-id,
8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// which will be the location of the identifier, "operator" keyword,
8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// tilde (for a destructor), or the template name of a template-id.
8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SourceLocation StartLocation;
8285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// \brief The location of the last token that describes this unqualified-id.
8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SourceLocation EndLocation;
831010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
832a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  UnqualifiedId() : Kind(IK_Identifier), Identifier(0) { }
833a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// \brief Do not use this copy constructor. It is temporary, and only
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// exists because we are holding FieldDeclarators in a SmallVector when we
836868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// don't actually need them.
837868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ///
8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// FIXME: Kill this copy constructor.
8395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UnqualifiedId(const UnqualifiedId &Other)
8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : Kind(IK_Identifier), Identifier(Other.Identifier),
8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      StartLocation(Other.StartLocation), EndLocation(Other.EndLocation) {
8425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    assert(Other.Kind == IK_Identifier && "Cannot copy non-identifiers");
8435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
844868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
845116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// \brief Destroy this unqualified-id.
846116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ~UnqualifiedId() { clear(); }
847116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
848116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// \brief Clear out this unqualified-id, setting it to default (invalid)
849116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// state.
850a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void clear();
851a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
852a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /// \brief Determine whether this unqualified-id refers to a valid name.
853a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool isValid() const { return StartLocation.isValid(); }
854a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
85558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// \brief Determine whether this unqualified-id refers to an invalid name.
856cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool isInvalid() const { return !isValid(); }
857cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
858cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /// \brief Determine what kind of name we have.
859cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  IdKind getKind() const { return Kind; }
860cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void setKind(IdKind kind) { Kind = kind; }
861cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
862a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /// \brief Specify that this unqualified-id was parsed as an identifier.
863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ///
864f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// \param Id the parsed identifier.
865116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  /// \param IdLoc the location of the parsed identifier.
866116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc) {
867116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Kind = IK_Identifier;
868116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Identifier = const_cast<IdentifierInfo *>(Id);
869a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    StartLocation = EndLocation = IdLoc;
870116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
8715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
872a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /// \brief Specify that this unqualified-id was parsed as an
873a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /// operator-function-id.
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \param OperatorLoc the location of the 'operator' keyword.
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \param Op the overloaded operator.
878a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ///
8797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  /// \param SymbolLocations the locations of the individual operator symbols
8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// in the operator.
8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void setOperatorFunctionId(SourceLocation OperatorLoc,
8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             OverloadedOperatorKind Op,
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             SourceLocation SymbolLocations[3]);
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \brief Specify that this unqualified-id was parsed as a
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// conversion-function-id.
88758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ///
88858e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  /// \param OperatorLoc the location of the 'operator' keyword.
88958e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ///
89068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  /// \param Ty the type to which this conversion function is converting.
89158e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  ///
89258e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  /// \param EndLoc the location of the last token that makes up the type name.
89358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  void setConversionFunctionId(SourceLocation OperatorLoc,
89458e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch                               ParsedType Ty,
89558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch                               SourceLocation EndLoc) {
89658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    Kind = IK_ConversionFunctionId;
89758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    StartLocation = OperatorLoc;
89858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndLocation = EndLoc;
89958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ConversionFunctionId = Ty;
900eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
901a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
90258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// \brief Specific that this unqualified-id was parsed as a
903a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /// literal-operator-id.
9043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ///
90558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// \param Id the parsed identifier.
906eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ///
907eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// \param OpLoc the location of the 'operator' keyword.
908a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ///
909a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /// \param IdLoc the location of the identifier.
91058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void setLiteralOperatorId(const IdentifierInfo *Id, SourceLocation OpLoc,
911eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                              SourceLocation IdLoc) {
91258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    Kind = IK_LiteralOperatorId;
913a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Identifier = const_cast<IdentifierInfo *>(Id);
91458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    StartLocation = OpLoc;
91558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EndLocation = IdLoc;
916a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
91790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
91890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// \brief Specify that this unqualified-id was parsed as a constructor name.
919a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ///
9200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  /// \param ClassType the class type referred to by the constructor name.
9210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  ///
922f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// \param ClassNameLoc the location of the class name.
923f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ///
9240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  /// \param EndLoc the location of the last token that makes up the type name.
9250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void setConstructorName(ParsedType ClassType,
92658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                          SourceLocation ClassNameLoc,
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          SourceLocation EndLoc) {
928a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    Kind = IK_ConstructorName;
92958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    StartLocation = ClassNameLoc;
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EndLocation = EndLoc;
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ConstructorName = ClassType;
932a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \brief Specify that this unqualified-id was parsed as a
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// template-id that names a constructor.
936a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ///
937ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  /// \param TemplateId the template-id annotation that describes the parsed
938ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  /// template-id. This UnqualifiedId instance will take ownership of the
939ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  /// \p TemplateId and will free it on destruction.
940a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void setConstructorTemplateId(TemplateIdAnnotation *TemplateId);
941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \brief Specify that this unqualified-id was parsed as a destructor name.
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \param TildeLoc the location of the '~' that introduces the destructor
945a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /// name.
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \param ClassType the name of the class referred to by the destructor name.
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void setDestructorName(SourceLocation TildeLoc,
949a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                         ParsedType ClassType,
950bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                         SourceLocation EndLoc) {
951bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    Kind = IK_DestructorName;
952bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    StartLocation = TildeLoc;
953a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EndLocation = EndLoc;
954f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    DestructorName = ClassType;
955a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \brief Specify that this unqualified-id was parsed as a template-id.
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ///
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \param TemplateId the template-id annotation that describes the parsed
960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// template-id. This UnqualifiedId instance will take ownership of the
961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// \p TemplateId and will free it on destruction.
962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void setTemplateId(TemplateIdAnnotation *TemplateId);
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \brief Return the source range that covers this unqualified-id.
965a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SourceRange getSourceRange() const {
9665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return SourceRange(StartLocation, EndLocation);
967a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
968a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
9691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
9701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)/// CachedTokens - A set of tokens that has been cached for later
9711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)/// parsing.
9721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)typedef SmallVector<Token, 4> CachedTokens;
9731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
9741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)/// DeclaratorChunk - One instance of this struct is used for each type in a
9751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)/// declarator that is parsed.
9761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)///
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/// This is intended to be a small value object.
978a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)struct DeclaratorChunk {
979a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  enum {
980b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    Pointer, Reference, Array, Function, BlockPointer, MemberPointer, Paren
981b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  } Kind;
982ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
98390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  /// Loc - The place where this type was defined.
98490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SourceLocation Loc;
98558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// EndLoc - If valid, the place where this chunck ends.
98658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SourceLocation EndLoc;
98758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
98858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  struct TypeInfoCommon {
98990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    AttributeList *AttrList;
9904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  };
9914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct PointerTypeInfo : TypeInfoCommon {
9930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    /// The type qualifiers: const/volatile/restrict.
99490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    unsigned TypeQuals : 3;
99558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
99658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// The location of the const-qualifier, if any.
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned ConstQualLoc;
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /// The location of the volatile-qualifier, if any.
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned VolatileQualLoc;
1001c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1002c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /// The location of the restrict-qualifier, if any.
1003c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    unsigned RestrictQualLoc;
1004ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
100558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    void destroy() {
1006c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1007ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  };
100858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
100958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  struct ReferenceTypeInfo : TypeInfoCommon {
1010ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    /// The type qualifier: restrict. [GNU] C++ extension
1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool HasRestrict : 1;
1012c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /// True if this is an lvalue reference, false if it's an rvalue reference.
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool LValueRef : 1;
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    void destroy() {
1015ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    }
1016c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
101858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  struct ArrayTypeInfo : TypeInfoCommon {
10197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    /// The type qualifiers for the array: const/volatile/restrict.
102058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    unsigned TypeQuals : 3;
102158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
102258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// True if this dimension included the 'static' keyword.
102358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    bool hasStatic : 1;
10247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
102558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// True if this dimension was [*].  In this case, NumElts is null.
10267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    bool isStar : 1;
10275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    /// This is the size of the array, or null if [] or [*] was specified.
10295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    /// Since the parser is multi-purpose, and we don't want to impose a root
103058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// expression class on all clients, NumElts is untyped.
103158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    Expr *NumElts;
103258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
103358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    void destroy() {}
103458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
10357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  /// ParamInfo - An array of paraminfo objects is allocated whenever a function
103758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// declarator is parsed.  There are two interesting styles of arguments here:
103858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// K&R-style identifier lists and parameter type lists.  K&R-style identifier
103958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// lists will have information about the identifier, but no type information.
10405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// Parameter type lists will have type info (if the actions module provides
1041f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// it), but may have null identifier info: e.g. for 'void foo(int X, int)'.
10427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  struct ParamInfo {
10435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    IdentifierInfo *Ident;
104458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SourceLocation IdentLoc;
104558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    Decl *Param;
104658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
104758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// DefaultArgTokens - When the parameter's default argument
104858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// cannot be parsed immediately (because it occurs within the
104958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// declaration of a member function), it will be stored here as a
105058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// sequence of tokens to be parsed once the class definition is
105158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// complete. Non-NULL indicates that there is a default argument.
105258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    CachedTokens *DefaultArgTokens;
105358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
105458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ParamInfo() {}
10554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ParamInfo(IdentifierInfo *ident, SourceLocation iloc,
10567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              Decl *param,
10577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch              CachedTokens *DefArgTokens = 0)
105858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : Ident(ident), IdentLoc(iloc), Param(param),
105958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        DefaultArgTokens(DefArgTokens) {}
106058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
106158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
106258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  struct TypeAndRange {
106358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ParsedType Ty;
106458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SourceRange Range;
106558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
106658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
106758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  struct FunctionTypeInfo : TypeInfoCommon {
106858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// hasPrototype - This is true if the function had at least one typed
106958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// argument.  If the function is () or (a,b,c), then it has no prototype,
107058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// and is treated as a K&R-style function.
107158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    unsigned hasPrototype : 1;
107258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
107358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// isVariadic - If this function has a prototype, and if that
107458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// proto ends with ',...)', this is true. When true, EllipsisLoc
107558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// contains the location of the ellipsis.
10767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    unsigned isVariadic : 1;
10777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    /// \brief Whether the ref-qualifier (if any) is an lvalue reference.
10797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    /// Otherwise, it's an rvalue reference.
10807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    unsigned RefQualifierIsLValueRef : 1;
10817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
10827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    /// The type qualifiers: const/volatile/restrict.
10837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    /// The qualifier bitmask values are the same as in QualType.
10847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    unsigned TypeQuals : 3;
108558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /// ExceptionSpecType - An ExceptionSpecificationType value.
1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    unsigned ExceptionSpecType : 3;
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /// DeleteArgInfo - If this is true, we need to delete[] ArgInfo.
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned DeleteArgInfo : 1;
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /// When isVariadic is true, the location of the ellipsis in the source.
1093c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    unsigned EllipsisLoc;
1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1095868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    /// NumArgs - This is the number of formal arguments provided for the
1096868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    /// declarator.
1097868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    unsigned NumArgs;
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1099c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /// NumExceptions - This is the number of types in the dynamic-exception-
11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /// decl, if the function has one.
11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned NumExceptions;
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    /// \brief The location of the ref-qualifier, if any.
1104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ///
11053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /// If this is an invalid location, there is no ref-qualifier.
1106558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    unsigned RefQualifierLoc;
11070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    /// \brief The location of the const-qualifier, if any.
11095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ///
11100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    /// If this is an invalid location, there is no const-qualifier.
111158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    unsigned ConstQualifierLoc;
111258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
111358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    /// \brief The location of the volatile-qualifier, if any.
111458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ///
111558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// If this is an invalid location, there is no volatile-qualifier.
111658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    unsigned VolatileQualifierLoc;
111758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
111858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// \brief The location of the 'mutable' qualifer in a lambda-declarator, if
111958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// any.
112058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    unsigned MutableLoc;
1121558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1122558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    /// \brief When ExceptionSpecType isn't EST_None or EST_Delayed, the
1123558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    /// location of the keyword introducing the spec.
1124558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    unsigned ExceptionSpecLoc;
112558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
112658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    /// ArgInfo - This is a pointer to a new[]'d array of ParamInfo objects that
112758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch    /// describe the arguments for this function declarator.  This is null if
1128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    /// there are no arguments specified.
1129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ParamInfo *ArgInfo;
113058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch
1131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    union {
1132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      /// \brief Pointer to a new[]'d array of TypeAndRange objects that
1133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      /// contain the types in the function's dynamic exception specification
1134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      /// and their locations, if there is one.
1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TypeAndRange *Exceptions;
1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1137a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      /// \brief Pointer to the expression in the noexcept-specifier of this
11383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      /// function, if it has one.
1139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      Expr *NoexceptExpr;
1140a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    };
1141a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1142a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    /// TrailingReturnType - If this isn't null, it's the trailing return type
1143a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    /// specified. This is actually a ParsedType, but stored as void* to
114458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// allow union storage.
114558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    void *TrailingReturnType;
114658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
114758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// freeArgs - reset the argument list to having zero arguments.  This is
114858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// used in various places for error recovery.
11490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    void freeArgs() {
115058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (DeleteArgInfo) {
115158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        delete[] ArgInfo;
11520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        DeleteArgInfo = false;
11530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      }
11540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      NumArgs = 0;
1155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
1156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
115758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    void destroy() {
1158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (DeleteArgInfo)
115958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        delete[] ArgInfo;
116058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (getExceptionSpecType() == EST_Dynamic)
116158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        delete[] Exceptions;
116258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
116358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
116458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// isKNRPrototype - Return true if this is a K&R style identifier list,
116558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    /// like "void foo(a,b,c)".  In a function definition, this will be followed
1166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /// by the argument type definitions.
11674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    bool isKNRPrototype() const {
11684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return !hasPrototype && NumArgs != 0;
11694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SourceLocation getEllipsisLoc() const {
1172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return SourceLocation::getFromRawEncoding(EllipsisLoc);
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SourceLocation getExceptionSpecLoc() const {
1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return SourceLocation::getFromRawEncoding(ExceptionSpecLoc);
11760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
11770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
11780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    /// \brief Retrieve the location of the ref-qualifier, if any.
1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SourceLocation getRefQualifierLoc() const {
1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return SourceLocation::getFromRawEncoding(RefQualifierLoc);
11814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
11830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    /// \brief Retrieve the location of the ref-qualifier, if any.
1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SourceLocation getConstQualifierLoc() const {
1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return SourceLocation::getFromRawEncoding(ConstQualifierLoc);
1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /// \brief Retrieve the location of the ref-qualifier, if any.
1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SourceLocation getVolatileQualifierLoc() const {
1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return SourceLocation::getFromRawEncoding(VolatileQualifierLoc);
1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /// \brief Retrieve the location of the 'mutable' qualifier, if any.
1194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SourceLocation getMutableLoc() const {
11950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      return SourceLocation::getFromRawEncoding(MutableLoc);
1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /// \brief Determine whether this function declaration contains a
1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /// ref-qualifier.
1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool hasRefQualifier() const { return getRefQualifierLoc().isValid(); }
1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    /// \brief Determine whether this lambda-declarator contains a 'mutable'
1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /// qualifier.
1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool hasMutableQualifier() const { return getMutableLoc().isValid(); }
1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1206b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    /// \brief Get the type of exception specification this function has.
120758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ExceptionSpecificationType getExceptionSpecType() const {
1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return static_cast<ExceptionSpecificationType>(ExceptionSpecType);
120958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
121058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  struct BlockPointerTypeInfo : TypeInfoCommon {
1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /// For now, sema will catch these as invalid.
1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    /// The type qualifiers: const/volatile/restrict.
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    unsigned TypeQuals : 3;
1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    void destroy() {
12187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
12197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  };
12207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
12217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  struct MemberPointerTypeInfo : TypeInfoCommon {
12227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    /// The type qualifiers: const/volatile/restrict.
12237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    unsigned TypeQuals : 3;
12247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // CXXScopeSpec has a constructor, so it can't be a direct member.
12257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // So we need some pointer-aligned storage and a bit of trickery.
12267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    union {
12277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      void *Aligner;
12287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      char Mem[sizeof(CXXScopeSpec)];
12297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    } ScopeMem;
12307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    CXXScopeSpec &Scope() {
12317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return *reinterpret_cast<CXXScopeSpec*>(ScopeMem.Mem);
12327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
12337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    const CXXScopeSpec &Scope() const {
12347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return *reinterpret_cast<const CXXScopeSpec*>(ScopeMem.Mem);
12357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
12367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    void destroy() {
12377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      Scope().~CXXScopeSpec();
12387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    }
12397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  };
12407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  union {
12427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    TypeInfoCommon        Common;
12437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PointerTypeInfo       Ptr;
12441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    ReferenceTypeInfo     Ref;
12450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    ArrayTypeInfo         Arr;
12460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    FunctionTypeInfo      Fun;
12470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    BlockPointerTypeInfo  Cls;
12480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    MemberPointerTypeInfo Mem;
12490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  };
12500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
12510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void destroy() {
12520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    switch (Kind) {
12530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    case DeclaratorChunk::Function:      return Fun.destroy();
12540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    case DeclaratorChunk::Pointer:       return Ptr.destroy();
12550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    case DeclaratorChunk::BlockPointer:  return Cls.destroy();
12560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    case DeclaratorChunk::Reference:     return Ref.destroy();
12570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    case DeclaratorChunk::Array:         return Arr.destroy();
1258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case DeclaratorChunk::MemberPointer: return Mem.destroy();
12590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    case DeclaratorChunk::Paren:         return;
12600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
12610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
12620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
12630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  /// getAttrs - If there are attributes applied to this declaratorchunk, return
12640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  /// them.
12650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const AttributeList *getAttrs() const {
12660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return Common.AttrList;
1267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
12680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AttributeList *&getAttrListRef() {
1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return Common.AttrList;
1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
12721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
12731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  /// getPointer - Return a DeclaratorChunk for a pointer.
1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ///
1275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static DeclaratorChunk getPointer(unsigned TypeQuals, SourceLocation Loc,
12761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                    SourceLocation ConstQualLoc,
12771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                    SourceLocation VolatileQualLoc,
12781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                    SourceLocation RestrictQualLoc) {
12791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DeclaratorChunk I;
12801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    I.Kind                = Pointer;
12811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    I.Loc                 = Loc;
12821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    I.Ptr.TypeQuals       = TypeQuals;
12831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    I.Ptr.ConstQualLoc    = ConstQualLoc.getRawEncoding();
1284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    I.Ptr.VolatileQualLoc = VolatileQualLoc.getRawEncoding();
12851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    I.Ptr.RestrictQualLoc = RestrictQualLoc.getRawEncoding();
12861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    I.Ptr.AttrList        = 0;
1287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return I;
12881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
12891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /// getReference - Return a DeclaratorChunk for a reference.
12911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ///
12921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static DeclaratorChunk getReference(unsigned TypeQuals, SourceLocation Loc,
1293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                      bool lvalue) {
12941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DeclaratorChunk I;
12951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    I.Kind            = Reference;
1296a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    I.Loc             = Loc;
12971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    I.Ref.HasRestrict = (TypeQuals & DeclSpec::TQ_restrict) != 0;
12981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    I.Ref.LValueRef   = lvalue;
12991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    I.Ref.AttrList    = 0;
13001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return I;
13011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
13021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// getArray - Return a DeclaratorChunk for an array.
1304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ///
13051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  static DeclaratorChunk getArray(unsigned TypeQuals,
1306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  bool isStatic, bool isStar, Expr *NumElts,
1307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  SourceLocation LBLoc, SourceLocation RBLoc) {
13080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    DeclaratorChunk I;
13090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    I.Kind          = Array;
13100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    I.Loc           = LBLoc;
13110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    I.EndLoc        = RBLoc;
13120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    I.Arr.AttrList  = 0;
13130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    I.Arr.TypeQuals = TypeQuals;
13140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    I.Arr.hasStatic = isStatic;
13150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    I.Arr.isStar    = isStar;
13160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    I.Arr.NumElts   = NumElts;
13170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return I;
1318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
13190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
132058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
1321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// "TheDeclarator" is the declarator that this will be added to.
1322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static DeclaratorChunk getFunction(bool hasProto, bool isVariadic,
1323c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     SourceLocation EllipsisLoc,
1324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     ParamInfo *ArgInfo, unsigned NumArgs,
1325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     unsigned TypeQuals,
1326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                     bool RefQualifierIsLvalueRef,
1327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                     SourceLocation RefQualifierLoc,
13285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     SourceLocation ConstQualifierLoc,
13295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     SourceLocation VolatileQualifierLoc,
1330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     SourceLocation MutableLoc,
1331a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ExceptionSpecificationType ESpecType,
1332a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     SourceLocation ESpecLoc,
1333a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ParsedType *Exceptions,
13345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     SourceRange *ExceptionRanges,
1335eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                     unsigned NumExceptions,
1336eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                     Expr *NoexceptExpr,
13375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     SourceLocation LocalRangeBegin,
13385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     SourceLocation LocalRangeEnd,
13390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                     Declarator &TheDeclarator,
1340a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                     ParsedType TrailingReturnType =
13410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                                    ParsedType());
13420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
13430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  /// getBlockPointer - Return a DeclaratorChunk for a block.
13440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ///
13450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  static DeclaratorChunk getBlockPointer(unsigned TypeQuals,
13460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                         SourceLocation Loc) {
1347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DeclaratorChunk I;
1348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    I.Kind          = BlockPointer;
1349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    I.Loc           = Loc;
1350eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    I.Cls.TypeQuals = TypeQuals;
1351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    I.Cls.AttrList  = 0;
1352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return I;
1353eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
135490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static DeclaratorChunk getMemberPointer(const CXXScopeSpec &SS,
1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                          unsigned TypeQuals,
1357eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                          SourceLocation Loc) {
1358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DeclaratorChunk I;
1359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    I.Kind          = MemberPointer;
1360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    I.Loc           = Loc;
1361c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    I.Mem.TypeQuals = TypeQuals;
1362868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    I.Mem.AttrList  = 0;
1363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    new (I.Mem.ScopeMem.Mem) CXXScopeSpec(SS);
1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return I;
13655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
13665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// getParen - Return a DeclaratorChunk for a paren.
13685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ///
13695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static DeclaratorChunk getParen(SourceLocation LParenLoc,
13705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  SourceLocation RParenLoc) {
13715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DeclaratorChunk I;
13725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    I.Kind          = Paren;
13735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    I.Loc           = LParenLoc;
13745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    I.EndLoc        = RParenLoc;
13755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    I.Common.AttrList = 0;
1376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return I;
137790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
1378ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
1380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// \brief Described the kind of function definition (if any) provided for
138290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)/// a function.
1383ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochenum FunctionDefinitionKind {
1384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  FDK_Declaration,
1385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FDK_Definition,
1386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FDK_Defaulted,
1387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FDK_Deleted
1388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
1389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// Declarator - Information about one declarator, including the parsed type
1391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/// information and the identifier.  When the declarator is fully formed, this
1392f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/// is turned into the appropriate Decl object.
1393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch///
1394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// Declarators come in two types: normal declarators and abstract declarators.
1395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// Abstract declarators are used when parsing types, and don't have an
1396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// identifier.  Normal declarators do have ID's.
1397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch///
1398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// Instances of this class should be a transient object that lives on the
1399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// stack, not objects that are allocated in large quantities on the heap.
1400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass Declarator {
1401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochpublic:
1402f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  enum TheContext {
1403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    FileContext,         // File scope declaration.
1404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PrototypeContext,    // Within a function prototype.
1405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ObjCResultContext,   // An ObjC method result type.
1406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ObjCParameterContext,// An ObjC method parameter type.
1407f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    KNRTypeListContext,  // K&R type definition list for formals.
1408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    TypeNameContext,     // Abstract declarator for types.
1409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    MemberContext,       // Struct/Union field.
1410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    BlockContext,        // Declaration within a block in a function.
1411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ForContext,          // Declaration within first part of a for loop.
1412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ConditionContext,    // Condition declaration in a C++ if/switch/while/for.
1413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    TemplateParamContext,// Within a template parameter list.
1414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CXXNewContext,       // C++ new-expression.
1415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CXXCatchContext,     // C++ catch exception-declaration
1416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ObjCCatchContext,    // Objective-C catch exception-declaration
1417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    BlockLiteralContext,  // Block literal declarator.
1418f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    LambdaExprContext,   // Lambda-expression declarator.
1419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    TemplateTypeArgContext, // Template type argument.
1420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    AliasDeclContext,    // C++0x alias-declaration.
1421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    AliasTemplateContext // C++0x alias-declaration template.
1422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
1423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochprivate:
1425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const DeclSpec &DS;
1426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CXXScopeSpec SS;
1427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  UnqualifiedId Name;
1428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SourceRange Range;
14295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
14305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// Context - Where we are parsing this declarator.
14315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ///
14325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  TheContext Context;
1433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
14345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// DeclTypeInfo - This holds each type that the declarator includes as it is
14355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  /// parsed.  This is pushed from the identifier out, which means that element
1436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// #0 will be the most closely bound to the identifier, and
1437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// DeclTypeInfo.back() will be the least closely bound.
1438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SmallVector<DeclaratorChunk, 8> DeclTypeInfo;
1439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// InvalidType - Set by Sema::GetTypeForDeclarator().
1441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool InvalidType : 1;
1442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// GroupingParens - Set by Parser::ParseParenDeclarator().
1444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool GroupingParens : 1;
1445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// FunctionDefinition - Is this Declarator for a function or member
1447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// definition and, if so, what kind?
1448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ///
1449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// Actually a FunctionDefinitionKind.
1450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  unsigned FunctionDefinition : 2;
1451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Redeclaration - Is this Declarator is a redeclaration.
1453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool Redeclaration : 1;
1454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// Attrs - Attributes.
1456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ParsedAttributes Attrs;
1457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// AsmLabel - The asm label, if specified.
1459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  Expr *AsmLabel;
1460eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// InlineParams - This is a local array used for the first function decl
1462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// chunk to avoid going to the heap for the common case when we have one
1463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  /// function chunk in the declarator.
1464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DeclaratorChunk::ParamInfo InlineParams[16];
1465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool InlineParamsUsed;
1466f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// Extension - true if the declaration is preceded by __extension__.
1468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool Extension : 1;
1469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// \brief If this is the second or subsequent declarator in this declaration,
1471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// the location of the comma before this declarator.
1472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SourceLocation CommaLoc;
1473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1474010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  /// \brief If provided, the source location of the ellipsis used to describe
1475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /// this declarator as a parameter pack.
1476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SourceLocation EllipsisLoc;
1477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  friend struct DeclaratorChunk;
1479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)public:
1481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Declarator(const DeclSpec &ds, TheContext C)
1482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : DS(ds), Range(ds.getSourceRange()), Context(C),
1483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      InvalidType(DS.getTypeSpecType() == DeclSpec::TST_error),
1484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GroupingParens(false), FunctionDefinition(FDK_Declaration),
1485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      Redeclaration(false),
1486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      Attrs(ds.getAttributePool().getFactory()), AsmLabel(0),
1487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      InlineParamsUsed(false), Extension(false) {
1488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ~Declarator() {
1491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    clear();
1492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// getDeclSpec - Return the declaration-specifier that this declarator was
1495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// declared with.
1496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const DeclSpec &getDeclSpec() const { return DS; }
1497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// getMutableDeclSpec - Return a non-const version of the DeclSpec.  This
1499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// should be used with extreme care: declspecs can often be shared between
1500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// multiple declarators, so mutating the DeclSpec affects all of the
1501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// Declarators.  This should only be done when the declspec is known to not
1502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// be shared or when in error recovery etc.
1503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DeclSpec &getMutableDeclSpec() { return const_cast<DeclSpec &>(DS); }
1504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AttributePool &getAttributePool() const {
1506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return Attrs.getPool();
1507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
150858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
150958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// getCXXScopeSpec - Return the C++ scope specifier (global scope or
151058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// nested-name-specifier) that is part of the declarator-id.
151158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const CXXScopeSpec &getCXXScopeSpec() const { return SS; }
151258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  CXXScopeSpec &getCXXScopeSpec() { return SS; }
151358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
151458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// \brief Retrieve the name specified by this declarator.
151558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  UnqualifiedId &getName() { return Name; }
151658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
151758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TheContext getContext() const { return Context; }
151858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
151958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool isPrototypeContext() const {
152058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return (Context == PrototypeContext ||
152158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            Context == ObjCParameterContext ||
152258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            Context == ObjCResultContext);
152358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
152458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
152558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// getSourceRange - Get the source range that spans this declarator.
152658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const SourceRange &getSourceRange() const { return Range; }
152758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
152858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void SetSourceRange(SourceRange R) { Range = R; }
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// SetRangeBegin - Set the start of the source range to Loc, unless it's
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// invalid.
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetRangeBegin(SourceLocation Loc) {
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!Loc.isInvalid())
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Range.setBegin(Loc);
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// SetRangeEnd - Set the end of the source range to Loc, unless it's invalid.
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetRangeEnd(SourceLocation Loc) {
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!Loc.isInvalid())
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Range.setEnd(Loc);
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// ExtendWithDeclSpec - Extend the declarator source range to include the
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// given declspec, unless its location is invalid. Adopts the range start if
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// the current range start is invalid.
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ExtendWithDeclSpec(const DeclSpec &DS) {
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const SourceRange &SR = DS.getSourceRange();
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (Range.getBegin().isInvalid())
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Range.setBegin(SR.getBegin());
15473240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch    if (!SR.getEnd().isInvalid())
1548bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      Range.setEnd(SR.getEnd());
15492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// clear - Reset the contents of this Declarator.
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void clear() {
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SS.clear();
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Name.clear();
1555bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    Range = DS.getSourceRange();
1556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
15575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (unsigned i = 0, e = DeclTypeInfo.size(); i != e; ++i)
15585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DeclTypeInfo[i].destroy();
1559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    DeclTypeInfo.clear();
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Attrs.clear();
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AsmLabel = 0;
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InlineParamsUsed = false;
15632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CommaLoc = SourceLocation();
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EllipsisLoc = SourceLocation();
15652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// mayOmitIdentifier - Return true if the identifier is either optional or
1568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// not allowed.  This is true for typenames, prototypes, and template
1569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// parameter lists.
1570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool mayOmitIdentifier() const {
1571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (Context) {
1572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case FileContext:
1573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case KNRTypeListContext:
1574c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case MemberContext:
1575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case BlockContext:
1576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ForContext:
1577c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ConditionContext:
1578c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return false;
1579c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1580c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case TypeNameContext:
1581c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case AliasDeclContext:
1582c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case AliasTemplateContext:
15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case PrototypeContext:
1584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ObjCParameterContext:
1585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ObjCResultContext:
15864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    case TemplateParamContext:
15874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    case CXXNewContext:
158858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case CXXCatchContext:
15894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    case ObjCCatchContext:
1590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case BlockLiteralContext:
1591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case LambdaExprContext:
1592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case TemplateTypeArgContext:
1593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return true;
15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    llvm_unreachable("unknown context kind!");
1596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// mayHaveIdentifier - Return true if the identifier is either optional or
15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// required.  This is true for normal declarators and prototypes, but not
1600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// typenames.
1601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool mayHaveIdentifier() const {
1602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    switch (Context) {
16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case FileContext:
16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case KNRTypeListContext:
1605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    case MemberContext:
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BlockContext:
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ForContext:
16082385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    case ConditionContext:
160958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    case PrototypeContext:
16102385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    case TemplateParamContext:
16112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    case CXXCatchContext:
16122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    case ObjCCatchContext:
16132385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      return true;
16142385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch
16152385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    case TypeNameContext:
16162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch    case CXXNewContext:
1617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case AliasDeclContext:
1618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    case AliasTemplateContext:
16192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ObjCParameterContext:
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ObjCResultContext:
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BlockLiteralContext:
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LambdaExprContext:
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case TemplateTypeArgContext:
16247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      return false;
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    llvm_unreachable("unknown context kind!");
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
162858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /// mayBeFollowedByCXXDirectInit - Return true if the declarator can be
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// followed by a C++ direct initializer, e.g. "int x(1);".
16312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool mayBeFollowedByCXXDirectInit() const {
1632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (hasGroupingParens()) return false;
1633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef)
1635c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      return false;
1636c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1637c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    if (getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_extern &&
1638c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch        Context != FileContext)
1639c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      return false;
1640c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1641c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (Context) {
1642c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case FileContext:
16437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    case BlockContext:
1644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ForContext:
1645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return true;
1646c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1647c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    case KNRTypeListContext:
1648c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    case MemberContext:
1649c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    case ConditionContext:
1650c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    case PrototypeContext:
1651c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    case ObjCParameterContext:
1652c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    case ObjCResultContext:
1653c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    case TemplateParamContext:
1654c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    case CXXCatchContext:
1655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case ObjCCatchContext:
1656c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case TypeNameContext:
1657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case CXXNewContext:
1658c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case AliasDeclContext:
1659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    case AliasTemplateContext:
1660c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    case BlockLiteralContext:
16612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LambdaExprContext:
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case TemplateTypeArgContext:
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
1664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
1665c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch    llvm_unreachable("unknown context kind!");
1666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1667c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// isPastIdentifier - Return true if we have parsed beyond the point where
1669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// the
1670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool isPastIdentifier() const { return Name.isValid(); }
1671c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
16722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// hasName - Whether this declarator has a name, which might be an
1673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  /// identifier (accessible via getIdentifier()) or some kind of
1674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  /// special C++ name (constructor, destructor, etc.).
1675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool hasName() const {
1676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return Name.getKind() != UnqualifiedId::IK_Identifier || Name.Identifier;
1677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
1678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  IdentifierInfo *getIdentifier() const {
1680a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (Name.getKind() == UnqualifiedId::IK_Identifier)
16812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return Name.Identifier;
1682c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch
1683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return 0;
1684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1685a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SourceLocation getIdentifierLoc() const { return Name.StartLocation; }
1686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// \brief Set the name of this declarator to be the given identifier.
1688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetIdentifier(IdentifierInfo *Id, SourceLocation IdLoc) {
1689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Name.setIdentifier(Id, IdLoc);
1690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// AddTypeInfo - Add a chunk to this declarator. Also extend the range to
1693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// EndLoc, which should be the last token of the chunk.
1694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void AddTypeInfo(const DeclaratorChunk &TI,
1695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   ParsedAttributes &attrs,
1696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   SourceLocation EndLoc) {
1697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DeclTypeInfo.push_back(TI);
1698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DeclTypeInfo.back().getAttrListRef() = attrs.getList();
1699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    getAttributePool().takeAllFrom(attrs.getPool());
1700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!EndLoc.isInvalid())
1702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SetRangeEnd(EndLoc);
1703a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
1704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// AddInnermostTypeInfo - Add a new innermost chunk to this declarator.
1706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void AddInnermostTypeInfo(const DeclaratorChunk &TI) {
1707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DeclTypeInfo.insert(DeclTypeInfo.begin(), TI);
1708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1710a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  /// getNumTypeObjects() - Return the number of types applied to this
1711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// declarator.
1712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  unsigned getNumTypeObjects() const { return DeclTypeInfo.size(); }
1713868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1714868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// Return the specified TypeInfo from this declarator.  TypeInfo #0 is
1715868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// closest to the identifier.
1716868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const DeclaratorChunk &getTypeObject(unsigned i) const {
1717868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    assert(i < DeclTypeInfo.size() && "Invalid type chunk");
1718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return DeclTypeInfo[i];
1719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1720868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DeclaratorChunk &getTypeObject(unsigned i) {
1721868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    assert(i < DeclTypeInfo.size() && "Invalid type chunk");
1722868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return DeclTypeInfo[i];
1723868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1724868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1725868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  void DropFirstTypeObject()
1726868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  {
1727868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    assert(!DeclTypeInfo.empty() && "No type chunks to drop.");
1728868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DeclTypeInfo.front().destroy();
1729868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    DeclTypeInfo.erase(DeclTypeInfo.begin());
1730868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1731868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1732868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// isArrayOfUnknownBound - This method returns true if the declarator
1733868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// is a declarator for an array of unknown bound (looking through
1734868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// parentheses).
1735868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  bool isArrayOfUnknownBound() const {
1736a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    for (unsigned i = 0, i_end = DeclTypeInfo.size(); i < i_end; ++i) {
1737868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      switch (DeclTypeInfo[i].Kind) {
1738868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DeclaratorChunk::Paren:
1739868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        continue;
1740868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DeclaratorChunk::Function:
1741868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DeclaratorChunk::Pointer:
1742868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DeclaratorChunk::Reference:
1743868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DeclaratorChunk::BlockPointer:
1744868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DeclaratorChunk::MemberPointer:
1745868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return false;
1746868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      case DeclaratorChunk::Array:
1747868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        return !DeclTypeInfo[i].Arr.NumElts;
1748868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      }
1749868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      llvm_unreachable("Invalid type chunk");
1750868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      return false;
1751868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    }
1752868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
1753868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
1754868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
17552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// isFunctionDeclarator - This method returns true if the declarator
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// is a function declarator (looking through parentheses).
1757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// If true is returned, then the reference type parameter idx is
1758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// assigned with the index of the declaration chunk.
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool isFunctionDeclarator(unsigned& idx) const {
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (unsigned i = 0, i_end = DeclTypeInfo.size(); i < i_end; ++i) {
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      switch (DeclTypeInfo[i].Kind) {
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case DeclaratorChunk::Function:
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        idx = i;
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return true;
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case DeclaratorChunk::Paren:
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        continue;
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case DeclaratorChunk::Pointer:
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case DeclaratorChunk::Reference:
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case DeclaratorChunk::Array:
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case DeclaratorChunk::BlockPointer:
1771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case DeclaratorChunk::MemberPointer:
17722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      llvm_unreachable("Invalid type chunk");
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return false;
17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1777868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return false;
17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1779c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1780c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// isFunctionDeclarator - Once this declarator is fully parsed and formed,
1781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// this method returns true if the identifier is a function declarator
1782868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  /// (looking through parentheses).
1783c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool isFunctionDeclarator() const {
1784c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    unsigned index;
1785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return isFunctionDeclarator(index);
17862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// getFunctionTypeInfo - Retrieves the function type info object
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// (looking through parentheses).
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DeclaratorChunk::FunctionTypeInfo &getFunctionTypeInfo() {
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    assert(isFunctionDeclarator() && "Not a function declarator!");
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned index = 0;
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    isFunctionDeclarator(index);
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return DeclTypeInfo[index].Fun;
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
179658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
179758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  /// getFunctionTypeInfo - Retrieves the function type info object
1798d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  /// (looking through parentheses).
179958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const DeclaratorChunk::FunctionTypeInfo &getFunctionTypeInfo() const {
180058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return const_cast<Declarator*>(this)->getFunctionTypeInfo();
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1802d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// \brief Determine whether the declaration that will be produced from
18042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// this declaration will be a function.
18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///
18062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// A declaration can declare a function even if the declarator itself
18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// isn't a function declarator, if the type specifier refers to a function
18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// type. This routine checks for both cases.
18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool isDeclarationOfFunction() const;
18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// takeAttributes - Takes attributes from the given parsed-attributes
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// set and add them to this declarator.
18132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ///
1814c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  /// These examples both add 3 attributes to "var":
1815d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ///  short int var __attribute__((aligned(16),common,deprecated));
1816d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ///  short int x, __attribute__((aligned(16)) var
1817d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ///                                 __attribute__((common,deprecated));
1818c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ///
1819d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  /// Also extends the range of the declarator.
1820d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void takeAttributes(ParsedAttributes &attrs, SourceLocation lastLoc) {
1821d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    Attrs.takeAllFrom(attrs);
1822d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1823d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (!lastLoc.isInvalid())
1824d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      SetRangeEnd(lastLoc);
1825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1827d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const AttributeList *getAttributes() const { return Attrs.getList(); }
1828d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  AttributeList *getAttributes() { return Attrs.getList(); }
1829d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1830d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  AttributeList *&getAttrListRef() { return Attrs.getListRef(); }
1831d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1832d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  /// hasAttributes - do we contain any attributes?
1833d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool hasAttributes() const {
1834d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (getAttributes() || getDeclSpec().hasAttributes()) return true;
1835a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    for (unsigned i = 0, e = getNumTypeObjects(); i != e; ++i)
1836d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      if (getTypeObject(i).getAttrs())
1837d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        return true;
1838d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return false;
1839d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
1840d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1841d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void setAsmLabel(Expr *E) { AsmLabel = E; }
1842d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Expr *getAsmLabel() const { return AsmLabel; }
1843d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1844d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void setExtension(bool Val = true) { Extension = Val; }
1845d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool getExtension() const { return Extension; }
1846d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1847d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void setInvalidType(bool Val = true) { InvalidType = Val; }
1848d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool isInvalidType() const {
1849d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return InvalidType || DS.getTypeSpecType() == DeclSpec::TST_error;
1850d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
1851d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1852d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void setGroupingParens(bool flag) { GroupingParens = flag; }
1853d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool hasGroupingParens() const { return GroupingParens; }
1854d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1855a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool isFirstDeclarator() const { return !CommaLoc.isValid(); }
1856a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SourceLocation getCommaLoc() const { return CommaLoc; }
18574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void setCommaLoc(SourceLocation CL) { CommaLoc = CL; }
18584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool hasEllipsis() const { return EllipsisLoc.isValid(); }
1860a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SourceLocation getEllipsisLoc() const { return EllipsisLoc; }
18614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void setEllipsisLoc(SourceLocation EL) { EllipsisLoc = EL; }
18624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
18638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void setFunctionDefinitionKind(FunctionDefinitionKind Val) {
18648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    FunctionDefinition = Val;
18658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
186623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
18678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool isFunctionDefinition() const {
18688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return getFunctionDefinitionKind() != FDK_Declaration;
18698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
18708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
18718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  FunctionDefinitionKind getFunctionDefinitionKind() const {
18728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return (FunctionDefinitionKind)FunctionDefinition;
18738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
18748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
18758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void setRedeclaration(bool Val) { Redeclaration = Val; }
1876f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool isRedeclaration() const { return Redeclaration; }
18778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)};
18788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
18798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)/// FieldDeclarator - This little struct is used to capture information about
1880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)/// structure field declarators, which is basically just a bitfield size.
18818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)struct FieldDeclarator {
1882f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  Declarator D;
18838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  Expr *BitfieldSize;
18848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  explicit FieldDeclarator(DeclSpec &DS) : D(DS, Declarator::MemberContext) {
1885f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    BitfieldSize = 0;
18868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
18878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)};
18888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
18898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)/// VirtSpecifiers - Represents a C++0x virt-specifier-seq.
18908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class VirtSpecifiers {
18918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)public:
18928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  enum Specifier {
18938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    VS_None = 0,
18948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    VS_Override = 1,
18958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    VS_Final = 2
18968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  };
18978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
18984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  VirtSpecifiers() : Specifiers(0) { }
1899a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
19007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool SetSpecifier(Specifier VS, SourceLocation Loc,
19013240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch                    const char *&PrevSpec);
1902a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
19037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool isOverrideSpecified() const { return Specifiers & VS_Override; }
19047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SourceLocation getOverrideLoc() const { return VS_overrideLoc; }
19057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
19067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool isFinalSpecified() const { return Specifiers & VS_Final; }
19077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SourceLocation getFinalLoc() const { return VS_finalLoc; }
19087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
19097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void clear() { Specifiers = 0; }
19107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
19117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static const char *getSpecifierName(Specifier VS);
19127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
19137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  SourceLocation getLastLocation() const { return LastLocation; }
19147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
19157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)private:
19165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  unsigned Specifiers;
1917a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1918a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SourceLocation VS_overrideLoc, VS_finalLoc;
19195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SourceLocation LastLocation;
19205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
19215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
19225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/// LambdaCaptureDefault - The default, if any, capture method for a
192390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)/// lambda expression.
1924868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)enum LambdaCaptureDefault {
1925868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LCD_None,
1926868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LCD_ByCopy,
1927868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LCD_ByRef
192890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
192990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1930eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// LambdaCaptureKind - The different capture forms in a lambda
1931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch/// introducer: 'this' or a copied or referenced variable.
1932eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochenum LambdaCaptureKind {
1933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  LCK_This,
1934eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  LCK_ByCopy,
1935eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  LCK_ByRef
1936eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
1937eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
193890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)/// LambdaCapture - An individual capture in a lambda introducer.
193990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)struct LambdaCapture {
1940ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  LambdaCaptureKind Kind;
1941ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SourceLocation Loc;
1942116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  IdentifierInfo* Id;
1943ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1944ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  LambdaCapture(LambdaCaptureKind Kind,
1945ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                     SourceLocation Loc,
194690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                     IdentifierInfo* Id = 0)
1947ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : Kind(Kind), Loc(Loc), Id(Id)
1948ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  {}
1949116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
1950ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
195190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)/// LambdaIntroducer - Represents a complete lambda introducer.
195290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)struct LambdaIntroducer {
195390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  SourceRange Range;
1954868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LambdaCaptureDefault Default;
1955868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  llvm::SmallVector<LambdaCapture, 4> Captures;
1956868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1957868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LambdaIntroducer()
195890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : Default(LCD_None) {}
195990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
19607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  /// addCapture - Append a capture in a lambda introducer.
19617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void addCapture(LambdaCaptureKind Kind,
1962c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                  SourceLocation Loc,
19637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                  IdentifierInfo* Id = 0) {
19647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    Captures.push_back(LambdaCapture(Kind, Loc, Id));
19657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
19667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
196790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)};
19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1969868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // end namespace clang
1970868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1971868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
1972868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)