diff options
Diffstat (limited to 'include/clang/Parse/Parser.h')
-rw-r--r-- | include/clang/Parse/Parser.h | 91 |
1 files changed, 69 insertions, 22 deletions
diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index 5838a447c3b9..972f13daca46 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -74,7 +74,8 @@ class Parser : public CodeCompletionHandler { // a statement). SourceLocation PrevTokLocation; - unsigned short ParenCount, BracketCount, BraceCount; + unsigned short ParenCount = 0, BracketCount = 0, BraceCount = 0; + unsigned short MisplacedModuleBeginCount = 0; /// Actions - These are the callbacks we invoke as we parse various constructs /// in the file. @@ -143,6 +144,7 @@ class Parser : public CodeCompletionHandler { /// C++0x contextual keywords. mutable IdentifierInfo *Ident_final; + mutable IdentifierInfo *Ident_GNU_final; mutable IdentifierInfo *Ident_override; // C++ type trait keywords that can be reverted to identifiers and still be @@ -171,6 +173,8 @@ class Parser : public CodeCompletionHandler { std::unique_ptr<PragmaHandler> MSCodeSeg; std::unique_ptr<PragmaHandler> MSSection; std::unique_ptr<PragmaHandler> MSRuntimeChecks; + std::unique_ptr<PragmaHandler> MSIntrinsic; + std::unique_ptr<PragmaHandler> CUDAForceHostDeviceHandler; std::unique_ptr<PragmaHandler> OptimizeHandler; std::unique_ptr<PragmaHandler> LoopHintHandler; std::unique_ptr<PragmaHandler> UnrollHintHandler; @@ -244,6 +248,11 @@ class Parser : public CodeCompletionHandler { bool SkipFunctionBodies; + /// The location of the expression statement that is being parsed right now. + /// Used to determine if an expression that is being parsed is a statement or + /// just a regular sub-expression. + SourceLocation ExprStatementTokLoc; + public: Parser(Preprocessor &PP, Sema &Actions, bool SkipFunctionBodies); ~Parser() override; @@ -277,6 +286,9 @@ public: /// void Initialize(); + /// Parse the first top-level declaration in a translation unit. + bool ParseFirstTopLevelDecl(DeclGroupPtrTy &Result); + /// ParseTopLevelDecl - Parse one top-level declaration. Returns true if /// the EOF was encountered. bool ParseTopLevelDecl(DeclGroupPtrTy &Result); @@ -314,6 +326,10 @@ public: return true; } + SourceLocation getEndOfPreviousToken() { + return PP.getLocForEndOfToken(PrevTokLocation); + } + /// Retrieve the underscored keyword (_Nonnull, _Nullable) that corresponds /// to the given nullability kind. IdentifierInfo *getNullabilityKeyword(NullabilityKind nullability) { @@ -868,8 +884,8 @@ public: StopAtCodeCompletion = 1 << 2 ///< Stop at code completion }; - friend LLVM_CONSTEXPR SkipUntilFlags operator|(SkipUntilFlags L, - SkipUntilFlags R) { + friend constexpr SkipUntilFlags operator|(SkipUntilFlags L, + SkipUntilFlags R) { return static_cast<SkipUntilFlags>(static_cast<unsigned>(L) | static_cast<unsigned>(R)); } @@ -1002,8 +1018,8 @@ private: /// (C++ [class.mem]p2). struct LateParsedDefaultArgument { explicit LateParsedDefaultArgument(Decl *P, - CachedTokens *Toks = nullptr) - : Param(P), Toks(Toks) { } + std::unique_ptr<CachedTokens> Toks = nullptr) + : Param(P), Toks(std::move(Toks)) { } /// Param - The parameter declaration for this parameter. Decl *Param; @@ -1012,7 +1028,7 @@ private: /// argument expression, not including the '=' or the terminating /// ')' or ','. This will be NULL for parameters that have no /// default argument. - CachedTokens *Toks; + std::unique_ptr<CachedTokens> Toks; }; /// LateParsedMethodDeclaration - A method declaration inside a class that @@ -1245,6 +1261,11 @@ private: ParsedAttributesWithRange(AttributeFactory &factory) : ParsedAttributes(factory) {} + void clear() { + ParsedAttributes::clear(); + Range = SourceRange(); + } + SourceRange Range; }; @@ -1514,8 +1535,6 @@ private: bool IsTypename = false, IdentifierInfo **LastII = nullptr); - void CheckForLParenAfterColonColon(); - //===--------------------------------------------------------------------===// // C++0x 5.1.2: Lambda expressions @@ -2098,8 +2117,8 @@ private: void DiagnoseMisplacedCXX11Attribute(ParsedAttributesWithRange &Attrs, SourceLocation CorrectLocation); - void handleDeclspecAlignBeforeClassKey(ParsedAttributesWithRange &Attrs, - DeclSpec &DS, Sema::TagUseKind TUK); + void stripTypeAttributesOffDeclSpec(ParsedAttributesWithRange &Attrs, + DeclSpec &DS, Sema::TagUseKind TUK); void ProhibitAttributes(ParsedAttributesWithRange &attrs) { if (!attrs.Range.isValid()) return; @@ -2111,7 +2130,8 @@ private: // Forbid C++11 attributes that appear on certain syntactic // locations which standard permits but we don't supported yet, // for example, attributes appertain to decl specifiers. - void ProhibitCXX11Attributes(ParsedAttributesWithRange &attrs); + void ProhibitCXX11Attributes(ParsedAttributesWithRange &Attrs, + unsigned DiagID); /// \brief Skip C++11 attributes and return the end location of the last one. /// \returns SourceLocation() if there are no attributes. @@ -2203,6 +2223,7 @@ private: if (getLangOpts().MicrosoftExt && Tok.is(tok::l_square)) ParseMicrosoftAttributes(attrs, endLoc); } + void ParseMicrosoftUuidAttributeArgs(ParsedAttributes &Attrs); void ParseMicrosoftAttributes(ParsedAttributes &attrs, SourceLocation *endLoc = nullptr); void MaybeParseMicrosoftDeclSpecs(ParsedAttributes &Attrs, @@ -2352,6 +2373,7 @@ private: bool AtomicAllowed = true, bool IdentifierRequired = false); void ParseDirectDeclarator(Declarator &D); + void ParseDecompositionDeclarator(Declarator &D); void ParseParenDeclarator(Declarator &D); void ParseFunctionDeclarator(Declarator &D, ParsedAttributes &attrs, @@ -2400,21 +2422,40 @@ private: ParsedAttributes& attrs, BalancedDelimiterTracker &Tracker); Decl *ParseLinkage(ParsingDeclSpec &DS, unsigned Context); - Decl *ParseUsingDirectiveOrDeclaration(unsigned Context, - const ParsedTemplateInfo &TemplateInfo, - SourceLocation &DeclEnd, - ParsedAttributesWithRange &attrs, - Decl **OwnedType = nullptr); + Decl *ParseExportDeclaration(); + DeclGroupPtrTy ParseUsingDirectiveOrDeclaration( + unsigned Context, const ParsedTemplateInfo &TemplateInfo, + SourceLocation &DeclEnd, ParsedAttributesWithRange &attrs); Decl *ParseUsingDirective(unsigned Context, SourceLocation UsingLoc, SourceLocation &DeclEnd, ParsedAttributes &attrs); - Decl *ParseUsingDeclaration(unsigned Context, - const ParsedTemplateInfo &TemplateInfo, - SourceLocation UsingLoc, - SourceLocation &DeclEnd, - AccessSpecifier AS = AS_none, - Decl **OwnedType = nullptr); + + struct UsingDeclarator { + SourceLocation TypenameLoc; + CXXScopeSpec SS; + SourceLocation TemplateKWLoc; + UnqualifiedId Name; + SourceLocation EllipsisLoc; + + void clear() { + TypenameLoc = TemplateKWLoc = EllipsisLoc = SourceLocation(); + SS.clear(); + Name.clear(); + } + }; + + bool ParseUsingDeclarator(unsigned Context, UsingDeclarator &D); + DeclGroupPtrTy ParseUsingDeclaration(unsigned Context, + const ParsedTemplateInfo &TemplateInfo, + SourceLocation UsingLoc, + SourceLocation &DeclEnd, + AccessSpecifier AS = AS_none); + Decl *ParseAliasDeclarationAfterDeclarator( + const ParsedTemplateInfo &TemplateInfo, SourceLocation UsingLoc, + UsingDeclarator &D, SourceLocation &DeclEnd, AccessSpecifier AS, + ParsedAttributes &Attrs, Decl **OwnedType = nullptr); + Decl *ParseStaticAssertDeclaration(SourceLocation &DeclEnd); Decl *ParseNamespaceAlias(SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, @@ -2649,6 +2690,7 @@ private: //===--------------------------------------------------------------------===// // Modules + DeclGroupPtrTy ParseModuleDecl(); DeclGroupPtrTy ParseModuleImport(SourceLocation AtLoc); bool parseMisplacedModuleImport(); bool tryParseMisplacedModuleImport() { @@ -2659,6 +2701,11 @@ private: return false; } + bool ParseModuleName( + SourceLocation UseLoc, + SmallVectorImpl<std::pair<IdentifierInfo *, SourceLocation>> &Path, + bool IsImport); + //===--------------------------------------------------------------------===// // C++11/G++: Type Traits [Type-Traits.html in the GCC manual] ExprResult ParseTypeTrait(); |