Home | History | Annotate | Download | only in Parse
      1 //===--- Parser.h - C Language Parser ---------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 //  This file defines the Parser interface.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef LLVM_CLANG_PARSE_PARSER_H
     15 #define LLVM_CLANG_PARSE_PARSER_H
     16 
     17 #include "clang/Basic/OpenMPKinds.h"
     18 #include "clang/Basic/OperatorPrecedence.h"
     19 #include "clang/Basic/Specifiers.h"
     20 #include "clang/Lex/CodeCompletionHandler.h"
     21 #include "clang/Lex/Preprocessor.h"
     22 #include "clang/Sema/DeclSpec.h"
     23 #include "clang/Sema/LoopHint.h"
     24 #include "clang/Sema/Sema.h"
     25 #include "llvm/ADT/SmallVector.h"
     26 #include "llvm/Support/Compiler.h"
     27 #include "llvm/Support/PrettyStackTrace.h"
     28 #include "llvm/Support/SaveAndRestore.h"
     29 #include <memory>
     30 #include <stack>
     31 
     32 namespace clang {
     33   class PragmaHandler;
     34   class Scope;
     35   class BalancedDelimiterTracker;
     36   class CorrectionCandidateCallback;
     37   class DeclGroupRef;
     38   class DiagnosticBuilder;
     39   class Parser;
     40   class ParsingDeclRAIIObject;
     41   class ParsingDeclSpec;
     42   class ParsingDeclarator;
     43   class ParsingFieldDeclarator;
     44   class ColonProtectionRAIIObject;
     45   class InMessageExpressionRAIIObject;
     46   class PoisonSEHIdentifiersRAIIObject;
     47   class VersionTuple;
     48   class OMPClause;
     49 
     50 /// Parser - This implements a parser for the C family of languages.  After
     51 /// parsing units of the grammar, productions are invoked to handle whatever has
     52 /// been read.
     53 ///
     54 class Parser : public CodeCompletionHandler {
     55   friend class ColonProtectionRAIIObject;
     56   friend class InMessageExpressionRAIIObject;
     57   friend class PoisonSEHIdentifiersRAIIObject;
     58   friend class ObjCDeclContextSwitch;
     59   friend class ParenBraceBracketBalancer;
     60   friend class BalancedDelimiterTracker;
     61 
     62   Preprocessor &PP;
     63 
     64   /// Tok - The current token we are peeking ahead.  All parsing methods assume
     65   /// that this is valid.
     66   Token Tok;
     67 
     68   // PrevTokLocation - The location of the token we previously
     69   // consumed. This token is used for diagnostics where we expected to
     70   // see a token following another token (e.g., the ';' at the end of
     71   // a statement).
     72   SourceLocation PrevTokLocation;
     73 
     74   unsigned short ParenCount, BracketCount, BraceCount;
     75 
     76   /// Actions - These are the callbacks we invoke as we parse various constructs
     77   /// in the file.
     78   Sema &Actions;
     79 
     80   DiagnosticsEngine &Diags;
     81 
     82   /// ScopeCache - Cache scopes to reduce malloc traffic.
     83   enum { ScopeCacheSize = 16 };
     84   unsigned NumCachedScopes;
     85   Scope *ScopeCache[ScopeCacheSize];
     86 
     87   /// Identifiers used for SEH handling in Borland. These are only
     88   /// allowed in particular circumstances
     89   // __except block
     90   IdentifierInfo *Ident__exception_code,
     91                  *Ident___exception_code,
     92                  *Ident_GetExceptionCode;
     93   // __except filter expression
     94   IdentifierInfo *Ident__exception_info,
     95                  *Ident___exception_info,
     96                  *Ident_GetExceptionInfo;
     97   // __finally
     98   IdentifierInfo *Ident__abnormal_termination,
     99                  *Ident___abnormal_termination,
    100                  *Ident_AbnormalTermination;
    101 
    102   /// Contextual keywords for Microsoft extensions.
    103   IdentifierInfo *Ident__except;
    104   mutable IdentifierInfo *Ident_sealed;
    105 
    106   /// Ident_super - IdentifierInfo for "super", to support fast
    107   /// comparison.
    108   IdentifierInfo *Ident_super;
    109   /// Ident_vector, Ident_pixel, Ident_bool - cached IdentifierInfo's
    110   /// for "vector", "pixel", and "bool" fast comparison.  Only present
    111   /// if AltiVec enabled.
    112   IdentifierInfo *Ident_vector;
    113   IdentifierInfo *Ident_pixel;
    114   IdentifierInfo *Ident_bool;
    115 
    116   /// Objective-C contextual keywords.
    117   mutable IdentifierInfo *Ident_instancetype;
    118 
    119   /// \brief Identifier for "introduced".
    120   IdentifierInfo *Ident_introduced;
    121 
    122   /// \brief Identifier for "deprecated".
    123   IdentifierInfo *Ident_deprecated;
    124 
    125   /// \brief Identifier for "obsoleted".
    126   IdentifierInfo *Ident_obsoleted;
    127 
    128   /// \brief Identifier for "unavailable".
    129   IdentifierInfo *Ident_unavailable;
    130 
    131   /// \brief Identifier for "message".
    132   IdentifierInfo *Ident_message;
    133 
    134   /// C++0x contextual keywords.
    135   mutable IdentifierInfo *Ident_final;
    136   mutable IdentifierInfo *Ident_override;
    137 
    138   // C++ type trait keywords that can be reverted to identifiers and still be
    139   // used as type traits.
    140   llvm::SmallDenseMap<IdentifierInfo *, tok::TokenKind> RevertibleTypeTraits;
    141 
    142   std::unique_ptr<PragmaHandler> AlignHandler;
    143   std::unique_ptr<PragmaHandler> GCCVisibilityHandler;
    144   std::unique_ptr<PragmaHandler> OptionsHandler;
    145   std::unique_ptr<PragmaHandler> PackHandler;
    146   std::unique_ptr<PragmaHandler> MSStructHandler;
    147   std::unique_ptr<PragmaHandler> UnusedHandler;
    148   std::unique_ptr<PragmaHandler> WeakHandler;
    149   std::unique_ptr<PragmaHandler> RedefineExtnameHandler;
    150   std::unique_ptr<PragmaHandler> FPContractHandler;
    151   std::unique_ptr<PragmaHandler> OpenCLExtensionHandler;
    152   std::unique_ptr<PragmaHandler> OpenMPHandler;
    153   std::unique_ptr<PragmaHandler> MSCommentHandler;
    154   std::unique_ptr<PragmaHandler> MSDetectMismatchHandler;
    155   std::unique_ptr<PragmaHandler> MSPointersToMembers;
    156   std::unique_ptr<PragmaHandler> MSVtorDisp;
    157   std::unique_ptr<PragmaHandler> MSInitSeg;
    158   std::unique_ptr<PragmaHandler> MSDataSeg;
    159   std::unique_ptr<PragmaHandler> MSBSSSeg;
    160   std::unique_ptr<PragmaHandler> MSConstSeg;
    161   std::unique_ptr<PragmaHandler> MSCodeSeg;
    162   std::unique_ptr<PragmaHandler> MSSection;
    163   std::unique_ptr<PragmaHandler> OptimizeHandler;
    164   std::unique_ptr<PragmaHandler> LoopHintHandler;
    165   std::unique_ptr<PragmaHandler> UnrollHintHandler;
    166   std::unique_ptr<PragmaHandler> NoUnrollHintHandler;
    167 
    168   std::unique_ptr<CommentHandler> CommentSemaHandler;
    169 
    170   /// Whether the '>' token acts as an operator or not. This will be
    171   /// true except when we are parsing an expression within a C++
    172   /// template argument list, where the '>' closes the template
    173   /// argument list.
    174   bool GreaterThanIsOperator;
    175 
    176   /// ColonIsSacred - When this is false, we aggressively try to recover from
    177   /// code like "foo : bar" as if it were a typo for "foo :: bar".  This is not
    178   /// safe in case statements and a few other things.  This is managed by the
    179   /// ColonProtectionRAIIObject RAII object.
    180   bool ColonIsSacred;
    181 
    182   /// \brief When true, we are directly inside an Objective-C message
    183   /// send expression.
    184   ///
    185   /// This is managed by the \c InMessageExpressionRAIIObject class, and
    186   /// should not be set directly.
    187   bool InMessageExpression;
    188 
    189   /// The "depth" of the template parameters currently being parsed.
    190   unsigned TemplateParameterDepth;
    191 
    192   /// \brief RAII class that manages the template parameter depth.
    193   class TemplateParameterDepthRAII {
    194     unsigned &Depth;
    195     unsigned AddedLevels;
    196   public:
    197     explicit TemplateParameterDepthRAII(unsigned &Depth)
    198       : Depth(Depth), AddedLevels(0) {}
    199 
    200     ~TemplateParameterDepthRAII() {
    201       Depth -= AddedLevels;
    202     }
    203 
    204     void operator++() {
    205       ++Depth;
    206       ++AddedLevels;
    207     }
    208     void addDepth(unsigned D) {
    209       Depth += D;
    210       AddedLevels += D;
    211     }
    212     unsigned getDepth() const { return Depth; }
    213   };
    214 
    215   /// Factory object for creating AttributeList objects.
    216   AttributeFactory AttrFactory;
    217 
    218   /// \brief Gathers and cleans up TemplateIdAnnotations when parsing of a
    219   /// top-level declaration is finished.
    220   SmallVector<TemplateIdAnnotation *, 16> TemplateIds;
    221 
    222   /// \brief Identifiers which have been declared within a tentative parse.
    223   SmallVector<IdentifierInfo *, 8> TentativelyDeclaredIdentifiers;
    224 
    225   IdentifierInfo *getSEHExceptKeyword();
    226 
    227   /// True if we are within an Objective-C container while parsing C-like decls.
    228   ///
    229   /// This is necessary because Sema thinks we have left the container
    230   /// to parse the C-like decls, meaning Actions.getObjCDeclContext() will
    231   /// be NULL.
    232   bool ParsingInObjCContainer;
    233 
    234   bool SkipFunctionBodies;
    235 
    236 public:
    237   Parser(Preprocessor &PP, Sema &Actions, bool SkipFunctionBodies);
    238   ~Parser() override;
    239 
    240   const LangOptions &getLangOpts() const { return PP.getLangOpts(); }
    241   const TargetInfo &getTargetInfo() const { return PP.getTargetInfo(); }
    242   Preprocessor &getPreprocessor() const { return PP; }
    243   Sema &getActions() const { return Actions; }
    244   AttributeFactory &getAttrFactory() { return AttrFactory; }
    245 
    246   const Token &getCurToken() const { return Tok; }
    247   Scope *getCurScope() const { return Actions.getCurScope(); }
    248   void incrementMSManglingNumber() const {
    249     return Actions.incrementMSManglingNumber();
    250   }
    251 
    252   Decl  *getObjCDeclContext() const { return Actions.getObjCDeclContext(); }
    253 
    254   // Type forwarding.  All of these are statically 'void*', but they may all be
    255   // different actual classes based on the actions in place.
    256   typedef OpaquePtr<DeclGroupRef> DeclGroupPtrTy;
    257   typedef OpaquePtr<TemplateName> TemplateTy;
    258 
    259   typedef SmallVector<TemplateParameterList *, 4> TemplateParameterLists;
    260 
    261   typedef Sema::FullExprArg FullExprArg;
    262 
    263   // Parsing methods.
    264 
    265   /// Initialize - Warm up the parser.
    266   ///
    267   void Initialize();
    268 
    269   /// ParseTopLevelDecl - Parse one top-level declaration. Returns true if
    270   /// the EOF was encountered.
    271   bool ParseTopLevelDecl(DeclGroupPtrTy &Result);
    272   bool ParseTopLevelDecl() {
    273     DeclGroupPtrTy Result;
    274     return ParseTopLevelDecl(Result);
    275   }
    276 
    277   /// ConsumeToken - Consume the current 'peek token' and lex the next one.
    278   /// This does not work with special tokens: string literals, code completion
    279   /// and balanced tokens must be handled using the specific consume methods.
    280   /// Returns the location of the consumed token.
    281   SourceLocation ConsumeToken() {
    282     assert(!isTokenSpecial() &&
    283            "Should consume special tokens with Consume*Token");
    284     PrevTokLocation = Tok.getLocation();
    285     PP.Lex(Tok);
    286     return PrevTokLocation;
    287   }
    288 
    289   bool TryConsumeToken(tok::TokenKind Expected) {
    290     if (Tok.isNot(Expected))
    291       return false;
    292     assert(!isTokenSpecial() &&
    293            "Should consume special tokens with Consume*Token");
    294     PrevTokLocation = Tok.getLocation();
    295     PP.Lex(Tok);
    296     return true;
    297   }
    298 
    299   bool TryConsumeToken(tok::TokenKind Expected, SourceLocation &Loc) {
    300     if (!TryConsumeToken(Expected))
    301       return false;
    302     Loc = PrevTokLocation;
    303     return true;
    304   }
    305 
    306 private:
    307   //===--------------------------------------------------------------------===//
    308   // Low-Level token peeking and consumption methods.
    309   //
    310 
    311   /// isTokenParen - Return true if the cur token is '(' or ')'.
    312   bool isTokenParen() const {
    313     return Tok.getKind() == tok::l_paren || Tok.getKind() == tok::r_paren;
    314   }
    315   /// isTokenBracket - Return true if the cur token is '[' or ']'.
    316   bool isTokenBracket() const {
    317     return Tok.getKind() == tok::l_square || Tok.getKind() == tok::r_square;
    318   }
    319   /// isTokenBrace - Return true if the cur token is '{' or '}'.
    320   bool isTokenBrace() const {
    321     return Tok.getKind() == tok::l_brace || Tok.getKind() == tok::r_brace;
    322   }
    323   /// isTokenStringLiteral - True if this token is a string-literal.
    324   bool isTokenStringLiteral() const {
    325     return tok::isStringLiteral(Tok.getKind());
    326   }
    327   /// isTokenSpecial - True if this token requires special consumption methods.
    328   bool isTokenSpecial() const {
    329     return isTokenStringLiteral() || isTokenParen() || isTokenBracket() ||
    330            isTokenBrace() || Tok.is(tok::code_completion);
    331   }
    332 
    333   /// \brief Returns true if the current token is '=' or is a type of '='.
    334   /// For typos, give a fixit to '='
    335   bool isTokenEqualOrEqualTypo();
    336 
    337   /// \brief Return the current token to the token stream and make the given
    338   /// token the current token.
    339   void UnconsumeToken(Token &Consumed) {
    340       Token Next = Tok;
    341       PP.EnterToken(Consumed);
    342       PP.Lex(Tok);
    343       PP.EnterToken(Next);
    344   }
    345 
    346   /// ConsumeAnyToken - Dispatch to the right Consume* method based on the
    347   /// current token type.  This should only be used in cases where the type of
    348   /// the token really isn't known, e.g. in error recovery.
    349   SourceLocation ConsumeAnyToken(bool ConsumeCodeCompletionTok = false) {
    350     if (isTokenParen())
    351       return ConsumeParen();
    352     if (isTokenBracket())
    353       return ConsumeBracket();
    354     if (isTokenBrace())
    355       return ConsumeBrace();
    356     if (isTokenStringLiteral())
    357       return ConsumeStringToken();
    358     if (Tok.is(tok::code_completion))
    359       return ConsumeCodeCompletionTok ? ConsumeCodeCompletionToken()
    360                                       : handleUnexpectedCodeCompletionToken();
    361     return ConsumeToken();
    362   }
    363 
    364   /// ConsumeParen - This consume method keeps the paren count up-to-date.
    365   ///
    366   SourceLocation ConsumeParen() {
    367     assert(isTokenParen() && "wrong consume method");
    368     if (Tok.getKind() == tok::l_paren)
    369       ++ParenCount;
    370     else if (ParenCount)
    371       --ParenCount;       // Don't let unbalanced )'s drive the count negative.
    372     PrevTokLocation = Tok.getLocation();
    373     PP.Lex(Tok);
    374     return PrevTokLocation;
    375   }
    376 
    377   /// ConsumeBracket - This consume method keeps the bracket count up-to-date.
    378   ///
    379   SourceLocation ConsumeBracket() {
    380     assert(isTokenBracket() && "wrong consume method");
    381     if (Tok.getKind() == tok::l_square)
    382       ++BracketCount;
    383     else if (BracketCount)
    384       --BracketCount;     // Don't let unbalanced ]'s drive the count negative.
    385 
    386     PrevTokLocation = Tok.getLocation();
    387     PP.Lex(Tok);
    388     return PrevTokLocation;
    389   }
    390 
    391   /// ConsumeBrace - This consume method keeps the brace count up-to-date.
    392   ///
    393   SourceLocation ConsumeBrace() {
    394     assert(isTokenBrace() && "wrong consume method");
    395     if (Tok.getKind() == tok::l_brace)
    396       ++BraceCount;
    397     else if (BraceCount)
    398       --BraceCount;     // Don't let unbalanced }'s drive the count negative.
    399 
    400     PrevTokLocation = Tok.getLocation();
    401     PP.Lex(Tok);
    402     return PrevTokLocation;
    403   }
    404 
    405   /// ConsumeStringToken - Consume the current 'peek token', lexing a new one
    406   /// and returning the token kind.  This method is specific to strings, as it
    407   /// handles string literal concatenation, as per C99 5.1.1.2, translation
    408   /// phase #6.
    409   SourceLocation ConsumeStringToken() {
    410     assert(isTokenStringLiteral() &&
    411            "Should only consume string literals with this method");
    412     PrevTokLocation = Tok.getLocation();
    413     PP.Lex(Tok);
    414     return PrevTokLocation;
    415   }
    416 
    417   /// \brief Consume the current code-completion token.
    418   ///
    419   /// This routine can be called to consume the code-completion token and
    420   /// continue processing in special cases where \c cutOffParsing() isn't
    421   /// desired, such as token caching or completion with lookahead.
    422   SourceLocation ConsumeCodeCompletionToken() {
    423     assert(Tok.is(tok::code_completion));
    424     PrevTokLocation = Tok.getLocation();
    425     PP.Lex(Tok);
    426     return PrevTokLocation;
    427   }
    428 
    429   ///\ brief When we are consuming a code-completion token without having
    430   /// matched specific position in the grammar, provide code-completion results
    431   /// based on context.
    432   ///
    433   /// \returns the source location of the code-completion token.
    434   SourceLocation handleUnexpectedCodeCompletionToken();
    435 
    436   /// \brief Abruptly cut off parsing; mainly used when we have reached the
    437   /// code-completion point.
    438   void cutOffParsing() {
    439     if (PP.isCodeCompletionEnabled())
    440       PP.setCodeCompletionReached();
    441     // Cut off parsing by acting as if we reached the end-of-file.
    442     Tok.setKind(tok::eof);
    443   }
    444 
    445   /// \brief Determine if we're at the end of the file or at a transition
    446   /// between modules.
    447   bool isEofOrEom() {
    448     tok::TokenKind Kind = Tok.getKind();
    449     return Kind == tok::eof || Kind == tok::annot_module_begin ||
    450            Kind == tok::annot_module_end || Kind == tok::annot_module_include;
    451   }
    452 
    453   /// \brief Initialize all pragma handlers.
    454   void initializePragmaHandlers();
    455 
    456   /// \brief Destroy and reset all pragma handlers.
    457   void resetPragmaHandlers();
    458 
    459   /// \brief Handle the annotation token produced for #pragma unused(...)
    460   void HandlePragmaUnused();
    461 
    462   /// \brief Handle the annotation token produced for
    463   /// #pragma GCC visibility...
    464   void HandlePragmaVisibility();
    465 
    466   /// \brief Handle the annotation token produced for
    467   /// #pragma pack...
    468   void HandlePragmaPack();
    469 
    470   /// \brief Handle the annotation token produced for
    471   /// #pragma ms_struct...
    472   void HandlePragmaMSStruct();
    473 
    474   /// \brief Handle the annotation token produced for
    475   /// #pragma comment...
    476   void HandlePragmaMSComment();
    477 
    478   void HandlePragmaMSPointersToMembers();
    479 
    480   void HandlePragmaMSVtorDisp();
    481 
    482   void HandlePragmaMSPragma();
    483   bool HandlePragmaMSSection(StringRef PragmaName,
    484                              SourceLocation PragmaLocation);
    485   bool HandlePragmaMSSegment(StringRef PragmaName,
    486                              SourceLocation PragmaLocation);
    487   bool HandlePragmaMSInitSeg(StringRef PragmaName,
    488                              SourceLocation PragmaLocation);
    489 
    490   /// \brief Handle the annotation token produced for
    491   /// #pragma align...
    492   void HandlePragmaAlign();
    493 
    494   /// \brief Handle the annotation token produced for
    495   /// #pragma weak id...
    496   void HandlePragmaWeak();
    497 
    498   /// \brief Handle the annotation token produced for
    499   /// #pragma weak id = id...
    500   void HandlePragmaWeakAlias();
    501 
    502   /// \brief Handle the annotation token produced for
    503   /// #pragma redefine_extname...
    504   void HandlePragmaRedefineExtname();
    505 
    506   /// \brief Handle the annotation token produced for
    507   /// #pragma STDC FP_CONTRACT...
    508   void HandlePragmaFPContract();
    509 
    510   /// \brief Handle the annotation token produced for
    511   /// #pragma OPENCL EXTENSION...
    512   void HandlePragmaOpenCLExtension();
    513 
    514   /// \brief Handle the annotation token produced for
    515   /// #pragma clang __debug captured
    516   StmtResult HandlePragmaCaptured();
    517 
    518   /// \brief Handle the annotation token produced for
    519   /// #pragma clang loop and #pragma unroll.
    520   bool HandlePragmaLoopHint(LoopHint &Hint);
    521 
    522   /// GetLookAheadToken - This peeks ahead N tokens and returns that token
    523   /// without consuming any tokens.  LookAhead(0) returns 'Tok', LookAhead(1)
    524   /// returns the token after Tok, etc.
    525   ///
    526   /// Note that this differs from the Preprocessor's LookAhead method, because
    527   /// the Parser always has one token lexed that the preprocessor doesn't.
    528   ///
    529   const Token &GetLookAheadToken(unsigned N) {
    530     if (N == 0 || Tok.is(tok::eof)) return Tok;
    531     return PP.LookAhead(N-1);
    532   }
    533 
    534 public:
    535   /// NextToken - This peeks ahead one token and returns it without
    536   /// consuming it.
    537   const Token &NextToken() {
    538     return PP.LookAhead(0);
    539   }
    540 
    541   /// getTypeAnnotation - Read a parsed type out of an annotation token.
    542   static ParsedType getTypeAnnotation(Token &Tok) {
    543     return ParsedType::getFromOpaquePtr(Tok.getAnnotationValue());
    544   }
    545 
    546 private:
    547   static void setTypeAnnotation(Token &Tok, ParsedType T) {
    548     Tok.setAnnotationValue(T.getAsOpaquePtr());
    549   }
    550 
    551   /// \brief Read an already-translated primary expression out of an annotation
    552   /// token.
    553   static ExprResult getExprAnnotation(Token &Tok) {
    554     return ExprResult::getFromOpaquePointer(Tok.getAnnotationValue());
    555   }
    556 
    557   /// \brief Set the primary expression corresponding to the given annotation
    558   /// token.
    559   static void setExprAnnotation(Token &Tok, ExprResult ER) {
    560     Tok.setAnnotationValue(ER.getAsOpaquePointer());
    561   }
    562 
    563 public:
    564   // If NeedType is true, then TryAnnotateTypeOrScopeToken will try harder to
    565   // find a type name by attempting typo correction.
    566   bool TryAnnotateTypeOrScopeToken(bool EnteringContext = false,
    567                                    bool NeedType = false);
    568   bool TryAnnotateTypeOrScopeTokenAfterScopeSpec(bool EnteringContext,
    569                                                  bool NeedType,
    570                                                  CXXScopeSpec &SS,
    571                                                  bool IsNewScope);
    572   bool TryAnnotateCXXScopeToken(bool EnteringContext = false);
    573 
    574 private:
    575   enum AnnotatedNameKind {
    576     /// Annotation has failed and emitted an error.
    577     ANK_Error,
    578     /// The identifier is a tentatively-declared name.
    579     ANK_TentativeDecl,
    580     /// The identifier is a template name. FIXME: Add an annotation for that.
    581     ANK_TemplateName,
    582     /// The identifier can't be resolved.
    583     ANK_Unresolved,
    584     /// Annotation was successful.
    585     ANK_Success
    586   };
    587   AnnotatedNameKind
    588   TryAnnotateName(bool IsAddressOfOperand,
    589                   std::unique_ptr<CorrectionCandidateCallback> CCC = nullptr);
    590 
    591   /// Push a tok::annot_cxxscope token onto the token stream.
    592   void AnnotateScopeToken(CXXScopeSpec &SS, bool IsNewAnnotation);
    593 
    594   /// TryAltiVecToken - Check for context-sensitive AltiVec identifier tokens,
    595   /// replacing them with the non-context-sensitive keywords.  This returns
    596   /// true if the token was replaced.
    597   bool TryAltiVecToken(DeclSpec &DS, SourceLocation Loc,
    598                        const char *&PrevSpec, unsigned &DiagID,
    599                        bool &isInvalid) {
    600     if (!getLangOpts().AltiVec ||
    601         (Tok.getIdentifierInfo() != Ident_vector &&
    602          Tok.getIdentifierInfo() != Ident_pixel &&
    603          Tok.getIdentifierInfo() != Ident_bool))
    604       return false;
    605 
    606     return TryAltiVecTokenOutOfLine(DS, Loc, PrevSpec, DiagID, isInvalid);
    607   }
    608 
    609   /// TryAltiVecVectorToken - Check for context-sensitive AltiVec vector
    610   /// identifier token, replacing it with the non-context-sensitive __vector.
    611   /// This returns true if the token was replaced.
    612   bool TryAltiVecVectorToken() {
    613     if (!getLangOpts().AltiVec ||
    614         Tok.getIdentifierInfo() != Ident_vector) return false;
    615     return TryAltiVecVectorTokenOutOfLine();
    616   }
    617 
    618   bool TryAltiVecVectorTokenOutOfLine();
    619   bool TryAltiVecTokenOutOfLine(DeclSpec &DS, SourceLocation Loc,
    620                                 const char *&PrevSpec, unsigned &DiagID,
    621                                 bool &isInvalid);
    622 
    623   /// TryKeywordIdentFallback - For compatibility with system headers using
    624   /// keywords as identifiers, attempt to convert the current token to an
    625   /// identifier and optionally disable the keyword for the remainder of the
    626   /// translation unit. This returns false if the token was not replaced,
    627   /// otherwise emits a diagnostic and returns true.
    628   bool TryKeywordIdentFallback(bool DisableKeyword);
    629 
    630   /// \brief Get the TemplateIdAnnotation from the token.
    631   TemplateIdAnnotation *takeTemplateIdAnnotation(const Token &tok);
    632 
    633   /// TentativeParsingAction - An object that is used as a kind of "tentative
    634   /// parsing transaction". It gets instantiated to mark the token position and
    635   /// after the token consumption is done, Commit() or Revert() is called to
    636   /// either "commit the consumed tokens" or revert to the previously marked
    637   /// token position. Example:
    638   ///
    639   ///   TentativeParsingAction TPA(*this);
    640   ///   ConsumeToken();
    641   ///   ....
    642   ///   TPA.Revert();
    643   ///
    644   class TentativeParsingAction {
    645     Parser &P;
    646     Token PrevTok;
    647     size_t PrevTentativelyDeclaredIdentifierCount;
    648     unsigned short PrevParenCount, PrevBracketCount, PrevBraceCount;
    649     bool isActive;
    650 
    651   public:
    652     explicit TentativeParsingAction(Parser& p) : P(p) {
    653       PrevTok = P.Tok;
    654       PrevTentativelyDeclaredIdentifierCount =
    655           P.TentativelyDeclaredIdentifiers.size();
    656       PrevParenCount = P.ParenCount;
    657       PrevBracketCount = P.BracketCount;
    658       PrevBraceCount = P.BraceCount;
    659       P.PP.EnableBacktrackAtThisPos();
    660       isActive = true;
    661     }
    662     void Commit() {
    663       assert(isActive && "Parsing action was finished!");
    664       P.TentativelyDeclaredIdentifiers.resize(
    665           PrevTentativelyDeclaredIdentifierCount);
    666       P.PP.CommitBacktrackedTokens();
    667       isActive = false;
    668     }
    669     void Revert() {
    670       assert(isActive && "Parsing action was finished!");
    671       P.PP.Backtrack();
    672       P.Tok = PrevTok;
    673       P.TentativelyDeclaredIdentifiers.resize(
    674           PrevTentativelyDeclaredIdentifierCount);
    675       P.ParenCount = PrevParenCount;
    676       P.BracketCount = PrevBracketCount;
    677       P.BraceCount = PrevBraceCount;
    678       isActive = false;
    679     }
    680     ~TentativeParsingAction() {
    681       assert(!isActive && "Forgot to call Commit or Revert!");
    682     }
    683   };
    684   class UnannotatedTentativeParsingAction;
    685 
    686   /// ObjCDeclContextSwitch - An object used to switch context from
    687   /// an objective-c decl context to its enclosing decl context and
    688   /// back.
    689   class ObjCDeclContextSwitch {
    690     Parser &P;
    691     Decl *DC;
    692     SaveAndRestore<bool> WithinObjCContainer;
    693   public:
    694     explicit ObjCDeclContextSwitch(Parser &p)
    695       : P(p), DC(p.getObjCDeclContext()),
    696         WithinObjCContainer(P.ParsingInObjCContainer, DC != nullptr) {
    697       if (DC)
    698         P.Actions.ActOnObjCTemporaryExitContainerContext(cast<DeclContext>(DC));
    699     }
    700     ~ObjCDeclContextSwitch() {
    701       if (DC)
    702         P.Actions.ActOnObjCReenterContainerContext(cast<DeclContext>(DC));
    703     }
    704   };
    705 
    706   /// ExpectAndConsume - The parser expects that 'ExpectedTok' is next in the
    707   /// input.  If so, it is consumed and false is returned.
    708   ///
    709   /// If a trivial punctuator misspelling is encountered, a FixIt error
    710   /// diagnostic is issued and false is returned after recovery.
    711   ///
    712   /// If the input is malformed, this emits the specified diagnostic and true is
    713   /// returned.
    714   bool ExpectAndConsume(tok::TokenKind ExpectedTok,
    715                         unsigned Diag = diag::err_expected,
    716                         StringRef DiagMsg = "");
    717 
    718   /// \brief The parser expects a semicolon and, if present, will consume it.
    719   ///
    720   /// If the next token is not a semicolon, this emits the specified diagnostic,
    721   /// or, if there's just some closing-delimiter noise (e.g., ')' or ']') prior
    722   /// to the semicolon, consumes that extra token.
    723   bool ExpectAndConsumeSemi(unsigned DiagID);
    724 
    725   /// \brief The kind of extra semi diagnostic to emit.
    726   enum ExtraSemiKind {
    727     OutsideFunction = 0,
    728     InsideStruct = 1,
    729     InstanceVariableList = 2,
    730     AfterMemberFunctionDefinition = 3
    731   };
    732 
    733   /// \brief Consume any extra semi-colons until the end of the line.
    734   void ConsumeExtraSemi(ExtraSemiKind Kind, unsigned TST = TST_unspecified);
    735 
    736 public:
    737   //===--------------------------------------------------------------------===//
    738   // Scope manipulation
    739 
    740   /// ParseScope - Introduces a new scope for parsing. The kind of
    741   /// scope is determined by ScopeFlags. Objects of this type should
    742   /// be created on the stack to coincide with the position where the
    743   /// parser enters the new scope, and this object's constructor will
    744   /// create that new scope. Similarly, once the object is destroyed
    745   /// the parser will exit the scope.
    746   class ParseScope {
    747     Parser *Self;
    748     ParseScope(const ParseScope &) = delete;
    749     void operator=(const ParseScope &) = delete;
    750 
    751   public:
    752     // ParseScope - Construct a new object to manage a scope in the
    753     // parser Self where the new Scope is created with the flags
    754     // ScopeFlags, but only when we aren't about to enter a compound statement.
    755     ParseScope(Parser *Self, unsigned ScopeFlags, bool EnteredScope = true,
    756                bool BeforeCompoundStmt = false)
    757       : Self(Self) {
    758       if (EnteredScope && !BeforeCompoundStmt)
    759         Self->EnterScope(ScopeFlags);
    760       else {
    761         if (BeforeCompoundStmt)
    762           Self->incrementMSManglingNumber();
    763 
    764         this->Self = nullptr;
    765       }
    766     }
    767 
    768     // Exit - Exit the scope associated with this object now, rather
    769     // than waiting until the object is destroyed.
    770     void Exit() {
    771       if (Self) {
    772         Self->ExitScope();
    773         Self = nullptr;
    774       }
    775     }
    776 
    777     ~ParseScope() {
    778       Exit();
    779     }
    780   };
    781 
    782   /// EnterScope - Start a new scope.
    783   void EnterScope(unsigned ScopeFlags);
    784 
    785   /// ExitScope - Pop a scope off the scope stack.
    786   void ExitScope();
    787 
    788 private:
    789   /// \brief RAII object used to modify the scope flags for the current scope.
    790   class ParseScopeFlags {
    791     Scope *CurScope;
    792     unsigned OldFlags;
    793     ParseScopeFlags(const ParseScopeFlags &) = delete;
    794     void operator=(const ParseScopeFlags &) = delete;
    795 
    796   public:
    797     ParseScopeFlags(Parser *Self, unsigned ScopeFlags, bool ManageFlags = true);
    798     ~ParseScopeFlags();
    799   };
    800 
    801   //===--------------------------------------------------------------------===//
    802   // Diagnostic Emission and Error recovery.
    803 
    804 public:
    805   DiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID);
    806   DiagnosticBuilder Diag(const Token &Tok, unsigned DiagID);
    807   DiagnosticBuilder Diag(unsigned DiagID) {
    808     return Diag(Tok, DiagID);
    809   }
    810 
    811 private:
    812   void SuggestParentheses(SourceLocation Loc, unsigned DK,
    813                           SourceRange ParenRange);
    814   void CheckNestedObjCContexts(SourceLocation AtLoc);
    815 
    816 public:
    817 
    818   /// \brief Control flags for SkipUntil functions.
    819   enum SkipUntilFlags {
    820     StopAtSemi = 1 << 0,  ///< Stop skipping at semicolon
    821     /// \brief Stop skipping at specified token, but don't skip the token itself
    822     StopBeforeMatch = 1 << 1,
    823     StopAtCodeCompletion = 1 << 2 ///< Stop at code completion
    824   };
    825 
    826   friend LLVM_CONSTEXPR SkipUntilFlags operator|(SkipUntilFlags L,
    827                                                  SkipUntilFlags R) {
    828     return static_cast<SkipUntilFlags>(static_cast<unsigned>(L) |
    829                                        static_cast<unsigned>(R));
    830   }
    831 
    832   /// SkipUntil - Read tokens until we get to the specified token, then consume
    833   /// it (unless StopBeforeMatch is specified).  Because we cannot guarantee
    834   /// that the token will ever occur, this skips to the next token, or to some
    835   /// likely good stopping point.  If Flags has StopAtSemi flag, skipping will
    836   /// stop at a ';' character.
    837   ///
    838   /// If SkipUntil finds the specified token, it returns true, otherwise it
    839   /// returns false.
    840   bool SkipUntil(tok::TokenKind T,
    841                  SkipUntilFlags Flags = static_cast<SkipUntilFlags>(0)) {
    842     return SkipUntil(llvm::makeArrayRef(T), Flags);
    843   }
    844   bool SkipUntil(tok::TokenKind T1, tok::TokenKind T2,
    845                  SkipUntilFlags Flags = static_cast<SkipUntilFlags>(0)) {
    846     tok::TokenKind TokArray[] = {T1, T2};
    847     return SkipUntil(TokArray, Flags);
    848   }
    849   bool SkipUntil(tok::TokenKind T1, tok::TokenKind T2, tok::TokenKind T3,
    850                  SkipUntilFlags Flags = static_cast<SkipUntilFlags>(0)) {
    851     tok::TokenKind TokArray[] = {T1, T2, T3};
    852     return SkipUntil(TokArray, Flags);
    853   }
    854   bool SkipUntil(ArrayRef<tok::TokenKind> Toks,
    855                  SkipUntilFlags Flags = static_cast<SkipUntilFlags>(0));
    856 
    857   /// SkipMalformedDecl - Read tokens until we get to some likely good stopping
    858   /// point for skipping past a simple-declaration.
    859   void SkipMalformedDecl();
    860 
    861 private:
    862   //===--------------------------------------------------------------------===//
    863   // Lexing and parsing of C++ inline methods.
    864 
    865   struct ParsingClass;
    866 
    867   /// [class.mem]p1: "... the class is regarded as complete within
    868   /// - function bodies
    869   /// - default arguments
    870   /// - exception-specifications (TODO: C++0x)
    871   /// - and brace-or-equal-initializers for non-static data members
    872   /// (including such things in nested classes)."
    873   /// LateParsedDeclarations build the tree of those elements so they can
    874   /// be parsed after parsing the top-level class.
    875   class LateParsedDeclaration {
    876   public:
    877     virtual ~LateParsedDeclaration();
    878 
    879     virtual void ParseLexedMethodDeclarations();
    880     virtual void ParseLexedMemberInitializers();
    881     virtual void ParseLexedMethodDefs();
    882     virtual void ParseLexedAttributes();
    883   };
    884 
    885   /// Inner node of the LateParsedDeclaration tree that parses
    886   /// all its members recursively.
    887   class LateParsedClass : public LateParsedDeclaration {
    888   public:
    889     LateParsedClass(Parser *P, ParsingClass *C);
    890     ~LateParsedClass() override;
    891 
    892     void ParseLexedMethodDeclarations() override;
    893     void ParseLexedMemberInitializers() override;
    894     void ParseLexedMethodDefs() override;
    895     void ParseLexedAttributes() override;
    896 
    897   private:
    898     Parser *Self;
    899     ParsingClass *Class;
    900   };
    901 
    902   /// Contains the lexed tokens of an attribute with arguments that
    903   /// may reference member variables and so need to be parsed at the
    904   /// end of the class declaration after parsing all other member
    905   /// member declarations.
    906   /// FIXME: Perhaps we should change the name of LateParsedDeclaration to
    907   /// LateParsedTokens.
    908   struct LateParsedAttribute : public LateParsedDeclaration {
    909     Parser *Self;
    910     CachedTokens Toks;
    911     IdentifierInfo &AttrName;
    912     SourceLocation AttrNameLoc;
    913     SmallVector<Decl*, 2> Decls;
    914 
    915     explicit LateParsedAttribute(Parser *P, IdentifierInfo &Name,
    916                                  SourceLocation Loc)
    917       : Self(P), AttrName(Name), AttrNameLoc(Loc) {}
    918 
    919     void ParseLexedAttributes() override;
    920 
    921     void addDecl(Decl *D) { Decls.push_back(D); }
    922   };
    923 
    924   // A list of late-parsed attributes.  Used by ParseGNUAttributes.
    925   class LateParsedAttrList: public SmallVector<LateParsedAttribute *, 2> {
    926   public:
    927     LateParsedAttrList(bool PSoon = false) : ParseSoon(PSoon) { }
    928 
    929     bool parseSoon() { return ParseSoon; }
    930 
    931   private:
    932     bool ParseSoon;  // Are we planning to parse these shortly after creation?
    933   };
    934 
    935   /// Contains the lexed tokens of a member function definition
    936   /// which needs to be parsed at the end of the class declaration
    937   /// after parsing all other member declarations.
    938   struct LexedMethod : public LateParsedDeclaration {
    939     Parser *Self;
    940     Decl *D;
    941     CachedTokens Toks;
    942 
    943     /// \brief Whether this member function had an associated template
    944     /// scope. When true, D is a template declaration.
    945     /// otherwise, it is a member function declaration.
    946     bool TemplateScope;
    947 
    948     explicit LexedMethod(Parser* P, Decl *MD)
    949       : Self(P), D(MD), TemplateScope(false) {}
    950 
    951     void ParseLexedMethodDefs() override;
    952   };
    953 
    954   /// LateParsedDefaultArgument - Keeps track of a parameter that may
    955   /// have a default argument that cannot be parsed yet because it
    956   /// occurs within a member function declaration inside the class
    957   /// (C++ [class.mem]p2).
    958   struct LateParsedDefaultArgument {
    959     explicit LateParsedDefaultArgument(Decl *P,
    960                                        CachedTokens *Toks = nullptr)
    961       : Param(P), Toks(Toks) { }
    962 
    963     /// Param - The parameter declaration for this parameter.
    964     Decl *Param;
    965 
    966     /// Toks - The sequence of tokens that comprises the default
    967     /// argument expression, not including the '=' or the terminating
    968     /// ')' or ','. This will be NULL for parameters that have no
    969     /// default argument.
    970     CachedTokens *Toks;
    971   };
    972 
    973   /// LateParsedMethodDeclaration - A method declaration inside a class that
    974   /// contains at least one entity whose parsing needs to be delayed
    975   /// until the class itself is completely-defined, such as a default
    976   /// argument (C++ [class.mem]p2).
    977   struct LateParsedMethodDeclaration : public LateParsedDeclaration {
    978     explicit LateParsedMethodDeclaration(Parser *P, Decl *M)
    979       : Self(P), Method(M), TemplateScope(false),
    980         ExceptionSpecTokens(nullptr) {}
    981 
    982     void ParseLexedMethodDeclarations() override;
    983 
    984     Parser* Self;
    985 
    986     /// Method - The method declaration.
    987     Decl *Method;
    988 
    989     /// \brief Whether this member function had an associated template
    990     /// scope. When true, D is a template declaration.
    991     /// othewise, it is a member function declaration.
    992     bool TemplateScope;
    993 
    994     /// DefaultArgs - Contains the parameters of the function and
    995     /// their default arguments. At least one of the parameters will
    996     /// have a default argument, but all of the parameters of the
    997     /// method will be stored so that they can be reintroduced into
    998     /// scope at the appropriate times.
    999     SmallVector<LateParsedDefaultArgument, 8> DefaultArgs;
   1000 
   1001     /// \brief The set of tokens that make up an exception-specification that
   1002     /// has not yet been parsed.
   1003     CachedTokens *ExceptionSpecTokens;
   1004   };
   1005 
   1006   /// LateParsedMemberInitializer - An initializer for a non-static class data
   1007   /// member whose parsing must to be delayed until the class is completely
   1008   /// defined (C++11 [class.mem]p2).
   1009   struct LateParsedMemberInitializer : public LateParsedDeclaration {
   1010     LateParsedMemberInitializer(Parser *P, Decl *FD)
   1011       : Self(P), Field(FD) { }
   1012 
   1013     void ParseLexedMemberInitializers() override;
   1014 
   1015     Parser *Self;
   1016 
   1017     /// Field - The field declaration.
   1018     Decl *Field;
   1019 
   1020     /// CachedTokens - The sequence of tokens that comprises the initializer,
   1021     /// including any leading '='.
   1022     CachedTokens Toks;
   1023   };
   1024 
   1025   /// LateParsedDeclarationsContainer - During parsing of a top (non-nested)
   1026   /// C++ class, its method declarations that contain parts that won't be
   1027   /// parsed until after the definition is completed (C++ [class.mem]p2),
   1028   /// the method declarations and possibly attached inline definitions
   1029   /// will be stored here with the tokens that will be parsed to create those
   1030   /// entities.
   1031   typedef SmallVector<LateParsedDeclaration*,2> LateParsedDeclarationsContainer;
   1032 
   1033   /// \brief Representation of a class that has been parsed, including
   1034   /// any member function declarations or definitions that need to be
   1035   /// parsed after the corresponding top-level class is complete.
   1036   struct ParsingClass {
   1037     ParsingClass(Decl *TagOrTemplate, bool TopLevelClass, bool IsInterface)
   1038       : TopLevelClass(TopLevelClass), TemplateScope(false),
   1039         IsInterface(IsInterface), TagOrTemplate(TagOrTemplate) { }
   1040 
   1041     /// \brief Whether this is a "top-level" class, meaning that it is
   1042     /// not nested within another class.
   1043     bool TopLevelClass : 1;
   1044 
   1045     /// \brief Whether this class had an associated template
   1046     /// scope. When true, TagOrTemplate is a template declaration;
   1047     /// othewise, it is a tag declaration.
   1048     bool TemplateScope : 1;
   1049 
   1050     /// \brief Whether this class is an __interface.
   1051     bool IsInterface : 1;
   1052 
   1053     /// \brief The class or class template whose definition we are parsing.
   1054     Decl *TagOrTemplate;
   1055 
   1056     /// LateParsedDeclarations - Method declarations, inline definitions and
   1057     /// nested classes that contain pieces whose parsing will be delayed until
   1058     /// the top-level class is fully defined.
   1059     LateParsedDeclarationsContainer LateParsedDeclarations;
   1060   };
   1061 
   1062   /// \brief The stack of classes that is currently being
   1063   /// parsed. Nested and local classes will be pushed onto this stack
   1064   /// when they are parsed, and removed afterward.
   1065   std::stack<ParsingClass *> ClassStack;
   1066 
   1067   ParsingClass &getCurrentClass() {
   1068     assert(!ClassStack.empty() && "No lexed method stacks!");
   1069     return *ClassStack.top();
   1070   }
   1071 
   1072   /// \brief RAII object used to manage the parsing of a class definition.
   1073   class ParsingClassDefinition {
   1074     Parser &P;
   1075     bool Popped;
   1076     Sema::ParsingClassState State;
   1077 
   1078   public:
   1079     ParsingClassDefinition(Parser &P, Decl *TagOrTemplate, bool TopLevelClass,
   1080                            bool IsInterface)
   1081       : P(P), Popped(false),
   1082         State(P.PushParsingClass(TagOrTemplate, TopLevelClass, IsInterface)) {
   1083     }
   1084 
   1085     /// \brief Pop this class of the stack.
   1086     void Pop() {
   1087       assert(!Popped && "Nested class has already been popped");
   1088       Popped = true;
   1089       P.PopParsingClass(State);
   1090     }
   1091 
   1092     ~ParsingClassDefinition() {
   1093       if (!Popped)
   1094         P.PopParsingClass(State);
   1095     }
   1096   };
   1097 
   1098   /// \brief Contains information about any template-specific
   1099   /// information that has been parsed prior to parsing declaration
   1100   /// specifiers.
   1101   struct ParsedTemplateInfo {
   1102     ParsedTemplateInfo()
   1103       : Kind(NonTemplate), TemplateParams(nullptr), TemplateLoc() { }
   1104 
   1105     ParsedTemplateInfo(TemplateParameterLists *TemplateParams,
   1106                        bool isSpecialization,
   1107                        bool lastParameterListWasEmpty = false)
   1108       : Kind(isSpecialization? ExplicitSpecialization : Template),
   1109         TemplateParams(TemplateParams),
   1110         LastParameterListWasEmpty(lastParameterListWasEmpty) { }
   1111 
   1112     explicit ParsedTemplateInfo(SourceLocation ExternLoc,
   1113                                 SourceLocation TemplateLoc)
   1114       : Kind(ExplicitInstantiation), TemplateParams(nullptr),
   1115         ExternLoc(ExternLoc), TemplateLoc(TemplateLoc),
   1116         LastParameterListWasEmpty(false){ }
   1117 
   1118     /// \brief The kind of template we are parsing.
   1119     enum {
   1120       /// \brief We are not parsing a template at all.
   1121       NonTemplate = 0,
   1122       /// \brief We are parsing a template declaration.
   1123       Template,
   1124       /// \brief We are parsing an explicit specialization.
   1125       ExplicitSpecialization,
   1126       /// \brief We are parsing an explicit instantiation.
   1127       ExplicitInstantiation
   1128     } Kind;
   1129 
   1130     /// \brief The template parameter lists, for template declarations
   1131     /// and explicit specializations.
   1132     TemplateParameterLists *TemplateParams;
   1133 
   1134     /// \brief The location of the 'extern' keyword, if any, for an explicit
   1135     /// instantiation
   1136     SourceLocation ExternLoc;
   1137 
   1138     /// \brief The location of the 'template' keyword, for an explicit
   1139     /// instantiation.
   1140     SourceLocation TemplateLoc;
   1141 
   1142     /// \brief Whether the last template parameter list was empty.
   1143     bool LastParameterListWasEmpty;
   1144 
   1145     SourceRange getSourceRange() const LLVM_READONLY;
   1146   };
   1147 
   1148   void LexTemplateFunctionForLateParsing(CachedTokens &Toks);
   1149   void ParseLateTemplatedFuncDef(LateParsedTemplate &LPT);
   1150 
   1151   static void LateTemplateParserCallback(void *P, LateParsedTemplate &LPT);
   1152   static void LateTemplateParserCleanupCallback(void *P);
   1153 
   1154   Sema::ParsingClassState
   1155   PushParsingClass(Decl *TagOrTemplate, bool TopLevelClass, bool IsInterface);
   1156   void DeallocateParsedClasses(ParsingClass *Class);
   1157   void PopParsingClass(Sema::ParsingClassState);
   1158 
   1159   enum CachedInitKind {
   1160     CIK_DefaultArgument,
   1161     CIK_DefaultInitializer
   1162   };
   1163 
   1164   NamedDecl *ParseCXXInlineMethodDef(AccessSpecifier AS,
   1165                                 AttributeList *AccessAttrs,
   1166                                 ParsingDeclarator &D,
   1167                                 const ParsedTemplateInfo &TemplateInfo,
   1168                                 const VirtSpecifiers& VS,
   1169                                 ExprResult& Init);
   1170   void ParseCXXNonStaticMemberInitializer(Decl *VarD);
   1171   void ParseLexedAttributes(ParsingClass &Class);
   1172   void ParseLexedAttributeList(LateParsedAttrList &LAs, Decl *D,
   1173                                bool EnterScope, bool OnDefinition);
   1174   void ParseLexedAttribute(LateParsedAttribute &LA,
   1175                            bool EnterScope, bool OnDefinition);
   1176   void ParseLexedMethodDeclarations(ParsingClass &Class);
   1177   void ParseLexedMethodDeclaration(LateParsedMethodDeclaration &LM);
   1178   void ParseLexedMethodDefs(ParsingClass &Class);
   1179   void ParseLexedMethodDef(LexedMethod &LM);
   1180   void ParseLexedMemberInitializers(ParsingClass &Class);
   1181   void ParseLexedMemberInitializer(LateParsedMemberInitializer &MI);
   1182   void ParseLexedObjCMethodDefs(LexedMethod &LM, bool parseMethod);
   1183   bool ConsumeAndStoreFunctionPrologue(CachedTokens &Toks);
   1184   bool ConsumeAndStoreInitializer(CachedTokens &Toks, CachedInitKind CIK);
   1185   bool ConsumeAndStoreConditional(CachedTokens &Toks);
   1186   bool ConsumeAndStoreUntil(tok::TokenKind T1,
   1187                             CachedTokens &Toks,
   1188                             bool StopAtSemi = true,
   1189                             bool ConsumeFinalToken = true) {
   1190     return ConsumeAndStoreUntil(T1, T1, Toks, StopAtSemi, ConsumeFinalToken);
   1191   }
   1192   bool ConsumeAndStoreUntil(tok::TokenKind T1, tok::TokenKind T2,
   1193                             CachedTokens &Toks,
   1194                             bool StopAtSemi = true,
   1195                             bool ConsumeFinalToken = true);
   1196 
   1197   //===--------------------------------------------------------------------===//
   1198   // C99 6.9: External Definitions.
   1199   struct ParsedAttributesWithRange : ParsedAttributes {
   1200     ParsedAttributesWithRange(AttributeFactory &factory)
   1201       : ParsedAttributes(factory) {}
   1202 
   1203     SourceRange Range;
   1204   };
   1205 
   1206   DeclGroupPtrTy ParseExternalDeclaration(ParsedAttributesWithRange &attrs,
   1207                                           ParsingDeclSpec *DS = nullptr);
   1208   bool isDeclarationAfterDeclarator();
   1209   bool isStartOfFunctionDefinition(const ParsingDeclarator &Declarator);
   1210   DeclGroupPtrTy ParseDeclarationOrFunctionDefinition(
   1211                                                   ParsedAttributesWithRange &attrs,
   1212                                                   ParsingDeclSpec *DS = nullptr,
   1213                                                   AccessSpecifier AS = AS_none);
   1214   DeclGroupPtrTy ParseDeclOrFunctionDefInternal(ParsedAttributesWithRange &attrs,
   1215                                                 ParsingDeclSpec &DS,
   1216                                                 AccessSpecifier AS);
   1217 
   1218   Decl *ParseFunctionDefinition(ParsingDeclarator &D,
   1219                  const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(),
   1220                  LateParsedAttrList *LateParsedAttrs = nullptr);
   1221   void ParseKNRParamDeclarations(Declarator &D);
   1222   // EndLoc, if non-NULL, is filled with the location of the last token of
   1223   // the simple-asm.
   1224   ExprResult ParseSimpleAsm(SourceLocation *EndLoc = nullptr);
   1225   ExprResult ParseAsmStringLiteral();
   1226 
   1227   // Objective-C External Declarations
   1228   void MaybeSkipAttributes(tok::ObjCKeywordKind Kind);
   1229   DeclGroupPtrTy ParseObjCAtDirectives();
   1230   DeclGroupPtrTy ParseObjCAtClassDeclaration(SourceLocation atLoc);
   1231   Decl *ParseObjCAtInterfaceDeclaration(SourceLocation AtLoc,
   1232                                         ParsedAttributes &prefixAttrs);
   1233   void HelperActionsForIvarDeclarations(Decl *interfaceDecl, SourceLocation atLoc,
   1234                                         BalancedDelimiterTracker &T,
   1235                                         SmallVectorImpl<Decl *> &AllIvarDecls,
   1236                                         bool RBraceMissing);
   1237   void ParseObjCClassInstanceVariables(Decl *interfaceDecl,
   1238                                        tok::ObjCKeywordKind visibility,
   1239                                        SourceLocation atLoc);
   1240   bool ParseObjCProtocolReferences(SmallVectorImpl<Decl *> &P,
   1241                                    SmallVectorImpl<SourceLocation> &PLocs,
   1242                                    bool WarnOnDeclarations,
   1243                                    SourceLocation &LAngleLoc,
   1244                                    SourceLocation &EndProtoLoc);
   1245   bool ParseObjCProtocolQualifiers(DeclSpec &DS);
   1246   void ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey,
   1247                                   Decl *CDecl);
   1248   DeclGroupPtrTy ParseObjCAtProtocolDeclaration(SourceLocation atLoc,
   1249                                                 ParsedAttributes &prefixAttrs);
   1250 
   1251   struct ObjCImplParsingDataRAII {
   1252     Parser &P;
   1253     Decl *Dcl;
   1254     bool HasCFunction;
   1255     typedef SmallVector<LexedMethod*, 8> LateParsedObjCMethodContainer;
   1256     LateParsedObjCMethodContainer LateParsedObjCMethods;
   1257 
   1258     ObjCImplParsingDataRAII(Parser &parser, Decl *D)
   1259       : P(parser), Dcl(D), HasCFunction(false) {
   1260       P.CurParsedObjCImpl = this;
   1261       Finished = false;
   1262     }
   1263     ~ObjCImplParsingDataRAII();
   1264 
   1265     void finish(SourceRange AtEnd);
   1266     bool isFinished() const { return Finished; }
   1267 
   1268   private:
   1269     bool Finished;
   1270   };
   1271   ObjCImplParsingDataRAII *CurParsedObjCImpl;
   1272   void StashAwayMethodOrFunctionBodyTokens(Decl *MDecl);
   1273 
   1274   DeclGroupPtrTy ParseObjCAtImplementationDeclaration(SourceLocation AtLoc);
   1275   DeclGroupPtrTy ParseObjCAtEndDeclaration(SourceRange atEnd);
   1276   Decl *ParseObjCAtAliasDeclaration(SourceLocation atLoc);
   1277   Decl *ParseObjCPropertySynthesize(SourceLocation atLoc);
   1278   Decl *ParseObjCPropertyDynamic(SourceLocation atLoc);
   1279 
   1280   IdentifierInfo *ParseObjCSelectorPiece(SourceLocation &MethodLocation);
   1281   // Definitions for Objective-c context sensitive keywords recognition.
   1282   enum ObjCTypeQual {
   1283     objc_in=0, objc_out, objc_inout, objc_oneway, objc_bycopy, objc_byref,
   1284     objc_NumQuals
   1285   };
   1286   IdentifierInfo *ObjCTypeQuals[objc_NumQuals];
   1287 
   1288   bool isTokIdentifier_in() const;
   1289 
   1290   ParsedType ParseObjCTypeName(ObjCDeclSpec &DS, Declarator::TheContext Ctx,
   1291                                ParsedAttributes *ParamAttrs);
   1292   void ParseObjCMethodRequirement();
   1293   Decl *ParseObjCMethodPrototype(
   1294             tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword,
   1295             bool MethodDefinition = true);
   1296   Decl *ParseObjCMethodDecl(SourceLocation mLoc, tok::TokenKind mType,
   1297             tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword,
   1298             bool MethodDefinition=true);
   1299   void ParseObjCPropertyAttribute(ObjCDeclSpec &DS);
   1300 
   1301   Decl *ParseObjCMethodDefinition();
   1302 
   1303 public:
   1304   //===--------------------------------------------------------------------===//
   1305   // C99 6.5: Expressions.
   1306 
   1307   /// TypeCastState - State whether an expression is or may be a type cast.
   1308   enum TypeCastState {
   1309     NotTypeCast = 0,
   1310     MaybeTypeCast,
   1311     IsTypeCast
   1312   };
   1313 
   1314   ExprResult ParseExpression(TypeCastState isTypeCast = NotTypeCast);
   1315   ExprResult ParseConstantExpression(TypeCastState isTypeCast = NotTypeCast);
   1316   // Expr that doesn't include commas.
   1317   ExprResult ParseAssignmentExpression(TypeCastState isTypeCast = NotTypeCast);
   1318 
   1319   ExprResult ParseMSAsmIdentifier(llvm::SmallVectorImpl<Token> &LineToks,
   1320                                   unsigned &NumLineToksConsumed,
   1321                                   void *Info,
   1322                                   bool IsUnevaluated);
   1323 
   1324 private:
   1325   ExprResult ParseExpressionWithLeadingAt(SourceLocation AtLoc);
   1326 
   1327   ExprResult ParseExpressionWithLeadingExtension(SourceLocation ExtLoc);
   1328 
   1329   ExprResult ParseRHSOfBinaryExpression(ExprResult LHS,
   1330                                         prec::Level MinPrec);
   1331   ExprResult ParseCastExpression(bool isUnaryExpression,
   1332                                  bool isAddressOfOperand,
   1333                                  bool &NotCastExpr,
   1334                                  TypeCastState isTypeCast);
   1335   ExprResult ParseCastExpression(bool isUnaryExpression,
   1336                                  bool isAddressOfOperand = false,
   1337                                  TypeCastState isTypeCast = NotTypeCast);
   1338 
   1339   /// Returns true if the next token cannot start an expression.
   1340   bool isNotExpressionStart();
   1341 
   1342   /// Returns true if the next token would start a postfix-expression
   1343   /// suffix.
   1344   bool isPostfixExpressionSuffixStart() {
   1345     tok::TokenKind K = Tok.getKind();
   1346     return (K == tok::l_square || K == tok::l_paren ||
   1347             K == tok::period || K == tok::arrow ||
   1348             K == tok::plusplus || K == tok::minusminus);
   1349   }
   1350 
   1351   ExprResult ParsePostfixExpressionSuffix(ExprResult LHS);
   1352   ExprResult ParseUnaryExprOrTypeTraitExpression();
   1353   ExprResult ParseBuiltinPrimaryExpression();
   1354 
   1355   ExprResult ParseExprAfterUnaryExprOrTypeTrait(const Token &OpTok,
   1356                                                      bool &isCastExpr,
   1357                                                      ParsedType &CastTy,
   1358                                                      SourceRange &CastRange);
   1359 
   1360   typedef SmallVector<Expr*, 20> ExprListTy;
   1361   typedef SmallVector<SourceLocation, 20> CommaLocsTy;
   1362 
   1363   /// ParseExpressionList - Used for C/C++ (argument-)expression-list.
   1364   bool ParseExpressionList(SmallVectorImpl<Expr *> &Exprs,
   1365                            SmallVectorImpl<SourceLocation> &CommaLocs,
   1366                            std::function<void()> Completer = nullptr);
   1367 
   1368   /// ParseSimpleExpressionList - A simple comma-separated list of expressions,
   1369   /// used for misc language extensions.
   1370   bool ParseSimpleExpressionList(SmallVectorImpl<Expr*> &Exprs,
   1371                                  SmallVectorImpl<SourceLocation> &CommaLocs);
   1372 
   1373 
   1374   /// ParenParseOption - Control what ParseParenExpression will parse.
   1375   enum ParenParseOption {
   1376     SimpleExpr,      // Only parse '(' expression ')'
   1377     CompoundStmt,    // Also allow '(' compound-statement ')'
   1378     CompoundLiteral, // Also allow '(' type-name ')' '{' ... '}'
   1379     CastExpr         // Also allow '(' type-name ')' <anything>
   1380   };
   1381   ExprResult ParseParenExpression(ParenParseOption &ExprType,
   1382                                         bool stopIfCastExpr,
   1383                                         bool isTypeCast,
   1384                                         ParsedType &CastTy,
   1385                                         SourceLocation &RParenLoc);
   1386 
   1387   ExprResult ParseCXXAmbiguousParenExpression(
   1388       ParenParseOption &ExprType, ParsedType &CastTy,
   1389       BalancedDelimiterTracker &Tracker, ColonProtectionRAIIObject &ColonProt);
   1390   ExprResult ParseCompoundLiteralExpression(ParsedType Ty,
   1391                                                   SourceLocation LParenLoc,
   1392                                                   SourceLocation RParenLoc);
   1393 
   1394   ExprResult ParseStringLiteralExpression(bool AllowUserDefinedLiteral = false);
   1395 
   1396   ExprResult ParseGenericSelectionExpression();
   1397 
   1398   ExprResult ParseObjCBoolLiteral();
   1399 
   1400   ExprResult ParseFoldExpression(ExprResult LHS, BalancedDelimiterTracker &T);
   1401 
   1402   //===--------------------------------------------------------------------===//
   1403   // C++ Expressions
   1404   ExprResult tryParseCXXIdExpression(CXXScopeSpec &SS, bool isAddressOfOperand,
   1405                                      Token &Replacement);
   1406   ExprResult ParseCXXIdExpression(bool isAddressOfOperand = false);
   1407 
   1408   bool areTokensAdjacent(const Token &A, const Token &B);
   1409 
   1410   void CheckForTemplateAndDigraph(Token &Next, ParsedType ObjectTypePtr,
   1411                                   bool EnteringContext, IdentifierInfo &II,
   1412                                   CXXScopeSpec &SS);
   1413 
   1414   bool ParseOptionalCXXScopeSpecifier(CXXScopeSpec &SS,
   1415                                       ParsedType ObjectType,
   1416                                       bool EnteringContext,
   1417                                       bool *MayBePseudoDestructor = nullptr,
   1418                                       bool IsTypename = false,
   1419                                       IdentifierInfo **LastII = nullptr);
   1420 
   1421   void CheckForLParenAfterColonColon();
   1422 
   1423   //===--------------------------------------------------------------------===//
   1424   // C++0x 5.1.2: Lambda expressions
   1425 
   1426   // [...] () -> type {...}
   1427   ExprResult ParseLambdaExpression();
   1428   ExprResult TryParseLambdaExpression();
   1429   Optional<unsigned> ParseLambdaIntroducer(LambdaIntroducer &Intro,
   1430                                            bool *SkippedInits = nullptr);
   1431   bool TryParseLambdaIntroducer(LambdaIntroducer &Intro);
   1432   ExprResult ParseLambdaExpressionAfterIntroducer(
   1433                LambdaIntroducer &Intro);
   1434 
   1435   //===--------------------------------------------------------------------===//
   1436   // C++ 5.2p1: C++ Casts
   1437   ExprResult ParseCXXCasts();
   1438 
   1439   //===--------------------------------------------------------------------===//
   1440   // C++ 5.2p1: C++ Type Identification
   1441   ExprResult ParseCXXTypeid();
   1442 
   1443   //===--------------------------------------------------------------------===//
   1444   //  C++ : Microsoft __uuidof Expression
   1445   ExprResult ParseCXXUuidof();
   1446 
   1447   //===--------------------------------------------------------------------===//
   1448   // C++ 5.2.4: C++ Pseudo-Destructor Expressions
   1449   ExprResult ParseCXXPseudoDestructor(Expr *Base, SourceLocation OpLoc,
   1450                                             tok::TokenKind OpKind,
   1451                                             CXXScopeSpec &SS,
   1452                                             ParsedType ObjectType);
   1453 
   1454   //===--------------------------------------------------------------------===//
   1455   // C++ 9.3.2: C++ 'this' pointer
   1456   ExprResult ParseCXXThis();
   1457 
   1458   //===--------------------------------------------------------------------===//
   1459   // C++ 15: C++ Throw Expression
   1460   ExprResult ParseThrowExpression();
   1461 
   1462   ExceptionSpecificationType tryParseExceptionSpecification(
   1463                     bool Delayed,
   1464                     SourceRange &SpecificationRange,
   1465                     SmallVectorImpl<ParsedType> &DynamicExceptions,
   1466                     SmallVectorImpl<SourceRange> &DynamicExceptionRanges,
   1467                     ExprResult &NoexceptExpr,
   1468                     CachedTokens *&ExceptionSpecTokens);
   1469 
   1470   // EndLoc is filled with the location of the last token of the specification.
   1471   ExceptionSpecificationType ParseDynamicExceptionSpecification(
   1472                                   SourceRange &SpecificationRange,
   1473                                   SmallVectorImpl<ParsedType> &Exceptions,
   1474                                   SmallVectorImpl<SourceRange> &Ranges);
   1475 
   1476   //===--------------------------------------------------------------------===//
   1477   // C++0x 8: Function declaration trailing-return-type
   1478   TypeResult ParseTrailingReturnType(SourceRange &Range);
   1479 
   1480   //===--------------------------------------------------------------------===//
   1481   // C++ 2.13.5: C++ Boolean Literals
   1482   ExprResult ParseCXXBoolLiteral();
   1483 
   1484   //===--------------------------------------------------------------------===//
   1485   // C++ 5.2.3: Explicit type conversion (functional notation)
   1486   ExprResult ParseCXXTypeConstructExpression(const DeclSpec &DS);
   1487 
   1488   /// ParseCXXSimpleTypeSpecifier - [C++ 7.1.5.2] Simple type specifiers.
   1489   /// This should only be called when the current token is known to be part of
   1490   /// simple-type-specifier.
   1491   void ParseCXXSimpleTypeSpecifier(DeclSpec &DS);
   1492 
   1493   bool ParseCXXTypeSpecifierSeq(DeclSpec &DS);
   1494 
   1495   //===--------------------------------------------------------------------===//
   1496   // C++ 5.3.4 and 5.3.5: C++ new and delete
   1497   bool ParseExpressionListOrTypeId(SmallVectorImpl<Expr*> &Exprs,
   1498                                    Declarator &D);
   1499   void ParseDirectNewDeclarator(Declarator &D);
   1500   ExprResult ParseCXXNewExpression(bool UseGlobal, SourceLocation Start);
   1501   ExprResult ParseCXXDeleteExpression(bool UseGlobal,
   1502                                             SourceLocation Start);
   1503 
   1504   //===--------------------------------------------------------------------===//
   1505   // C++ if/switch/while condition expression.
   1506   bool ParseCXXCondition(ExprResult &ExprResult, Decl *&DeclResult,
   1507                          SourceLocation Loc, bool ConvertToBoolean);
   1508 
   1509   //===--------------------------------------------------------------------===//
   1510   // C++ types
   1511 
   1512   //===--------------------------------------------------------------------===//
   1513   // C99 6.7.8: Initialization.
   1514 
   1515   /// ParseInitializer
   1516   ///       initializer: [C99 6.7.8]
   1517   ///         assignment-expression
   1518   ///         '{' ...
   1519   ExprResult ParseInitializer() {
   1520     if (Tok.isNot(tok::l_brace))
   1521       return ParseAssignmentExpression();
   1522     return ParseBraceInitializer();
   1523   }
   1524   bool MayBeDesignationStart();
   1525   ExprResult ParseBraceInitializer();
   1526   ExprResult ParseInitializerWithPotentialDesignator();
   1527 
   1528   //===--------------------------------------------------------------------===//
   1529   // clang Expressions
   1530 
   1531   ExprResult ParseBlockLiteralExpression();  // ^{...}
   1532 
   1533   //===--------------------------------------------------------------------===//
   1534   // Objective-C Expressions
   1535   ExprResult ParseObjCAtExpression(SourceLocation AtLocation);
   1536   ExprResult ParseObjCStringLiteral(SourceLocation AtLoc);
   1537   ExprResult ParseObjCCharacterLiteral(SourceLocation AtLoc);
   1538   ExprResult ParseObjCNumericLiteral(SourceLocation AtLoc);
   1539   ExprResult ParseObjCBooleanLiteral(SourceLocation AtLoc, bool ArgValue);
   1540   ExprResult ParseObjCArrayLiteral(SourceLocation AtLoc);
   1541   ExprResult ParseObjCDictionaryLiteral(SourceLocation AtLoc);
   1542   ExprResult ParseObjCBoxedExpr(SourceLocation AtLoc);
   1543   ExprResult ParseObjCEncodeExpression(SourceLocation AtLoc);
   1544   ExprResult ParseObjCSelectorExpression(SourceLocation AtLoc);
   1545   ExprResult ParseObjCProtocolExpression(SourceLocation AtLoc);
   1546   bool isSimpleObjCMessageExpression();
   1547   ExprResult ParseObjCMessageExpression();
   1548   ExprResult ParseObjCMessageExpressionBody(SourceLocation LBracloc,
   1549                                             SourceLocation SuperLoc,
   1550                                             ParsedType ReceiverType,
   1551                                             Expr *ReceiverExpr);
   1552   ExprResult ParseAssignmentExprWithObjCMessageExprStart(
   1553       SourceLocation LBracloc, SourceLocation SuperLoc,
   1554       ParsedType ReceiverType, Expr *ReceiverExpr);
   1555   bool ParseObjCXXMessageReceiver(bool &IsExpr, void *&TypeOrExpr);
   1556 
   1557   //===--------------------------------------------------------------------===//
   1558   // C99 6.8: Statements and Blocks.
   1559 
   1560   /// A SmallVector of statements, with stack size 32 (as that is the only one
   1561   /// used.)
   1562   typedef SmallVector<Stmt*, 32> StmtVector;
   1563   /// A SmallVector of expressions, with stack size 12 (the maximum used.)
   1564   typedef SmallVector<Expr*, 12> ExprVector;
   1565   /// A SmallVector of types.
   1566   typedef SmallVector<ParsedType, 12> TypeVector;
   1567 
   1568   StmtResult ParseStatement(SourceLocation *TrailingElseLoc = nullptr);
   1569   StmtResult
   1570   ParseStatementOrDeclaration(StmtVector &Stmts, bool OnlyStatement,
   1571                               SourceLocation *TrailingElseLoc = nullptr);
   1572   StmtResult ParseStatementOrDeclarationAfterAttributes(
   1573                                          StmtVector &Stmts,
   1574                                          bool OnlyStatement,
   1575                                          SourceLocation *TrailingElseLoc,
   1576                                          ParsedAttributesWithRange &Attrs);
   1577   StmtResult ParseExprStatement();
   1578   StmtResult ParseLabeledStatement(ParsedAttributesWithRange &attrs);
   1579   StmtResult ParseCaseStatement(bool MissingCase = false,
   1580                                 ExprResult Expr = ExprResult());
   1581   StmtResult ParseDefaultStatement();
   1582   StmtResult ParseCompoundStatement(bool isStmtExpr = false);
   1583   StmtResult ParseCompoundStatement(bool isStmtExpr,
   1584                                     unsigned ScopeFlags);
   1585   void ParseCompoundStatementLeadingPragmas();
   1586   StmtResult ParseCompoundStatementBody(bool isStmtExpr = false);
   1587   bool ParseParenExprOrCondition(ExprResult &ExprResult,
   1588                                  Decl *&DeclResult,
   1589                                  SourceLocation Loc,
   1590                                  bool ConvertToBoolean);
   1591   StmtResult ParseIfStatement(SourceLocation *TrailingElseLoc);
   1592   StmtResult ParseSwitchStatement(SourceLocation *TrailingElseLoc);
   1593   StmtResult ParseWhileStatement(SourceLocation *TrailingElseLoc);
   1594   StmtResult ParseDoStatement();
   1595   StmtResult ParseForStatement(SourceLocation *TrailingElseLoc);
   1596   StmtResult ParseGotoStatement();
   1597   StmtResult ParseContinueStatement();
   1598   StmtResult ParseBreakStatement();
   1599   StmtResult ParseReturnStatement();
   1600   StmtResult ParseAsmStatement(bool &msAsm);
   1601   StmtResult ParseMicrosoftAsmStatement(SourceLocation AsmLoc);
   1602   StmtResult ParsePragmaLoopHint(StmtVector &Stmts, bool OnlyStatement,
   1603                                  SourceLocation *TrailingElseLoc,
   1604                                  ParsedAttributesWithRange &Attrs);
   1605 
   1606   /// \brief Describes the behavior that should be taken for an __if_exists
   1607   /// block.
   1608   enum IfExistsBehavior {
   1609     /// \brief Parse the block; this code is always used.
   1610     IEB_Parse,
   1611     /// \brief Skip the block entirely; this code is never used.
   1612     IEB_Skip,
   1613     /// \brief Parse the block as a dependent block, which may be used in
   1614     /// some template instantiations but not others.
   1615     IEB_Dependent
   1616   };
   1617 
   1618   /// \brief Describes the condition of a Microsoft __if_exists or
   1619   /// __if_not_exists block.
   1620   struct IfExistsCondition {
   1621     /// \brief The location of the initial keyword.
   1622     SourceLocation KeywordLoc;
   1623     /// \brief Whether this is an __if_exists block (rather than an
   1624     /// __if_not_exists block).
   1625     bool IsIfExists;
   1626 
   1627     /// \brief Nested-name-specifier preceding the name.
   1628     CXXScopeSpec SS;
   1629 
   1630     /// \brief The name we're looking for.
   1631     UnqualifiedId Name;
   1632 
   1633     /// \brief The behavior of this __if_exists or __if_not_exists block
   1634     /// should.
   1635     IfExistsBehavior Behavior;
   1636   };
   1637 
   1638   bool ParseMicrosoftIfExistsCondition(IfExistsCondition& Result);
   1639   void ParseMicrosoftIfExistsStatement(StmtVector &Stmts);
   1640   void ParseMicrosoftIfExistsExternalDeclaration();
   1641   void ParseMicrosoftIfExistsClassDeclaration(DeclSpec::TST TagType,
   1642                                               AccessSpecifier& CurAS);
   1643   bool ParseMicrosoftIfExistsBraceInitializer(ExprVector &InitExprs,
   1644                                               bool &InitExprsOk);
   1645   bool ParseAsmOperandsOpt(SmallVectorImpl<IdentifierInfo *> &Names,
   1646                            SmallVectorImpl<Expr *> &Constraints,
   1647                            SmallVectorImpl<Expr *> &Exprs);
   1648 
   1649   //===--------------------------------------------------------------------===//
   1650   // C++ 6: Statements and Blocks
   1651 
   1652   StmtResult ParseCXXTryBlock();
   1653   StmtResult ParseCXXTryBlockCommon(SourceLocation TryLoc, bool FnTry = false);
   1654   StmtResult ParseCXXCatchBlock(bool FnCatch = false);
   1655 
   1656   //===--------------------------------------------------------------------===//
   1657   // MS: SEH Statements and Blocks
   1658 
   1659   StmtResult ParseSEHTryBlock();
   1660   StmtResult ParseSEHExceptBlock(SourceLocation Loc);
   1661   StmtResult ParseSEHFinallyBlock(SourceLocation Loc);
   1662   StmtResult ParseSEHLeaveStatement();
   1663 
   1664   //===--------------------------------------------------------------------===//
   1665   // Objective-C Statements
   1666 
   1667   StmtResult ParseObjCAtStatement(SourceLocation atLoc);
   1668   StmtResult ParseObjCTryStmt(SourceLocation atLoc);
   1669   StmtResult ParseObjCThrowStmt(SourceLocation atLoc);
   1670   StmtResult ParseObjCSynchronizedStmt(SourceLocation atLoc);
   1671   StmtResult ParseObjCAutoreleasePoolStmt(SourceLocation atLoc);
   1672 
   1673 
   1674   //===--------------------------------------------------------------------===//
   1675   // C99 6.7: Declarations.
   1676 
   1677   /// A context for parsing declaration specifiers.  TODO: flesh this
   1678   /// out, there are other significant restrictions on specifiers than
   1679   /// would be best implemented in the parser.
   1680   enum DeclSpecContext {
   1681     DSC_normal, // normal context
   1682     DSC_class,  // class context, enables 'friend'
   1683     DSC_type_specifier, // C++ type-specifier-seq or C specifier-qualifier-list
   1684     DSC_trailing, // C++11 trailing-type-specifier in a trailing return type
   1685     DSC_alias_declaration, // C++11 type-specifier-seq in an alias-declaration
   1686     DSC_top_level, // top-level/namespace declaration context
   1687     DSC_template_type_arg // template type argument context
   1688   };
   1689 
   1690   /// Is this a context in which we are parsing just a type-specifier (or
   1691   /// trailing-type-specifier)?
   1692   static bool isTypeSpecifier(DeclSpecContext DSC) {
   1693     switch (DSC) {
   1694     case DSC_normal:
   1695     case DSC_class:
   1696     case DSC_top_level:
   1697       return false;
   1698 
   1699     case DSC_template_type_arg:
   1700     case DSC_type_specifier:
   1701     case DSC_trailing:
   1702     case DSC_alias_declaration:
   1703       return true;
   1704     }
   1705     llvm_unreachable("Missing DeclSpecContext case");
   1706   }
   1707 
   1708   /// Information on a C++0x for-range-initializer found while parsing a
   1709   /// declaration which turns out to be a for-range-declaration.
   1710   struct ForRangeInit {
   1711     SourceLocation ColonLoc;
   1712     ExprResult RangeExpr;
   1713 
   1714     bool ParsedForRangeDecl() { return !ColonLoc.isInvalid(); }
   1715   };
   1716 
   1717   DeclGroupPtrTy ParseDeclaration(unsigned Context, SourceLocation &DeclEnd,
   1718                                   ParsedAttributesWithRange &attrs);
   1719   DeclGroupPtrTy ParseSimpleDeclaration(unsigned Context,
   1720                                         SourceLocation &DeclEnd,
   1721                                         ParsedAttributesWithRange &attrs,
   1722                                         bool RequireSemi,
   1723                                         ForRangeInit *FRI = nullptr);
   1724   bool MightBeDeclarator(unsigned Context);
   1725   DeclGroupPtrTy ParseDeclGroup(ParsingDeclSpec &DS, unsigned Context,
   1726                                 SourceLocation *DeclEnd = nullptr,
   1727                                 ForRangeInit *FRI = nullptr);
   1728   Decl *ParseDeclarationAfterDeclarator(Declarator &D,
   1729                const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo());
   1730   bool ParseAsmAttributesAfterDeclarator(Declarator &D);
   1731   Decl *ParseDeclarationAfterDeclaratorAndAttributes(
   1732       Declarator &D,
   1733       const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(),
   1734       ForRangeInit *FRI = nullptr);
   1735   Decl *ParseFunctionStatementBody(Decl *Decl, ParseScope &BodyScope);
   1736   Decl *ParseFunctionTryBlock(Decl *Decl, ParseScope &BodyScope);
   1737 
   1738   /// \brief When in code-completion, skip parsing of the function/method body
   1739   /// unless the body contains the code-completion point.
   1740   ///
   1741   /// \returns true if the function body was skipped.
   1742   bool trySkippingFunctionBody();
   1743 
   1744   bool ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS,
   1745                         const ParsedTemplateInfo &TemplateInfo,
   1746                         AccessSpecifier AS, DeclSpecContext DSC,
   1747                         ParsedAttributesWithRange &Attrs);
   1748   DeclSpecContext getDeclSpecContextFromDeclaratorContext(unsigned Context);
   1749   void ParseDeclarationSpecifiers(DeclSpec &DS,
   1750                 const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(),
   1751                                   AccessSpecifier AS = AS_none,
   1752                                   DeclSpecContext DSC = DSC_normal,
   1753                                   LateParsedAttrList *LateAttrs = nullptr);
   1754   bool DiagnoseMissingSemiAfterTagDefinition(DeclSpec &DS, AccessSpecifier AS,
   1755                                        DeclSpecContext DSContext,
   1756                                        LateParsedAttrList *LateAttrs = nullptr);
   1757 
   1758   void ParseSpecifierQualifierList(DeclSpec &DS, AccessSpecifier AS = AS_none,
   1759                                    DeclSpecContext DSC = DSC_normal);
   1760 
   1761   void ParseObjCTypeQualifierList(ObjCDeclSpec &DS,
   1762                                   Declarator::TheContext Context);
   1763 
   1764   void ParseEnumSpecifier(SourceLocation TagLoc, DeclSpec &DS,
   1765                           const ParsedTemplateInfo &TemplateInfo,
   1766                           AccessSpecifier AS, DeclSpecContext DSC);
   1767   void ParseEnumBody(SourceLocation StartLoc, Decl *TagDecl);
   1768   void ParseStructUnionBody(SourceLocation StartLoc, unsigned TagType,
   1769                             Decl *TagDecl);
   1770 
   1771   void ParseStructDeclaration(
   1772       ParsingDeclSpec &DS,
   1773       llvm::function_ref<void(ParsingFieldDeclarator &)> FieldsCallback);
   1774 
   1775   bool isDeclarationSpecifier(bool DisambiguatingWithExpression = false);
   1776   bool isTypeSpecifierQualifier();
   1777   bool isTypeQualifier() const;
   1778 
   1779   /// isKnownToBeTypeSpecifier - Return true if we know that the specified token
   1780   /// is definitely a type-specifier.  Return false if it isn't part of a type
   1781   /// specifier or if we're not sure.
   1782   bool isKnownToBeTypeSpecifier(const Token &Tok) const;
   1783 
   1784   /// \brief Return true if we know that we are definitely looking at a
   1785   /// decl-specifier, and isn't part of an expression such as a function-style
   1786   /// cast. Return false if it's no a decl-specifier, or we're not sure.
   1787   bool isKnownToBeDeclarationSpecifier() {
   1788     if (getLangOpts().CPlusPlus)
   1789       return isCXXDeclarationSpecifier() == TPResult::True;
   1790     return isDeclarationSpecifier(true);
   1791   }
   1792 
   1793   /// isDeclarationStatement - Disambiguates between a declaration or an
   1794   /// expression statement, when parsing function bodies.
   1795   /// Returns true for declaration, false for expression.
   1796   bool isDeclarationStatement() {
   1797     if (getLangOpts().CPlusPlus)
   1798       return isCXXDeclarationStatement();
   1799     return isDeclarationSpecifier(true);
   1800   }
   1801 
   1802   /// isForInitDeclaration - Disambiguates between a declaration or an
   1803   /// expression in the context of the C 'clause-1' or the C++
   1804   // 'for-init-statement' part of a 'for' statement.
   1805   /// Returns true for declaration, false for expression.
   1806   bool isForInitDeclaration() {
   1807     if (getLangOpts().CPlusPlus)
   1808       return isCXXSimpleDeclaration(/*AllowForRangeDecl=*/true);
   1809     return isDeclarationSpecifier(true);
   1810   }
   1811 
   1812   /// \brief Determine whether this is a C++1z for-range-identifier.
   1813   bool isForRangeIdentifier();
   1814 
   1815   /// \brief Determine whether we are currently at the start of an Objective-C
   1816   /// class message that appears to be missing the open bracket '['.
   1817   bool isStartOfObjCClassMessageMissingOpenBracket();
   1818 
   1819   /// \brief Starting with a scope specifier, identifier, or
   1820   /// template-id that refers to the current class, determine whether
   1821   /// this is a constructor declarator.
   1822   bool isConstructorDeclarator(bool Unqualified);
   1823 
   1824   /// \brief Specifies the context in which type-id/expression
   1825   /// disambiguation will occur.
   1826   enum TentativeCXXTypeIdContext {
   1827     TypeIdInParens,
   1828     TypeIdUnambiguous,
   1829     TypeIdAsTemplateArgument
   1830   };
   1831 
   1832 
   1833   /// isTypeIdInParens - Assumes that a '(' was parsed and now we want to know
   1834   /// whether the parens contain an expression or a type-id.
   1835   /// Returns true for a type-id and false for an expression.
   1836   bool isTypeIdInParens(bool &isAmbiguous) {
   1837     if (getLangOpts().CPlusPlus)
   1838       return isCXXTypeId(TypeIdInParens, isAmbiguous);
   1839     isAmbiguous = false;
   1840     return isTypeSpecifierQualifier();
   1841   }
   1842   bool isTypeIdInParens() {
   1843     bool isAmbiguous;
   1844     return isTypeIdInParens(isAmbiguous);
   1845   }
   1846 
   1847   /// \brief Checks if the current tokens form type-id or expression.
   1848   /// It is similar to isTypeIdInParens but does not suppose that type-id
   1849   /// is in parenthesis.
   1850   bool isTypeIdUnambiguously() {
   1851     bool IsAmbiguous;
   1852     if (getLangOpts().CPlusPlus)
   1853       return isCXXTypeId(TypeIdUnambiguous, IsAmbiguous);
   1854     return isTypeSpecifierQualifier();
   1855   }
   1856 
   1857   /// isCXXDeclarationStatement - C++-specialized function that disambiguates
   1858   /// between a declaration or an expression statement, when parsing function
   1859   /// bodies. Returns true for declaration, false for expression.
   1860   bool isCXXDeclarationStatement();
   1861 
   1862   /// isCXXSimpleDeclaration - C++-specialized function that disambiguates
   1863   /// between a simple-declaration or an expression-statement.
   1864   /// If during the disambiguation process a parsing error is encountered,
   1865   /// the function returns true to let the declaration parsing code handle it.
   1866   /// Returns false if the statement is disambiguated as expression.
   1867   bool isCXXSimpleDeclaration(bool AllowForRangeDecl);
   1868 
   1869   /// isCXXFunctionDeclarator - Disambiguates between a function declarator or
   1870   /// a constructor-style initializer, when parsing declaration statements.
   1871   /// Returns true for function declarator and false for constructor-style
   1872   /// initializer. Sets 'IsAmbiguous' to true to indicate that this declaration
   1873   /// might be a constructor-style initializer.
   1874   /// If during the disambiguation process a parsing error is encountered,
   1875   /// the function returns true to let the declaration parsing code handle it.
   1876   bool isCXXFunctionDeclarator(bool *IsAmbiguous = nullptr);
   1877 
   1878   /// isCXXConditionDeclaration - Disambiguates between a declaration or an
   1879   /// expression for a condition of a if/switch/while/for statement.
   1880   /// If during the disambiguation process a parsing error is encountered,
   1881   /// the function returns true to let the declaration parsing code handle it.
   1882   bool isCXXConditionDeclaration();
   1883 
   1884   bool isCXXTypeId(TentativeCXXTypeIdContext Context, bool &isAmbiguous);
   1885   bool isCXXTypeId(TentativeCXXTypeIdContext Context) {
   1886     bool isAmbiguous;
   1887     return isCXXTypeId(Context, isAmbiguous);
   1888   }
   1889 
   1890   /// TPResult - Used as the result value for functions whose purpose is to
   1891   /// disambiguate C++ constructs by "tentatively parsing" them.
   1892   enum class TPResult {
   1893     True, False, Ambiguous, Error
   1894   };
   1895 
   1896   /// \brief Based only on the given token kind, determine whether we know that
   1897   /// we're at the start of an expression or a type-specifier-seq (which may
   1898   /// be an expression, in C++).
   1899   ///
   1900   /// This routine does not attempt to resolve any of the trick cases, e.g.,
   1901   /// those involving lookup of identifiers.
   1902   ///
   1903   /// \returns \c TPR_true if this token starts an expression, \c TPR_false if
   1904   /// this token starts a type-specifier-seq, or \c TPR_ambiguous if it cannot
   1905   /// tell.
   1906   TPResult isExpressionOrTypeSpecifierSimple(tok::TokenKind Kind);
   1907 
   1908   /// isCXXDeclarationSpecifier - Returns TPResult::True if it is a
   1909   /// declaration specifier, TPResult::False if it is not,
   1910   /// TPResult::Ambiguous if it could be either a decl-specifier or a
   1911   /// function-style cast, and TPResult::Error if a parsing error was
   1912   /// encountered. If it could be a braced C++11 function-style cast, returns
   1913   /// BracedCastResult.
   1914   /// Doesn't consume tokens.
   1915   TPResult
   1916   isCXXDeclarationSpecifier(TPResult BracedCastResult = TPResult::False,
   1917                             bool *HasMissingTypename = nullptr);
   1918 
   1919   /// Given that isCXXDeclarationSpecifier returns \c TPResult::True or
   1920   /// \c TPResult::Ambiguous, determine whether the decl-specifier would be
   1921   /// a type-specifier other than a cv-qualifier.
   1922   bool isCXXDeclarationSpecifierAType();
   1923 
   1924   /// \brief Determine whether an identifier has been tentatively declared as a
   1925   /// non-type. Such tentative declarations should not be found to name a type
   1926   /// during a tentative parse, but also should not be annotated as a non-type.
   1927   bool isTentativelyDeclared(IdentifierInfo *II);
   1928 
   1929   // "Tentative parsing" functions, used for disambiguation. If a parsing error
   1930   // is encountered they will return TPResult::Error.
   1931   // Returning TPResult::True/False indicates that the ambiguity was
   1932   // resolved and tentative parsing may stop. TPResult::Ambiguous indicates
   1933   // that more tentative parsing is necessary for disambiguation.
   1934   // They all consume tokens, so backtracking should be used after calling them.
   1935 
   1936   TPResult TryParseSimpleDeclaration(bool AllowForRangeDecl);
   1937   TPResult TryParseTypeofSpecifier();
   1938   TPResult TryParseProtocolQualifiers();
   1939   TPResult TryParsePtrOperatorSeq();
   1940   TPResult TryParseOperatorId();
   1941   TPResult TryParseInitDeclaratorList();
   1942   TPResult TryParseDeclarator(bool mayBeAbstract, bool mayHaveIdentifier=true);
   1943   TPResult
   1944   TryParseParameterDeclarationClause(bool *InvalidAsDeclaration = nullptr,
   1945                                      bool VersusTemplateArg = false);
   1946   TPResult TryParseFunctionDeclarator();
   1947   TPResult TryParseBracketDeclarator();
   1948   TPResult TryConsumeDeclarationSpecifier();
   1949 
   1950 public:
   1951   TypeResult ParseTypeName(SourceRange *Range = nullptr,
   1952                            Declarator::TheContext Context
   1953                              = Declarator::TypeNameContext,
   1954                            AccessSpecifier AS = AS_none,
   1955                            Decl **OwnedType = nullptr,
   1956                            ParsedAttributes *Attrs = nullptr);
   1957 
   1958 private:
   1959   void ParseBlockId(SourceLocation CaretLoc);
   1960 
   1961   // Check for the start of a C++11 attribute-specifier-seq in a context where
   1962   // an attribute is not allowed.
   1963   bool CheckProhibitedCXX11Attribute() {
   1964     assert(Tok.is(tok::l_square));
   1965     if (!getLangOpts().CPlusPlus11 || NextToken().isNot(tok::l_square))
   1966       return false;
   1967     return DiagnoseProhibitedCXX11Attribute();
   1968   }
   1969   bool DiagnoseProhibitedCXX11Attribute();
   1970   void CheckMisplacedCXX11Attribute(ParsedAttributesWithRange &Attrs,
   1971                                     SourceLocation CorrectLocation) {
   1972     if (!getLangOpts().CPlusPlus11)
   1973       return;
   1974     if ((Tok.isNot(tok::l_square) || NextToken().isNot(tok::l_square)) &&
   1975         Tok.isNot(tok::kw_alignas))
   1976       return;
   1977     DiagnoseMisplacedCXX11Attribute(Attrs, CorrectLocation);
   1978   }
   1979   void DiagnoseMisplacedCXX11Attribute(ParsedAttributesWithRange &Attrs,
   1980                                        SourceLocation CorrectLocation);
   1981 
   1982   void ProhibitAttributes(ParsedAttributesWithRange &attrs) {
   1983     if (!attrs.Range.isValid()) return;
   1984     DiagnoseProhibitedAttributes(attrs);
   1985     attrs.clear();
   1986   }
   1987   void DiagnoseProhibitedAttributes(ParsedAttributesWithRange &attrs);
   1988 
   1989   // Forbid C++11 attributes that appear on certain syntactic
   1990   // locations which standard permits but we don't supported yet,
   1991   // for example, attributes appertain to decl specifiers.
   1992   void ProhibitCXX11Attributes(ParsedAttributesWithRange &attrs);
   1993 
   1994   /// \brief Skip C++11 attributes and return the end location of the last one.
   1995   /// \returns SourceLocation() if there are no attributes.
   1996   SourceLocation SkipCXX11Attributes();
   1997 
   1998   /// \brief Diagnose and skip C++11 attributes that appear in syntactic
   1999   /// locations where attributes are not allowed.
   2000   void DiagnoseAndSkipCXX11Attributes();
   2001 
   2002   /// \brief Parses syntax-generic attribute arguments for attributes which are
   2003   /// known to the implementation, and adds them to the given ParsedAttributes
   2004   /// list with the given attribute syntax. Returns the number of arguments
   2005   /// parsed for the attribute.
   2006   unsigned
   2007   ParseAttributeArgsCommon(IdentifierInfo *AttrName, SourceLocation AttrNameLoc,
   2008                            ParsedAttributes &Attrs, SourceLocation *EndLoc,
   2009                            IdentifierInfo *ScopeName, SourceLocation ScopeLoc,
   2010                            AttributeList::Syntax Syntax);
   2011 
   2012   void MaybeParseGNUAttributes(Declarator &D,
   2013                                LateParsedAttrList *LateAttrs = nullptr) {
   2014     if (Tok.is(tok::kw___attribute)) {
   2015       ParsedAttributes attrs(AttrFactory);
   2016       SourceLocation endLoc;
   2017       ParseGNUAttributes(attrs, &endLoc, LateAttrs, &D);
   2018       D.takeAttributes(attrs, endLoc);
   2019     }
   2020   }
   2021   void MaybeParseGNUAttributes(ParsedAttributes &attrs,
   2022                                SourceLocation *endLoc = nullptr,
   2023                                LateParsedAttrList *LateAttrs = nullptr) {
   2024     if (Tok.is(tok::kw___attribute))
   2025       ParseGNUAttributes(attrs, endLoc, LateAttrs);
   2026   }
   2027   void ParseGNUAttributes(ParsedAttributes &attrs,
   2028                           SourceLocation *endLoc = nullptr,
   2029                           LateParsedAttrList *LateAttrs = nullptr,
   2030                           Declarator *D = nullptr);
   2031   void ParseGNUAttributeArgs(IdentifierInfo *AttrName,
   2032                              SourceLocation AttrNameLoc,
   2033                              ParsedAttributes &Attrs,
   2034                              SourceLocation *EndLoc,
   2035                              IdentifierInfo *ScopeName,
   2036                              SourceLocation ScopeLoc,
   2037                              AttributeList::Syntax Syntax,
   2038                              Declarator *D);
   2039   IdentifierLoc *ParseIdentifierLoc();
   2040 
   2041   void MaybeParseCXX11Attributes(Declarator &D) {
   2042     if (getLangOpts().CPlusPlus11 && isCXX11AttributeSpecifier()) {
   2043       ParsedAttributesWithRange attrs(AttrFactory);
   2044       SourceLocation endLoc;
   2045       ParseCXX11Attributes(attrs, &endLoc);
   2046       D.takeAttributes(attrs, endLoc);
   2047     }
   2048   }
   2049   void MaybeParseCXX11Attributes(ParsedAttributes &attrs,
   2050                                  SourceLocation *endLoc = nullptr) {
   2051     if (getLangOpts().CPlusPlus11 && isCXX11AttributeSpecifier()) {
   2052       ParsedAttributesWithRange attrsWithRange(AttrFactory);
   2053       ParseCXX11Attributes(attrsWithRange, endLoc);
   2054       attrs.takeAllFrom(attrsWithRange);
   2055     }
   2056   }
   2057   void MaybeParseCXX11Attributes(ParsedAttributesWithRange &attrs,
   2058                                  SourceLocation *endLoc = nullptr,
   2059                                  bool OuterMightBeMessageSend = false) {
   2060     if (getLangOpts().CPlusPlus11 &&
   2061         isCXX11AttributeSpecifier(false, OuterMightBeMessageSend))
   2062       ParseCXX11Attributes(attrs, endLoc);
   2063   }
   2064 
   2065   void ParseCXX11AttributeSpecifier(ParsedAttributes &attrs,
   2066                                     SourceLocation *EndLoc = nullptr);
   2067   void ParseCXX11Attributes(ParsedAttributesWithRange &attrs,
   2068                             SourceLocation *EndLoc = nullptr);
   2069   /// \brief Parses a C++-style attribute argument list. Returns true if this
   2070   /// results in adding an attribute to the ParsedAttributes list.
   2071   bool ParseCXX11AttributeArgs(IdentifierInfo *AttrName,
   2072                                SourceLocation AttrNameLoc,
   2073                                ParsedAttributes &Attrs, SourceLocation *EndLoc,
   2074                                IdentifierInfo *ScopeName,
   2075                                SourceLocation ScopeLoc);
   2076 
   2077   IdentifierInfo *TryParseCXX11AttributeIdentifier(SourceLocation &Loc);
   2078 
   2079   void MaybeParseMicrosoftAttributes(ParsedAttributes &attrs,
   2080                                      SourceLocation *endLoc = nullptr) {
   2081     if (getLangOpts().MicrosoftExt && Tok.is(tok::l_square))
   2082       ParseMicrosoftAttributes(attrs, endLoc);
   2083   }
   2084   void ParseMicrosoftAttributes(ParsedAttributes &attrs,
   2085                                 SourceLocation *endLoc = nullptr);
   2086   void ParseMicrosoftDeclSpec(ParsedAttributes &Attrs);
   2087   bool ParseMicrosoftDeclSpecArgs(IdentifierInfo *AttrName,
   2088                                   SourceLocation AttrNameLoc,
   2089                                   ParsedAttributes &Attrs);
   2090   void ParseMicrosoftTypeAttributes(ParsedAttributes &attrs);
   2091   void DiagnoseAndSkipExtendedMicrosoftTypeAttributes();
   2092   SourceLocation SkipExtendedMicrosoftTypeAttributes();
   2093   void ParseMicrosoftInheritanceClassAttributes(ParsedAttributes &attrs);
   2094   void ParseBorlandTypeAttributes(ParsedAttributes &attrs);
   2095   void ParseOpenCLAttributes(ParsedAttributes &attrs);
   2096   void ParseOpenCLQualifiers(ParsedAttributes &Attrs);
   2097 
   2098   VersionTuple ParseVersionTuple(SourceRange &Range);
   2099   void ParseAvailabilityAttribute(IdentifierInfo &Availability,
   2100                                   SourceLocation AvailabilityLoc,
   2101                                   ParsedAttributes &attrs,
   2102                                   SourceLocation *endLoc,
   2103                                   IdentifierInfo *ScopeName,
   2104                                   SourceLocation ScopeLoc,
   2105                                   AttributeList::Syntax Syntax);
   2106 
   2107   void ParseObjCBridgeRelatedAttribute(IdentifierInfo &ObjCBridgeRelated,
   2108                                        SourceLocation ObjCBridgeRelatedLoc,
   2109                                        ParsedAttributes &attrs,
   2110                                        SourceLocation *endLoc,
   2111                                        IdentifierInfo *ScopeName,
   2112                                        SourceLocation ScopeLoc,
   2113                                        AttributeList::Syntax Syntax);
   2114 
   2115   void ParseTypeTagForDatatypeAttribute(IdentifierInfo &AttrName,
   2116                                         SourceLocation AttrNameLoc,
   2117                                         ParsedAttributes &Attrs,
   2118                                         SourceLocation *EndLoc,
   2119                                         IdentifierInfo *ScopeName,
   2120                                         SourceLocation ScopeLoc,
   2121                                         AttributeList::Syntax Syntax);
   2122 
   2123   void ParseAttributeWithTypeArg(IdentifierInfo &AttrName,
   2124                                  SourceLocation AttrNameLoc,
   2125                                  ParsedAttributes &Attrs,
   2126                                  SourceLocation *EndLoc,
   2127                                  IdentifierInfo *ScopeName,
   2128                                  SourceLocation ScopeLoc,
   2129                                  AttributeList::Syntax Syntax);
   2130 
   2131   void ParseTypeofSpecifier(DeclSpec &DS);
   2132   SourceLocation ParseDecltypeSpecifier(DeclSpec &DS);
   2133   void AnnotateExistingDecltypeSpecifier(const DeclSpec &DS,
   2134                                          SourceLocation StartLoc,
   2135                                          SourceLocation EndLoc);
   2136   void ParseUnderlyingTypeSpecifier(DeclSpec &DS);
   2137   void ParseAtomicSpecifier(DeclSpec &DS);
   2138 
   2139   ExprResult ParseAlignArgument(SourceLocation Start,
   2140                                 SourceLocation &EllipsisLoc);
   2141   void ParseAlignmentSpecifier(ParsedAttributes &Attrs,
   2142                                SourceLocation *endLoc = nullptr);
   2143 
   2144   VirtSpecifiers::Specifier isCXX11VirtSpecifier(const Token &Tok) const;
   2145   VirtSpecifiers::Specifier isCXX11VirtSpecifier() const {
   2146     return isCXX11VirtSpecifier(Tok);
   2147   }
   2148   void ParseOptionalCXX11VirtSpecifierSeq(VirtSpecifiers &VS, bool IsInterface,
   2149                                           SourceLocation FriendLoc);
   2150 
   2151   bool isCXX11FinalKeyword() const;
   2152 
   2153   /// DeclaratorScopeObj - RAII object used in Parser::ParseDirectDeclarator to
   2154   /// enter a new C++ declarator scope and exit it when the function is
   2155   /// finished.
   2156   class DeclaratorScopeObj {
   2157     Parser &P;
   2158     CXXScopeSpec &SS;
   2159     bool EnteredScope;
   2160     bool CreatedScope;
   2161   public:
   2162     DeclaratorScopeObj(Parser &p, CXXScopeSpec &ss)
   2163       : P(p), SS(ss), EnteredScope(false), CreatedScope(false) {}
   2164 
   2165     void EnterDeclaratorScope() {
   2166       assert(!EnteredScope && "Already entered the scope!");
   2167       assert(SS.isSet() && "C++ scope was not set!");
   2168 
   2169       CreatedScope = true;
   2170       P.EnterScope(0); // Not a decl scope.
   2171 
   2172       if (!P.Actions.ActOnCXXEnterDeclaratorScope(P.getCurScope(), SS))
   2173         EnteredScope = true;
   2174     }
   2175 
   2176     ~DeclaratorScopeObj() {
   2177       if (EnteredScope) {
   2178         assert(SS.isSet() && "C++ scope was cleared ?");
   2179         P.Actions.ActOnCXXExitDeclaratorScope(P.getCurScope(), SS);
   2180       }
   2181       if (CreatedScope)
   2182         P.ExitScope();
   2183     }
   2184   };
   2185 
   2186   /// ParseDeclarator - Parse and verify a newly-initialized declarator.
   2187   void ParseDeclarator(Declarator &D);
   2188   /// A function that parses a variant of direct-declarator.
   2189   typedef void (Parser::*DirectDeclParseFunction)(Declarator&);
   2190   void ParseDeclaratorInternal(Declarator &D,
   2191                                DirectDeclParseFunction DirectDeclParser);
   2192 
   2193   enum AttrRequirements {
   2194     AR_NoAttributesParsed = 0, ///< No attributes are diagnosed.
   2195     AR_GNUAttributesParsedAndRejected = 1 << 0, ///< Diagnose GNU attributes.
   2196     AR_GNUAttributesParsed = 1 << 1,
   2197     AR_CXX11AttributesParsed = 1 << 2,
   2198     AR_DeclspecAttributesParsed = 1 << 3,
   2199     AR_AllAttributesParsed = AR_GNUAttributesParsed |
   2200                              AR_CXX11AttributesParsed |
   2201                              AR_DeclspecAttributesParsed,
   2202     AR_VendorAttributesParsed = AR_GNUAttributesParsed |
   2203                                 AR_DeclspecAttributesParsed
   2204   };
   2205 
   2206   void ParseTypeQualifierListOpt(DeclSpec &DS,
   2207                                  unsigned AttrReqs = AR_AllAttributesParsed,
   2208                                  bool AtomicAllowed = true,
   2209                                  bool IdentifierRequired = false);
   2210   void ParseDirectDeclarator(Declarator &D);
   2211   void ParseParenDeclarator(Declarator &D);
   2212   void ParseFunctionDeclarator(Declarator &D,
   2213                                ParsedAttributes &attrs,
   2214                                BalancedDelimiterTracker &Tracker,
   2215                                bool IsAmbiguous,
   2216                                bool RequiresArg = false);
   2217   bool ParseRefQualifier(bool &RefQualifierIsLValueRef,
   2218                          SourceLocation &RefQualifierLoc);
   2219   bool isFunctionDeclaratorIdentifierList();
   2220   void ParseFunctionDeclaratorIdentifierList(
   2221          Declarator &D,
   2222          SmallVectorImpl<DeclaratorChunk::ParamInfo> &ParamInfo);
   2223   void ParseParameterDeclarationClause(
   2224          Declarator &D,
   2225          ParsedAttributes &attrs,
   2226          SmallVectorImpl<DeclaratorChunk::ParamInfo> &ParamInfo,
   2227          SourceLocation &EllipsisLoc);
   2228   void ParseBracketDeclarator(Declarator &D);
   2229   void ParseMisplacedBracketDeclarator(Declarator &D);
   2230 
   2231   //===--------------------------------------------------------------------===//
   2232   // C++ 7: Declarations [dcl.dcl]
   2233 
   2234   /// The kind of attribute specifier we have found.
   2235   enum CXX11AttributeKind {
   2236     /// This is not an attribute specifier.
   2237     CAK_NotAttributeSpecifier,
   2238     /// This should be treated as an attribute-specifier.
   2239     CAK_AttributeSpecifier,
   2240     /// The next tokens are '[[', but this is not an attribute-specifier. This
   2241     /// is ill-formed by C++11 [dcl.attr.grammar]p6.
   2242     CAK_InvalidAttributeSpecifier
   2243   };
   2244   CXX11AttributeKind
   2245   isCXX11AttributeSpecifier(bool Disambiguate = false,
   2246                             bool OuterMightBeMessageSend = false);
   2247 
   2248   void DiagnoseUnexpectedNamespace(NamedDecl *Context);
   2249 
   2250   Decl *ParseNamespace(unsigned Context, SourceLocation &DeclEnd,
   2251                        SourceLocation InlineLoc = SourceLocation());
   2252   void ParseInnerNamespace(std::vector<SourceLocation>& IdentLoc,
   2253                            std::vector<IdentifierInfo*>& Ident,
   2254                            std::vector<SourceLocation>& NamespaceLoc,
   2255                            unsigned int index, SourceLocation& InlineLoc,
   2256                            ParsedAttributes& attrs,
   2257                            BalancedDelimiterTracker &Tracker);
   2258   Decl *ParseLinkage(ParsingDeclSpec &DS, unsigned Context);
   2259   Decl *ParseUsingDirectiveOrDeclaration(unsigned Context,
   2260                                          const ParsedTemplateInfo &TemplateInfo,
   2261                                          SourceLocation &DeclEnd,
   2262                                          ParsedAttributesWithRange &attrs,
   2263                                          Decl **OwnedType = nullptr);
   2264   Decl *ParseUsingDirective(unsigned Context,
   2265                             SourceLocation UsingLoc,
   2266                             SourceLocation &DeclEnd,
   2267                             ParsedAttributes &attrs);
   2268   Decl *ParseUsingDeclaration(unsigned Context,
   2269                               const ParsedTemplateInfo &TemplateInfo,
   2270                               SourceLocation UsingLoc,
   2271                               SourceLocation &DeclEnd,
   2272                               AccessSpecifier AS = AS_none,
   2273                               Decl **OwnedType = nullptr);
   2274   Decl *ParseStaticAssertDeclaration(SourceLocation &DeclEnd);
   2275   Decl *ParseNamespaceAlias(SourceLocation NamespaceLoc,
   2276                             SourceLocation AliasLoc, IdentifierInfo *Alias,
   2277                             SourceLocation &DeclEnd);
   2278 
   2279   //===--------------------------------------------------------------------===//
   2280   // C++ 9: classes [class] and C structs/unions.
   2281   bool isValidAfterTypeSpecifier(bool CouldBeBitfield);
   2282   void ParseClassSpecifier(tok::TokenKind TagTokKind, SourceLocation TagLoc,
   2283                            DeclSpec &DS, const ParsedTemplateInfo &TemplateInfo,
   2284                            AccessSpecifier AS, bool EnteringContext,
   2285                            DeclSpecContext DSC,
   2286                            ParsedAttributesWithRange &Attributes);
   2287   void SkipCXXMemberSpecification(SourceLocation StartLoc,
   2288                                   SourceLocation AttrFixitLoc,
   2289                                   unsigned TagType,
   2290                                   Decl *TagDecl);
   2291   void ParseCXXMemberSpecification(SourceLocation StartLoc,
   2292                                    SourceLocation AttrFixitLoc,
   2293                                    ParsedAttributesWithRange &Attrs,
   2294                                    unsigned TagType,
   2295                                    Decl *TagDecl);
   2296   ExprResult ParseCXXMemberInitializer(Decl *D, bool IsFunction,
   2297                                        SourceLocation &EqualLoc);
   2298   bool ParseCXXMemberDeclaratorBeforeInitializer(Declarator &DeclaratorInfo,
   2299                                                  VirtSpecifiers &VS,
   2300                                                  ExprResult &BitfieldSize,
   2301                                                  LateParsedAttrList &LateAttrs);
   2302   void MaybeParseAndDiagnoseDeclSpecAfterCXX11VirtSpecifierSeq(Declarator &D,
   2303                                                                VirtSpecifiers &VS);
   2304   void ParseCXXClassMemberDeclaration(AccessSpecifier AS, AttributeList *Attr,
   2305                   const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(),
   2306                   ParsingDeclRAIIObject *DiagsFromTParams = nullptr);
   2307   void ParseConstructorInitializer(Decl *ConstructorDecl);
   2308   MemInitResult ParseMemInitializer(Decl *ConstructorDecl);
   2309   void HandleMemberFunctionDeclDelays(Declarator& DeclaratorInfo,
   2310                                       Decl *ThisDecl);
   2311 
   2312   //===--------------------------------------------------------------------===//
   2313   // C++ 10: Derived classes [class.derived]
   2314   TypeResult ParseBaseTypeSpecifier(SourceLocation &BaseLoc,
   2315                                     SourceLocation &EndLocation);
   2316   void ParseBaseClause(Decl *ClassDecl);
   2317   BaseResult ParseBaseSpecifier(Decl *ClassDecl);
   2318   AccessSpecifier getAccessSpecifierIfPresent() const;
   2319 
   2320   bool ParseUnqualifiedIdTemplateId(CXXScopeSpec &SS,
   2321                                     SourceLocation TemplateKWLoc,
   2322                                     IdentifierInfo *Name,
   2323                                     SourceLocation NameLoc,
   2324                                     bool EnteringContext,
   2325                                     ParsedType ObjectType,
   2326                                     UnqualifiedId &Id,
   2327                                     bool AssumeTemplateId);
   2328   bool ParseUnqualifiedIdOperator(CXXScopeSpec &SS, bool EnteringContext,
   2329                                   ParsedType ObjectType,
   2330                                   UnqualifiedId &Result);
   2331 
   2332   //===--------------------------------------------------------------------===//
   2333   // OpenMP: Directives and clauses.
   2334   /// \brief Parses declarative OpenMP directives.
   2335   DeclGroupPtrTy ParseOpenMPDeclarativeDirective();
   2336   /// \brief Parses simple list of variables.
   2337   ///
   2338   /// \param Kind Kind of the directive.
   2339   /// \param [out] VarList List of referenced variables.
   2340   /// \param AllowScopeSpecifier true, if the variables can have fully
   2341   /// qualified names.
   2342   ///
   2343   bool ParseOpenMPSimpleVarList(OpenMPDirectiveKind Kind,
   2344                                 SmallVectorImpl<Expr *> &VarList,
   2345                                 bool AllowScopeSpecifier);
   2346   /// \brief Parses declarative or executable directive.
   2347   ///
   2348   /// \param StandAloneAllowed true if allowed stand-alone directives,
   2349   /// false - otherwise
   2350   ///
   2351   StmtResult
   2352   ParseOpenMPDeclarativeOrExecutableDirective(bool StandAloneAllowed);
   2353   /// \brief Parses clause of kind \a CKind for directive of a kind \a Kind.
   2354   ///
   2355   /// \param DKind Kind of current directive.
   2356   /// \param CKind Kind of current clause.
   2357   /// \param FirstClause true, if this is the first clause of a kind \a CKind
   2358   /// in current directive.
   2359   ///
   2360   OMPClause *ParseOpenMPClause(OpenMPDirectiveKind DKind,
   2361                                OpenMPClauseKind CKind, bool FirstClause);
   2362   /// \brief Parses clause with a single expression of a kind \a Kind.
   2363   ///
   2364   /// \param Kind Kind of current clause.
   2365   ///
   2366   OMPClause *ParseOpenMPSingleExprClause(OpenMPClauseKind Kind);
   2367   /// \brief Parses simple clause of a kind \a Kind.
   2368   ///
   2369   /// \param Kind Kind of current clause.
   2370   ///
   2371   OMPClause *ParseOpenMPSimpleClause(OpenMPClauseKind Kind);
   2372   /// \brief Parses clause with a single expression and an additional argument
   2373   /// of a kind \a Kind.
   2374   ///
   2375   /// \param Kind Kind of current clause.
   2376   ///
   2377   OMPClause *ParseOpenMPSingleExprWithArgClause(OpenMPClauseKind Kind);
   2378   /// \brief Parses clause without any additional arguments.
   2379   ///
   2380   /// \param Kind Kind of current clause.
   2381   ///
   2382   OMPClause *ParseOpenMPClause(OpenMPClauseKind Kind);
   2383   /// \brief Parses clause with the list of variables of a kind \a Kind.
   2384   ///
   2385   /// \param Kind Kind of current clause.
   2386   ///
   2387   OMPClause *ParseOpenMPVarListClause(OpenMPClauseKind Kind);
   2388 public:
   2389   bool ParseUnqualifiedId(CXXScopeSpec &SS, bool EnteringContext,
   2390                           bool AllowDestructorName,
   2391                           bool AllowConstructorName,
   2392                           ParsedType ObjectType,
   2393                           SourceLocation& TemplateKWLoc,
   2394                           UnqualifiedId &Result);
   2395 
   2396 private:
   2397   //===--------------------------------------------------------------------===//
   2398   // C++ 14: Templates [temp]
   2399 
   2400   // C++ 14.1: Template Parameters [temp.param]
   2401   Decl *ParseDeclarationStartingWithTemplate(unsigned Context,
   2402                                           SourceLocation &DeclEnd,
   2403                                           AccessSpecifier AS = AS_none,
   2404                                           AttributeList *AccessAttrs = nullptr);
   2405   Decl *ParseTemplateDeclarationOrSpecialization(unsigned Context,
   2406                                                  SourceLocation &DeclEnd,
   2407                                                  AccessSpecifier AS,
   2408                                                  AttributeList *AccessAttrs);
   2409   Decl *ParseSingleDeclarationAfterTemplate(
   2410                                        unsigned Context,
   2411                                        const ParsedTemplateInfo &TemplateInfo,
   2412                                        ParsingDeclRAIIObject &DiagsFromParams,
   2413                                        SourceLocation &DeclEnd,
   2414                                        AccessSpecifier AS=AS_none,
   2415                                        AttributeList *AccessAttrs = nullptr);
   2416   bool ParseTemplateParameters(unsigned Depth,
   2417                                SmallVectorImpl<Decl*> &TemplateParams,
   2418                                SourceLocation &LAngleLoc,
   2419                                SourceLocation &RAngleLoc);
   2420   bool ParseTemplateParameterList(unsigned Depth,
   2421                                   SmallVectorImpl<Decl*> &TemplateParams);
   2422   bool isStartOfTemplateTypeParameter();
   2423   Decl *ParseTemplateParameter(unsigned Depth, unsigned Position);
   2424   Decl *ParseTypeParameter(unsigned Depth, unsigned Position);
   2425   Decl *ParseTemplateTemplateParameter(unsigned Depth, unsigned Position);
   2426   Decl *ParseNonTypeTemplateParameter(unsigned Depth, unsigned Position);
   2427   void DiagnoseMisplacedEllipsis(SourceLocation EllipsisLoc,
   2428                                  SourceLocation CorrectLoc,
   2429                                  bool AlreadyHasEllipsis,
   2430                                  bool IdentifierHasName);
   2431   void DiagnoseMisplacedEllipsisInDeclarator(SourceLocation EllipsisLoc,
   2432                                              Declarator &D);
   2433   // C++ 14.3: Template arguments [temp.arg]
   2434   typedef SmallVector<ParsedTemplateArgument, 16> TemplateArgList;
   2435 
   2436   bool ParseGreaterThanInTemplateList(SourceLocation &RAngleLoc,
   2437                                       bool ConsumeLastToken);
   2438   bool ParseTemplateIdAfterTemplateName(TemplateTy Template,
   2439                                         SourceLocation TemplateNameLoc,
   2440                                         const CXXScopeSpec &SS,
   2441                                         bool ConsumeLastToken,
   2442                                         SourceLocation &LAngleLoc,
   2443                                         TemplateArgList &TemplateArgs,
   2444                                         SourceLocation &RAngleLoc);
   2445 
   2446   bool AnnotateTemplateIdToken(TemplateTy Template, TemplateNameKind TNK,
   2447                                CXXScopeSpec &SS,
   2448                                SourceLocation TemplateKWLoc,
   2449                                UnqualifiedId &TemplateName,
   2450                                bool AllowTypeAnnotation = true);
   2451   void AnnotateTemplateIdTokenAsType();
   2452   bool IsTemplateArgumentList(unsigned Skip = 0);
   2453   bool ParseTemplateArgumentList(TemplateArgList &TemplateArgs);
   2454   ParsedTemplateArgument ParseTemplateTemplateArgument();
   2455   ParsedTemplateArgument ParseTemplateArgument();
   2456   Decl *ParseExplicitInstantiation(unsigned Context,
   2457                                    SourceLocation ExternLoc,
   2458                                    SourceLocation TemplateLoc,
   2459                                    SourceLocation &DeclEnd,
   2460                                    AccessSpecifier AS = AS_none);
   2461 
   2462   //===--------------------------------------------------------------------===//
   2463   // Modules
   2464   DeclGroupPtrTy ParseModuleImport(SourceLocation AtLoc);
   2465 
   2466   //===--------------------------------------------------------------------===//
   2467   // C++11/G++: Type Traits [Type-Traits.html in the GCC manual]
   2468   ExprResult ParseTypeTrait();
   2469 
   2470   //===--------------------------------------------------------------------===//
   2471   // Embarcadero: Arary and Expression Traits
   2472   ExprResult ParseArrayTypeTrait();
   2473   ExprResult ParseExpressionTrait();
   2474 
   2475   //===--------------------------------------------------------------------===//
   2476   // Preprocessor code-completion pass-through
   2477   void CodeCompleteDirective(bool InConditional) override;
   2478   void CodeCompleteInConditionalExclusion() override;
   2479   void CodeCompleteMacroName(bool IsDefinition) override;
   2480   void CodeCompletePreprocessorExpression() override;
   2481   void CodeCompleteMacroArgument(IdentifierInfo *Macro, MacroInfo *MacroInfo,
   2482                                  unsigned ArgumentIndex) override;
   2483   void CodeCompleteNaturalLanguage() override;
   2484 };
   2485 
   2486 }  // end namespace clang
   2487 
   2488 #endif
   2489