From 711e3a569167ee6f3fbccf983933d92cd03a469b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timm=20B=C3=A4der?= Date: Tue, 22 Mar 2022 09:27:27 +0100 Subject: [PATCH] [clang][parse] Move source range into ParsedAttibutesView Move the SourceRange from the old ParsedAttributesWithRange into ParsedAttributesView, so we have source range information available everywhere we use attributes. This also removes ParsedAttributesWithRange (replaced by simply using ParsedAttributes) and ParsedAttributesVieWithRange (replaced by using ParsedAttributesView). Differential Revision: https://reviews.llvm.org/D121201 --- clang/include/clang/Parse/Parser.h | 183 ++++++++++-------------------- clang/include/clang/Sema/DeclSpec.h | 10 +- clang/include/clang/Sema/ParsedAttr.h | 41 +++---- clang/include/clang/Sema/Sema.h | 16 +-- clang/lib/Parse/ParseCXXInlineMethods.cpp | 13 +-- clang/lib/Parse/ParseDecl.cpp | 124 +++++++++----------- clang/lib/Parse/ParseDeclCXX.cpp | 80 +++++++------ clang/lib/Parse/ParseExprCXX.cpp | 6 +- clang/lib/Parse/ParseObjc.cpp | 7 +- clang/lib/Parse/ParseOpenMP.cpp | 2 +- clang/lib/Parse/ParsePragma.cpp | 9 +- clang/lib/Parse/ParseStmt.cpp | 28 ++--- clang/lib/Parse/ParseTemplate.cpp | 2 +- clang/lib/Parse/ParseTentative.cpp | 2 +- clang/lib/Parse/Parser.cpp | 63 +++++----- clang/lib/Sema/SemaDecl.cpp | 13 +-- clang/lib/Sema/SemaDeclCXX.cpp | 11 +- clang/lib/Sema/SemaStmt.cpp | 2 +- clang/lib/Sema/SemaStmtAttr.cpp | 3 +- clang/lib/Sema/SemaType.cpp | 13 ++- clang/test/SemaOpenCL/address-spaces.cl | 2 +- 21 files changed, 261 insertions(+), 369 deletions(-) diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h index a3c1a15..1af53a1 100644 --- a/clang/include/clang/Parse/Parser.h +++ b/clang/include/clang/Parse/Parser.h @@ -1544,7 +1544,7 @@ private: }; NamedDecl *ParseCXXInlineMethodDef(AccessSpecifier AS, - ParsedAttributes &AccessAttrs, + const ParsedAttributesView &AccessAttrs, ParsingDeclarator &D, const ParsedTemplateInfo &TemplateInfo, const VirtSpecifiers &VS, @@ -1580,15 +1580,15 @@ private: //===--------------------------------------------------------------------===// // C99 6.9: External Definitions. - DeclGroupPtrTy ParseExternalDeclaration(ParsedAttributesWithRange &attrs, + DeclGroupPtrTy ParseExternalDeclaration(ParsedAttributes &Attrs, ParsingDeclSpec *DS = nullptr); bool isDeclarationAfterDeclarator(); bool isStartOfFunctionDefinition(const ParsingDeclarator &Declarator); - DeclGroupPtrTy ParseDeclarationOrFunctionDefinition( - ParsedAttributesWithRange &attrs, - ParsingDeclSpec *DS = nullptr, - AccessSpecifier AS = AS_none); - DeclGroupPtrTy ParseDeclOrFunctionDefInternal(ParsedAttributesWithRange &attrs, + DeclGroupPtrTy + ParseDeclarationOrFunctionDefinition(ParsedAttributes &Attrs, + ParsingDeclSpec *DS = nullptr, + AccessSpecifier AS = AS_none); + DeclGroupPtrTy ParseDeclOrFunctionDefInternal(ParsedAttributes &Attrs, ParsingDeclSpec &DS, AccessSpecifier AS); @@ -1603,7 +1603,7 @@ private: // Objective-C External Declarations void MaybeSkipAttributes(tok::ObjCKeywordKind Kind); - DeclGroupPtrTy ParseObjCAtDirectives(ParsedAttributesWithRange &Attrs); + DeclGroupPtrTy ParseObjCAtDirectives(ParsedAttributes &Attrs); DeclGroupPtrTy ParseObjCAtClassDeclaration(SourceLocation atLoc); Decl *ParseObjCAtInterfaceDeclaration(SourceLocation AtLoc, ParsedAttributes &prefixAttrs); @@ -1984,9 +1984,8 @@ private: bool MissingOK, ForRangeInfo *FRI = nullptr, bool EnterForConditionScope = false); - DeclGroupPtrTy - ParseAliasDeclarationInInitStatement(DeclaratorContext Context, - ParsedAttributesWithRange &Attrs); + DeclGroupPtrTy ParseAliasDeclarationInInitStatement(DeclaratorContext Context, + ParsedAttributes &Attrs); //===--------------------------------------------------------------------===// // C++ Coroutines @@ -2066,12 +2065,10 @@ private: StmtVector &Stmts, ParsedStmtContext StmtCtx, SourceLocation *TrailingElseLoc = nullptr); StmtResult ParseStatementOrDeclarationAfterAttributes( - StmtVector &Stmts, - ParsedStmtContext StmtCtx, - SourceLocation *TrailingElseLoc, - ParsedAttributesWithRange &Attrs); + StmtVector &Stmts, ParsedStmtContext StmtCtx, + SourceLocation *TrailingElseLoc, ParsedAttributes &Attrs); StmtResult ParseExprStatement(ParsedStmtContext StmtCtx); - StmtResult ParseLabeledStatement(ParsedAttributesWithRange &attrs, + StmtResult ParseLabeledStatement(ParsedAttributes &Attrs, ParsedStmtContext StmtCtx); StmtResult ParseCaseStatement(ParsedStmtContext StmtCtx, bool MissingCase = false, @@ -2099,10 +2096,9 @@ private: StmtResult ParseReturnStatement(); StmtResult ParseAsmStatement(bool &msAsm); StmtResult ParseMicrosoftAsmStatement(SourceLocation AsmLoc); - StmtResult ParsePragmaLoopHint(StmtVector &Stmts, - ParsedStmtContext StmtCtx, + StmtResult ParsePragmaLoopHint(StmtVector &Stmts, ParsedStmtContext StmtCtx, SourceLocation *TrailingElseLoc, - ParsedAttributesWithRange &Attrs); + ParsedAttributes &Attrs); /// Describes the behavior that should be taken for an __if_exists /// block. @@ -2311,11 +2307,11 @@ private: DeclGroupPtrTy ParseDeclaration(DeclaratorContext Context, SourceLocation &DeclEnd, - ParsedAttributesWithRange &attrs, + ParsedAttributes &Attrs, SourceLocation *DeclSpecStart = nullptr); DeclGroupPtrTy ParseSimpleDeclaration(DeclaratorContext Context, SourceLocation &DeclEnd, - ParsedAttributesWithRange &attrs, bool RequireSemi, + ParsedAttributes &Attrs, bool RequireSemi, ForRangeInit *FRI = nullptr, SourceLocation *DeclSpecStart = nullptr); bool MightBeDeclarator(DeclaratorContext Context); @@ -2341,7 +2337,7 @@ private: bool ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS, const ParsedTemplateInfo &TemplateInfo, AccessSpecifier AS, DeclSpecContext DSC, - ParsedAttributesWithRange &Attrs); + ParsedAttributes &Attrs); DeclSpecContext getDeclSpecContextFromDeclaratorContext(DeclaratorContext Context); void ParseDeclarationSpecifiers( @@ -2600,7 +2596,7 @@ private: } bool DiagnoseProhibitedCXX11Attribute(); - void CheckMisplacedCXX11Attribute(ParsedAttributesWithRange &Attrs, + void CheckMisplacedCXX11Attribute(ParsedAttributes &Attrs, SourceLocation CorrectLocation) { if (!standardAttributesAllowed()) return; @@ -2609,14 +2605,14 @@ private: return; DiagnoseMisplacedCXX11Attribute(Attrs, CorrectLocation); } - void DiagnoseMisplacedCXX11Attribute(ParsedAttributesWithRange &Attrs, + void DiagnoseMisplacedCXX11Attribute(ParsedAttributes &Attrs, SourceLocation CorrectLocation); - void stripTypeAttributesOffDeclSpec(ParsedAttributesWithRange &Attrs, - DeclSpec &DS, Sema::TagUseKind TUK); + void stripTypeAttributesOffDeclSpec(ParsedAttributes &Attrs, DeclSpec &DS, + Sema::TagUseKind TUK); // FixItLoc = possible correct location for the attributes - void ProhibitAttributes(ParsedAttributesWithRange &Attrs, + void ProhibitAttributes(ParsedAttributes &Attrs, SourceLocation FixItLoc = SourceLocation()) { if (Attrs.Range.isInvalid()) return; @@ -2624,7 +2620,7 @@ private: Attrs.clear(); } - void ProhibitAttributes(ParsedAttributesViewWithRange &Attrs, + void ProhibitAttributes(ParsedAttributesView &Attrs, SourceLocation FixItLoc = SourceLocation()) { if (Attrs.Range.isInvalid()) return; @@ -2637,8 +2633,7 @@ private: // Forbid C++11 and C2x 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, - unsigned DiagID, + void ProhibitCXX11Attributes(ParsedAttributes &Attrs, unsigned DiagID, bool DiagnoseEmptyAttrs = false); /// Skip C++11 and C2x attributes and return the end location of the @@ -2652,7 +2647,7 @@ private: /// Emit warnings for C++11 and C2x attributes that are in a position that /// clang accepts as an extension. - void DiagnoseCXX11AttributeExtension(ParsedAttributesWithRange &Attrs); + void DiagnoseCXX11AttributeExtension(ParsedAttributes &Attrs); /// Parses syntax-generic attribute arguments for attributes which are /// known to the implementation, and adds them to the given ParsedAttributes @@ -2684,27 +2679,10 @@ private: /// __attribute__(()) [[]] int i; // Not OK /// /// Such situations should use the specific attribute parsing functionality. - void ParseAttributes(unsigned WhichAttrKinds, - ParsedAttributesWithRange &Attrs, - LateParsedAttrList *LateAttrs = nullptr); void ParseAttributes(unsigned WhichAttrKinds, ParsedAttributes &Attrs, - LateParsedAttrList *LateAttrs = nullptr) { - ParsedAttributesWithRange AttrsWithRange(AttrFactory); - ParseAttributes(WhichAttrKinds, AttrsWithRange, LateAttrs); - Attrs.takeAllFrom(AttrsWithRange); - } + LateParsedAttrList *LateAttrs = nullptr); /// \brief Possibly parse attributes based on what syntaxes are desired, /// allowing for the order to vary. - bool MaybeParseAttributes(unsigned WhichAttrKinds, - ParsedAttributesWithRange &Attrs, - LateParsedAttrList *LateAttrs = nullptr) { - if (Tok.isOneOf(tok::kw___attribute, tok::kw___declspec) || - (standardAttributesAllowed() && isCXX11AttributeSpecifier())) { - ParseAttributes(WhichAttrKinds, Attrs, LateAttrs); - return true; - } - return false; - } bool MaybeParseAttributes(unsigned WhichAttrKinds, ParsedAttributes &Attrs, LateParsedAttrList *LateAttrs = nullptr) { if (Tok.isOneOf(tok::kw___attribute, tok::kw___declspec) || @@ -2718,52 +2696,23 @@ private: void MaybeParseGNUAttributes(Declarator &D, LateParsedAttrList *LateAttrs = nullptr) { if (Tok.is(tok::kw___attribute)) { - ParsedAttributesWithRange attrs(AttrFactory); - ParseGNUAttributes(attrs, LateAttrs, &D); - D.takeAttributes(attrs, attrs.Range.getEnd()); + ParsedAttributes Attrs(AttrFactory); + ParseGNUAttributes(Attrs, LateAttrs, &D); + D.takeAttributes(Attrs); } } - /// Parses GNU-style attributes and returns them without source range - /// information. - /// - /// This API is discouraged. Use the version that takes a - /// ParsedAttributesWithRange instead. bool MaybeParseGNUAttributes(ParsedAttributes &Attrs, LateParsedAttrList *LateAttrs = nullptr) { if (Tok.is(tok::kw___attribute)) { - ParsedAttributesWithRange AttrsWithRange(AttrFactory); - ParseGNUAttributes(Attrs, LateAttrs); - Attrs.takeAllFrom(AttrsWithRange); - return true; - } - return false; - } - - bool MaybeParseGNUAttributes(ParsedAttributesWithRange &Attrs, - LateParsedAttrList *LateAttrs = nullptr) { - if (Tok.is(tok::kw___attribute)) { ParseGNUAttributes(Attrs, LateAttrs); return true; } return false; } - /// Parses GNU-style attributes and returns them without source range - /// information. - /// - /// This API is discouraged. Use the version that takes a - /// ParsedAttributesWithRange instead. void ParseGNUAttributes(ParsedAttributes &Attrs, LateParsedAttrList *LateAttrs = nullptr, - Declarator *D = nullptr) { - ParsedAttributesWithRange AttrsWithRange(AttrFactory); - ParseGNUAttributes(AttrsWithRange, LateAttrs, D); - Attrs.takeAllFrom(AttrsWithRange); - } - - void ParseGNUAttributes(ParsedAttributesWithRange &Attrs, - LateParsedAttrList *LateAttrs = nullptr, Declarator *D = nullptr); void ParseGNUAttributeArgs(IdentifierInfo *AttrName, SourceLocation AttrNameLoc, @@ -2790,25 +2739,17 @@ private: } void MaybeParseCXX11Attributes(Declarator &D) { if (standardAttributesAllowed() && isCXX11AttributeSpecifier()) { - ParsedAttributesWithRange attrs(AttrFactory); - ParseCXX11Attributes(attrs); - D.takeAttributes(attrs, attrs.Range.getEnd()); + ParsedAttributes Attrs(AttrFactory); + ParseCXX11Attributes(Attrs); + D.takeAttributes(Attrs); } } - bool MaybeParseCXX11Attributes(ParsedAttributes &attrs) { - if (standardAttributesAllowed() && isCXX11AttributeSpecifier()) { - ParsedAttributesWithRange attrsWithRange(AttrFactory); - ParseCXX11Attributes(attrsWithRange); - attrs.takeAllFrom(attrsWithRange); - return true; - } - return false; - } - bool MaybeParseCXX11Attributes(ParsedAttributesWithRange &attrs, + + bool MaybeParseCXX11Attributes(ParsedAttributes &Attrs, bool OuterMightBeMessageSend = false) { if (standardAttributesAllowed() && isCXX11AttributeSpecifier(false, OuterMightBeMessageSend)) { - ParseCXX11Attributes(attrs); + ParseCXX11Attributes(Attrs); return true; } return false; @@ -2826,7 +2767,7 @@ private: ParseCXX11AttributeSpecifierInternal(Attrs, OpenMPTokens, EndLoc); ReplayOpenMPAttributeTokens(OpenMPTokens); } - void ParseCXX11Attributes(ParsedAttributesWithRange &attrs); + void ParseCXX11Attributes(ParsedAttributes &attrs); /// Parses a C++11 (or C2x)-style attribute argument list. Returns true /// if this results in adding an attribute to the ParsedAttributes list. bool ParseCXX11AttributeArgs(IdentifierInfo *AttrName, @@ -2843,21 +2784,21 @@ private: void MaybeParseMicrosoftAttributes(ParsedAttributes &Attrs) { if (getLangOpts().MicrosoftExt && Tok.is(tok::l_square)) { - ParsedAttributesWithRange AttrsWithRange(AttrFactory); + ParsedAttributes AttrsWithRange(AttrFactory); ParseMicrosoftAttributes(AttrsWithRange); Attrs.takeAllFrom(AttrsWithRange); } } void ParseMicrosoftUuidAttributeArgs(ParsedAttributes &Attrs); - void ParseMicrosoftAttributes(ParsedAttributesWithRange &attrs); - bool MaybeParseMicrosoftDeclSpecs(ParsedAttributesWithRange &Attrs) { + void ParseMicrosoftAttributes(ParsedAttributes &Attrs); + bool MaybeParseMicrosoftDeclSpecs(ParsedAttributes &Attrs) { if (getLangOpts().DeclSpecKeyword && Tok.is(tok::kw___declspec)) { ParseMicrosoftDeclSpecs(Attrs); return true; } return false; } - void ParseMicrosoftDeclSpecs(ParsedAttributesWithRange &Attrs); + void ParseMicrosoftDeclSpecs(ParsedAttributes &Attrs); bool ParseMicrosoftDeclSpecArgs(IdentifierInfo *AttrName, SourceLocation AttrNameLoc, ParsedAttributes &Attrs); @@ -2892,8 +2833,8 @@ private: void ParseObjCBridgeRelatedAttribute(IdentifierInfo &ObjCBridgeRelated, SourceLocation ObjCBridgeRelatedLoc, - ParsedAttributes &attrs, - SourceLocation *endLoc, + ParsedAttributes &Attrs, + SourceLocation *EndLoc, IdentifierInfo *ScopeName, SourceLocation ScopeLoc, ParsedAttr::Syntax Syntax); @@ -2914,11 +2855,12 @@ private: SourceLocation ScopeLoc, ParsedAttr::Syntax Syntax); - void - ParseAttributeWithTypeArg(IdentifierInfo &AttrName, - SourceLocation AttrNameLoc, ParsedAttributes &Attrs, - SourceLocation *EndLoc, IdentifierInfo *ScopeName, - SourceLocation ScopeLoc, ParsedAttr::Syntax Syntax); + void ParseAttributeWithTypeArg(IdentifierInfo &AttrName, + SourceLocation AttrNameLoc, + ParsedAttributes &Attrs, + IdentifierInfo *ScopeName, + SourceLocation ScopeLoc, + ParsedAttr::Syntax Syntax); void ParseTypeofSpecifier(DeclSpec &DS); SourceLocation ParseDecltypeSpecifier(DeclSpec &DS); @@ -3004,11 +2946,9 @@ private: void ParseDirectDeclarator(Declarator &D); void ParseDecompositionDeclarator(Declarator &D); void ParseParenDeclarator(Declarator &D); - void ParseFunctionDeclarator(Declarator &D, - ParsedAttributes &attrs, + void ParseFunctionDeclarator(Declarator &D, ParsedAttributes &FirstArgAttrs, BalancedDelimiterTracker &Tracker, - bool IsAmbiguous, - bool RequiresArg = false); + bool IsAmbiguous, bool RequiresArg = false); void InitCXXThisScopeForDeclaratorIfRelevant( const Declarator &D, const DeclSpec &DS, llvm::Optional &ThisScope); @@ -3065,7 +3005,7 @@ private: Decl *ParseExportDeclaration(); DeclGroupPtrTy ParseUsingDirectiveOrDeclaration( DeclaratorContext Context, const ParsedTemplateInfo &TemplateInfo, - SourceLocation &DeclEnd, ParsedAttributesWithRange &attrs); + SourceLocation &DeclEnd, ParsedAttributes &Attrs); Decl *ParseUsingDirective(DeclaratorContext Context, SourceLocation UsingLoc, SourceLocation &DeclEnd, @@ -3089,7 +3029,7 @@ private: const ParsedTemplateInfo &TemplateInfo, SourceLocation UsingLoc, SourceLocation &DeclEnd, - ParsedAttributesWithRange &Attrs, + ParsedAttributes &Attrs, AccessSpecifier AS = AS_none); Decl *ParseAliasDeclarationAfterDeclarator( const ParsedTemplateInfo &TemplateInfo, SourceLocation UsingLoc, @@ -3107,16 +3047,14 @@ private: void ParseClassSpecifier(tok::TokenKind TagTokKind, SourceLocation TagLoc, DeclSpec &DS, const ParsedTemplateInfo &TemplateInfo, AccessSpecifier AS, bool EnteringContext, - DeclSpecContext DSC, - ParsedAttributesWithRange &Attributes); + DeclSpecContext DSC, ParsedAttributes &Attributes); void SkipCXXMemberSpecification(SourceLocation StartLoc, SourceLocation AttrFixitLoc, unsigned TagType, Decl *TagDecl); void ParseCXXMemberSpecification(SourceLocation StartLoc, SourceLocation AttrFixitLoc, - ParsedAttributesWithRange &Attrs, - unsigned TagType, + ParsedAttributes &Attrs, unsigned TagType, Decl *TagDecl); ExprResult ParseCXXMemberInitializer(Decl *D, bool IsFunction, SourceLocation &EqualLoc); @@ -3131,9 +3069,10 @@ private: AccessSpecifier AS, ParsedAttributes &Attr, const ParsedTemplateInfo &TemplateInfo = ParsedTemplateInfo(), ParsingDeclRAIIObject *DiagsFromTParams = nullptr); - DeclGroupPtrTy ParseCXXClassMemberDeclarationWithPragmas( - AccessSpecifier &AS, ParsedAttributesWithRange &AccessAttrs, - DeclSpec::TST TagType, Decl *Tag); + DeclGroupPtrTy + ParseCXXClassMemberDeclarationWithPragmas(AccessSpecifier &AS, + ParsedAttributes &AccessAttrs, + DeclSpec::TST TagType, Decl *Tag); void ParseConstructorInitializer(Decl *ConstructorDecl); MemInitResult ParseMemInitializer(Decl *ConstructorDecl); void HandleMemberFunctionDeclDelays(Declarator& DeclaratorInfo, @@ -3245,8 +3184,8 @@ private: /// Parses declarative OpenMP directives. DeclGroupPtrTy ParseOpenMPDeclarativeDirectiveWithExtDecl( - AccessSpecifier &AS, ParsedAttributesWithRange &Attrs, - bool Delayed = false, DeclSpec::TST TagType = DeclSpec::TST_unspecified, + AccessSpecifier &AS, ParsedAttributes &Attrs, bool Delayed = false, + DeclSpec::TST TagType = DeclSpec::TST_unspecified, Decl *TagDecl = nullptr); /// Parse 'omp declare reduction' construct. DeclGroupPtrTy ParseOpenMPDeclareReductionDirective(AccessSpecifier AS); diff --git a/clang/include/clang/Sema/DeclSpec.h b/clang/include/clang/Sema/DeclSpec.h index aad4ce4..6a7fbe8 100644 --- a/clang/include/clang/Sema/DeclSpec.h +++ b/clang/include/clang/Sema/DeclSpec.h @@ -368,7 +368,7 @@ private: ExplicitSpecifier FS_explicit_specifier; // attributes. - ParsedAttributesWithRange Attrs; + ParsedAttributes Attrs; // Scope specifier for the type spec, if applicable. CXXScopeSpec TypeScope; @@ -786,7 +786,7 @@ public: /// int __attribute__((may_alias)) __attribute__((aligned(16))) var; /// \endcode /// - void addAttributes(ParsedAttributesView &AL) { + void addAttributes(const ParsedAttributesView &AL) { Attrs.addAll(AL.begin(), AL.end()); } @@ -2513,11 +2513,11 @@ public: /// __attribute__((common,deprecated)); /// /// Also extends the range of the declarator. - void takeAttributes(ParsedAttributes &attrs, SourceLocation lastLoc) { + void takeAttributes(ParsedAttributes &attrs) { Attrs.takeAllFrom(attrs); - if (!lastLoc.isInvalid()) - SetRangeEnd(lastLoc); + if (attrs.Range.getEnd().isValid()) + SetRangeEnd(attrs.Range.getEnd()); } const ParsedAttributes &getAttributes() const { return Attrs; } diff --git a/clang/include/clang/Sema/ParsedAttr.h b/clang/include/clang/Sema/ParsedAttr.h index f8abb8c..554d73b8 100644 --- a/clang/include/clang/Sema/ParsedAttr.h +++ b/clang/include/clang/Sema/ParsedAttr.h @@ -900,6 +900,7 @@ class ParsedAttributesView { using SizeType = decltype(std::declval().size()); public: + SourceRange Range; bool empty() const { return AttrList.empty(); } SizeType size() const { return AttrList.size(); } ParsedAttr &operator[](SizeType pos) { return *AttrList[pos]; } @@ -998,15 +999,19 @@ public: AttributePool &getPool() const { return pool; } - void takeAllFrom(ParsedAttributes &attrs) { - addAll(attrs.begin(), attrs.end()); - attrs.clearListOnly(); - pool.takeAllFrom(attrs.pool); + void takeAllFrom(ParsedAttributes &Other) { + assert(&Other != this && + "ParsedAttributes can't take attributes from itself"); + addAll(Other.begin(), Other.end()); + Other.clearListOnly(); + pool.takeAllFrom(Other.pool); } - void takeOneFrom(ParsedAttributes &Attrs, ParsedAttr *PA) { - Attrs.getPool().remove(PA); - Attrs.remove(PA); + void takeOneFrom(ParsedAttributes &Other, ParsedAttr *PA) { + assert(&Other != this && + "ParsedAttributes can't take attribute from itself"); + Other.getPool().remove(PA); + Other.remove(PA); getPool().add(PA); addAtEnd(PA); } @@ -1014,6 +1019,7 @@ public: void clear() { clearListOnly(); pool.clear(); + Range = SourceRange(); } /// Add attribute with expression arguments. @@ -1097,27 +1103,6 @@ private: mutable AttributePool pool; }; -struct ParsedAttributesWithRange : ParsedAttributes { - ParsedAttributesWithRange(AttributeFactory &factory) - : ParsedAttributes(factory) {} - - void clear() { - ParsedAttributes::clear(); - Range = SourceRange(); - } - - SourceRange Range; -}; -struct ParsedAttributesViewWithRange : ParsedAttributesView { - ParsedAttributesViewWithRange() {} - void clearListOnly() { - ParsedAttributesView::clearListOnly(); - Range = SourceRange(); - } - - SourceRange Range; -}; - /// These constants match the enumerated choices of /// err_attribute_argument_n_type and err_attribute_argument_type. enum AttributeArgumentNType { diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 296b367..cf00cea 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -2867,8 +2867,7 @@ public: void ActOnCXXForRangeDecl(Decl *D); StmtResult ActOnCXXForRangeIdentifier(Scope *S, SourceLocation IdentLoc, IdentifierInfo *Ident, - ParsedAttributes &Attrs, - SourceLocation AttrEnd); + ParsedAttributes &Attrs); void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc); void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc); void CheckStaticLocalForDllExport(VarDecl *VD); @@ -4440,8 +4439,7 @@ public: /// Process the attributes before creating an attributed statement. Returns /// the semantic attributes that have been processed. - void ProcessStmtAttributes(Stmt *Stmt, - const ParsedAttributesWithRange &InAttrs, + void ProcessStmtAttributes(Stmt *Stmt, const ParsedAttributes &InAttrs, SmallVectorImpl &OutAttrs); void WarnConflictingTypedMethods(ObjCMethodDecl *Method, @@ -4783,7 +4781,7 @@ public: StmtResult BuildAttributedStmt(SourceLocation AttrsLoc, ArrayRef Attrs, Stmt *SubStmt); - StmtResult ActOnAttributedStmt(const ParsedAttributesWithRange &AttrList, + StmtResult ActOnAttributedStmt(const ParsedAttributes &AttrList, Stmt *SubStmt); class ConditionResult; @@ -7361,11 +7359,9 @@ public: TypeSourceInfo *TInfo, SourceLocation EllipsisLoc); - BaseResult ActOnBaseSpecifier(Decl *classdecl, - SourceRange SpecifierRange, - ParsedAttributes &Attrs, - bool Virtual, AccessSpecifier Access, - ParsedType basetype, + BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange, + const ParsedAttributesView &Attrs, bool Virtual, + AccessSpecifier Access, ParsedType basetype, SourceLocation BaseLoc, SourceLocation EllipsisLoc); diff --git a/clang/lib/Parse/ParseCXXInlineMethods.cpp b/clang/lib/Parse/ParseCXXInlineMethods.cpp index 7330c2b..906315a 100644 --- a/clang/lib/Parse/ParseCXXInlineMethods.cpp +++ b/clang/lib/Parse/ParseCXXInlineMethods.cpp @@ -22,9 +22,9 @@ using namespace clang; /// Declarator is a well formed C++ inline method definition. Now lex its body /// and store its tokens for parsing after the C++ class is complete. NamedDecl *Parser::ParseCXXInlineMethodDef( - AccessSpecifier AS, ParsedAttributes &AccessAttrs, ParsingDeclarator &D, - const ParsedTemplateInfo &TemplateInfo, const VirtSpecifiers &VS, - SourceLocation PureSpecLoc) { + AccessSpecifier AS, const ParsedAttributesView &AccessAttrs, + ParsingDeclarator &D, const ParsedTemplateInfo &TemplateInfo, + const VirtSpecifiers &VS, SourceLocation PureSpecLoc) { assert(D.isFunctionDeclarator() && "This isn't a function declarator!"); assert(Tok.isOneOf(tok::l_brace, tok::colon, tok::kw_try, tok::equal) && "Current token not a '{', ':', '=', or 'try'!"); @@ -720,7 +720,6 @@ void Parser::ParseLexedAttribute(LateParsedAttribute &LA, ConsumeAnyToken(/*ConsumeCodeCompletionTok=*/true); ParsedAttributes Attrs(AttrFactory); - SourceLocation endLoc; if (LA.Decls.size() > 0) { Decl *D = LA.Decls[0]; @@ -743,7 +742,7 @@ void Parser::ParseLexedAttribute(LateParsedAttribute &LA, Actions.ActOnReenterFunctionContext(Actions.CurScope, D); } - ParseGNUAttributeArgs(&LA.AttrName, LA.AttrNameLoc, Attrs, &endLoc, + ParseGNUAttributeArgs(&LA.AttrName, LA.AttrNameLoc, Attrs, nullptr, nullptr, SourceLocation(), ParsedAttr::AS_GNU, nullptr); @@ -752,7 +751,7 @@ void Parser::ParseLexedAttribute(LateParsedAttribute &LA, } else { // If there are multiple decls, then the decl cannot be within the // function scope. - ParseGNUAttributeArgs(&LA.AttrName, LA.AttrNameLoc, Attrs, &endLoc, + ParseGNUAttributeArgs(&LA.AttrName, LA.AttrNameLoc, Attrs, nullptr, nullptr, SourceLocation(), ParsedAttr::AS_GNU, nullptr); } @@ -796,7 +795,7 @@ void Parser::ParseLexedPragma(LateParsedPragma &LP) { case tok::annot_attr_openmp: case tok::annot_pragma_openmp: { AccessSpecifier AS = LP.getAccessSpecifier(); - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); (void)ParseOpenMPDeclarativeDirectiveWithExtDecl(AS, Attrs); break; } diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 135b2df..c0fb7e0 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -40,10 +40,8 @@ using namespace clang; /// specifier-qualifier-list abstract-declarator[opt] /// /// Called type-id in C++. -TypeResult Parser::ParseTypeName(SourceRange *Range, - DeclaratorContext Context, - AccessSpecifier AS, - Decl **OwnedType, +TypeResult Parser::ParseTypeName(SourceRange *Range, DeclaratorContext Context, + AccessSpecifier AS, Decl **OwnedType, ParsedAttributes *Attrs) { DeclSpecContext DSC = getDeclSpecContextFromDeclaratorContext(Context); if (DSC == DeclSpecContext::DSC_normal) @@ -103,8 +101,7 @@ static bool FindLocsWithCommonFileID(Preprocessor &PP, SourceLocation StartLoc, return AttrStartIsInMacro && AttrEndIsInMacro; } -void Parser::ParseAttributes(unsigned WhichAttrKinds, - ParsedAttributesWithRange &Attrs, +void Parser::ParseAttributes(unsigned WhichAttrKinds, ParsedAttributes &Attrs, LateParsedAttrList *LateAttrs) { bool MoreToParse; do { @@ -161,7 +158,7 @@ void Parser::ParseAttributes(unsigned WhichAttrKinds, /// ',' or ')' are ignored, otherwise they produce a parse error. /// /// We follow the C++ model, but don't allow junk after the identifier. -void Parser::ParseGNUAttributes(ParsedAttributesWithRange &Attrs, +void Parser::ParseGNUAttributes(ParsedAttributes &Attrs, LateParsedAttrList *LateAttrs, Declarator *D) { assert(Tok.is(tok::kw___attribute) && "Not a GNU attribute list!"); @@ -335,7 +332,6 @@ IdentifierLoc *Parser::ParseIdentifierLoc() { void Parser::ParseAttributeWithTypeArg(IdentifierInfo &AttrName, SourceLocation AttrNameLoc, ParsedAttributes &Attrs, - SourceLocation *EndLoc, IdentifierInfo *ScopeName, SourceLocation ScopeLoc, ParsedAttr::Syntax Syntax) { @@ -501,14 +497,10 @@ unsigned Parser::ParseAttributeArgsCommon( /// Parse the arguments to a parameterized GNU attribute or /// a C++11 attribute in "gnu" namespace. -void Parser::ParseGNUAttributeArgs(IdentifierInfo *AttrName, - SourceLocation AttrNameLoc, - ParsedAttributes &Attrs, - SourceLocation *EndLoc, - IdentifierInfo *ScopeName, - SourceLocation ScopeLoc, - ParsedAttr::Syntax Syntax, - Declarator *D) { +void Parser::ParseGNUAttributeArgs( + IdentifierInfo *AttrName, SourceLocation AttrNameLoc, + ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName, + SourceLocation ScopeLoc, ParsedAttr::Syntax Syntax, Declarator *D) { assert(Tok.is(tok::l_paren) && "Attribute arg list not starting with '('"); @@ -536,7 +528,7 @@ void Parser::ParseGNUAttributeArgs(IdentifierInfo *AttrName, ScopeName, ScopeLoc, Syntax); return; } else if (attributeIsTypeArgAttr(*AttrName)) { - ParseAttributeWithTypeArg(*AttrName, AttrNameLoc, Attrs, EndLoc, ScopeName, + ParseAttributeWithTypeArg(*AttrName, AttrNameLoc, Attrs, ScopeName, ScopeLoc, Syntax); return; } @@ -747,7 +739,7 @@ bool Parser::ParseMicrosoftDeclSpecArgs(IdentifierInfo *AttrName, /// [MS] extended-decl-modifier-seq: /// extended-decl-modifier[opt] /// extended-decl-modifier extended-decl-modifier-seq -void Parser::ParseMicrosoftDeclSpecs(ParsedAttributesWithRange &Attrs) { +void Parser::ParseMicrosoftDeclSpecs(ParsedAttributes &Attrs) { assert(getLangOpts().DeclSpecKeyword && "__declspec keyword is not enabled"); assert(Tok.is(tok::kw___declspec) && "Not a declspec!"); @@ -1429,13 +1421,10 @@ void Parser::ParseExternalSourceSymbolAttribute( /// opt-instance_method: /// Identifier | /// -void Parser::ParseObjCBridgeRelatedAttribute(IdentifierInfo &ObjCBridgeRelated, - SourceLocation ObjCBridgeRelatedLoc, - ParsedAttributes &attrs, - SourceLocation *endLoc, - IdentifierInfo *ScopeName, - SourceLocation ScopeLoc, - ParsedAttr::Syntax Syntax) { +void Parser::ParseObjCBridgeRelatedAttribute( + IdentifierInfo &ObjCBridgeRelated, SourceLocation ObjCBridgeRelatedLoc, + ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName, + SourceLocation ScopeLoc, ParsedAttr::Syntax Syntax) { // Opening '('. BalancedDelimiterTracker T(*this, tok::l_paren); if (T.consumeOpen()) { @@ -1491,20 +1480,16 @@ void Parser::ParseObjCBridgeRelatedAttribute(IdentifierInfo &ObjCBridgeRelated, if (T.consumeClose()) return; - if (endLoc) - *endLoc = T.getCloseLocation(); + if (EndLoc) + *EndLoc = T.getCloseLocation(); // Record this attribute - attrs.addNew(&ObjCBridgeRelated, + Attrs.addNew(&ObjCBridgeRelated, SourceRange(ObjCBridgeRelatedLoc, T.getCloseLocation()), - ScopeName, ScopeLoc, - RelatedClass, - ClassMethod, - InstanceMethod, + ScopeName, ScopeLoc, RelatedClass, ClassMethod, InstanceMethod, Syntax); } - void Parser::ParseSwiftNewTypeAttribute( IdentifierInfo &AttrName, SourceLocation AttrNameLoc, ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName, @@ -1546,7 +1531,6 @@ void Parser::ParseSwiftNewTypeAttribute( ScopeName, ScopeLoc, Args, llvm::array_lengthof(Args), Syntax); } - void Parser::ParseTypeTagForDatatypeAttribute(IdentifierInfo &AttrName, SourceLocation AttrNameLoc, ParsedAttributes &Attrs, @@ -1647,7 +1631,7 @@ bool Parser::DiagnoseProhibitedCXX11Attribute() { /// attribute-specifier in a location where an attribute is not permitted, but /// we know where the attributes ought to be written. Parse them anyway, and /// provide a fixit moving them to the right place. -void Parser::DiagnoseMisplacedCXX11Attribute(ParsedAttributesWithRange &Attrs, +void Parser::DiagnoseMisplacedCXX11Attribute(ParsedAttributes &Attrs, SourceLocation CorrectLocation) { assert((Tok.is(tok::l_square) && NextToken().is(tok::l_square)) || Tok.is(tok::kw_alignas)); @@ -1673,8 +1657,8 @@ void Parser::DiagnoseProhibitedAttributes( Diag(Range.getBegin(), diag::err_attributes_not_allowed) << Range; } -void Parser::ProhibitCXX11Attributes(ParsedAttributesWithRange &Attrs, - unsigned DiagID, bool DiagnoseEmptyAttrs) { +void Parser::ProhibitCXX11Attributes(ParsedAttributes &Attrs, unsigned DiagID, + bool DiagnoseEmptyAttrs) { if (DiagnoseEmptyAttrs && Attrs.empty() && Attrs.Range.isValid()) { // An attribute list has been parsed, but it was empty. @@ -1711,7 +1695,7 @@ void Parser::ProhibitCXX11Attributes(ParsedAttributesWithRange &Attrs, } } -void Parser::DiagnoseCXX11AttributeExtension(ParsedAttributesWithRange &Attrs) { +void Parser::DiagnoseCXX11AttributeExtension(ParsedAttributes &Attrs) { for (const ParsedAttr &PA : Attrs) { if (PA.isCXX11Attribute() || PA.isC2xAttribute()) Diag(PA.getLoc(), diag::ext_cxx11_attr_placement) << PA << PA.getRange(); @@ -1725,7 +1709,7 @@ void Parser::DiagnoseCXX11AttributeExtension(ParsedAttributesWithRange &Attrs) { // Also, Microsoft-style [attributes] seem to affect the type instead of the // variable. // This function moves attributes that should apply to the type off DS to Attrs. -void Parser::stripTypeAttributesOffDeclSpec(ParsedAttributesWithRange &Attrs, +void Parser::stripTypeAttributesOffDeclSpec(ParsedAttributes &Attrs, DeclSpec &DS, Sema::TagUseKind TUK) { if (TUK == Sema::TUK_Reference) @@ -1762,10 +1746,10 @@ void Parser::stripTypeAttributesOffDeclSpec(ParsedAttributesWithRange &Attrs, /// [C++11/C11] static_assert-declaration /// others... [FIXME] /// -Parser::DeclGroupPtrTy -Parser::ParseDeclaration(DeclaratorContext Context, SourceLocation &DeclEnd, - ParsedAttributesWithRange &attrs, - SourceLocation *DeclSpecStart) { +Parser::DeclGroupPtrTy Parser::ParseDeclaration(DeclaratorContext Context, + SourceLocation &DeclEnd, + ParsedAttributes &Attrs, + SourceLocation *DeclSpecStart) { ParenBraceBracketBalancer BalancerRAIIObj(*this); // Must temporarily exit the objective-c container scope for // parsing c none objective-c decls. @@ -1775,31 +1759,31 @@ Parser::ParseDeclaration(DeclaratorContext Context, SourceLocation &DeclEnd, switch (Tok.getKind()) { case tok::kw_template: case tok::kw_export: - ProhibitAttributes(attrs); - SingleDecl = ParseDeclarationStartingWithTemplate(Context, DeclEnd, attrs); + ProhibitAttributes(Attrs); + SingleDecl = ParseDeclarationStartingWithTemplate(Context, DeclEnd, Attrs); break; case tok::kw_inline: // Could be the start of an inline namespace. Allowed as an ext in C++03. if (getLangOpts().CPlusPlus && NextToken().is(tok::kw_namespace)) { - ProhibitAttributes(attrs); + ProhibitAttributes(Attrs); SourceLocation InlineLoc = ConsumeToken(); return ParseNamespace(Context, DeclEnd, InlineLoc); } - return ParseSimpleDeclaration(Context, DeclEnd, attrs, true, nullptr, + return ParseSimpleDeclaration(Context, DeclEnd, Attrs, true, nullptr, DeclSpecStart); case tok::kw_namespace: - ProhibitAttributes(attrs); + ProhibitAttributes(Attrs); return ParseNamespace(Context, DeclEnd); case tok::kw_using: return ParseUsingDirectiveOrDeclaration(Context, ParsedTemplateInfo(), - DeclEnd, attrs); + DeclEnd, Attrs); case tok::kw_static_assert: case tok::kw__Static_assert: - ProhibitAttributes(attrs); + ProhibitAttributes(Attrs); SingleDecl = ParseStaticAssertDeclaration(DeclEnd); break; default: - return ParseSimpleDeclaration(Context, DeclEnd, attrs, true, nullptr, + return ParseSimpleDeclaration(Context, DeclEnd, Attrs, true, nullptr, DeclSpecStart); } @@ -1830,9 +1814,8 @@ Parser::ParseDeclaration(DeclaratorContext Context, SourceLocation &DeclEnd, /// the Declaration. The SourceLocation for this Decl is set to /// DeclSpecStart if DeclSpecStart is non-null. Parser::DeclGroupPtrTy Parser::ParseSimpleDeclaration( - DeclaratorContext Context, SourceLocation &DeclEnd, - ParsedAttributesWithRange &Attrs, bool RequireSemi, ForRangeInit *FRI, - SourceLocation *DeclSpecStart) { + DeclaratorContext Context, SourceLocation &DeclEnd, ParsedAttributes &Attrs, + bool RequireSemi, ForRangeInit *FRI, SourceLocation *DeclSpecStart) { // Parse the common declaration-specifiers piece. ParsingDeclSpec DS(*this); @@ -2630,7 +2613,7 @@ static bool isValidAfterIdentifierInDeclarator(const Token &T) { bool Parser::ParseImplicitInt(DeclSpec &DS, CXXScopeSpec *SS, const ParsedTemplateInfo &TemplateInfo, AccessSpecifier AS, DeclSpecContext DSC, - ParsedAttributesWithRange &Attrs) { + ParsedAttributes &Attrs) { assert(Tok.is(tok::identifier) && "should have identifier"); SourceLocation Loc = Tok.getLocation(); @@ -3127,7 +3110,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, bool EnteringContext = (DSContext == DeclSpecContext::DSC_class || DSContext == DeclSpecContext::DSC_top_level); bool AttrsLastTime = false; - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); // We use Sema's policy to get bool macros right. PrintingPolicy Policy = Actions.getPrintingPolicy(); while (true) { @@ -3371,7 +3354,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, continue; // Eat the scope spec so the identifier is current. ConsumeAnnotationToken(); - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); if (ParseImplicitInt(DS, &SS, TemplateInfo, AS, DSContext, Attrs)) { if (!Attrs.empty()) { AttrsLastTime = true; @@ -3532,7 +3515,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, goto DoneWithDeclSpec; if (Tok.isNot(tok::identifier)) continue; - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); if (ParseImplicitInt(DS, nullptr, TemplateInfo, AS, DSContext, Attrs)) { if (!Attrs.empty()) { AttrsLastTime = true; @@ -4095,7 +4078,7 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, // These are attributes following class specifiers. // To produce better diagnostic, we parse them when // parsing class specifier. - ParsedAttributesWithRange Attributes(AttrFactory); + ParsedAttributes Attributes(AttrFactory); ParseClassSpecifier(Kind, Loc, DS, TemplateInfo, AS, EnteringContext, DSContext, Attributes); @@ -4300,7 +4283,7 @@ void Parser::ParseStructDeclaration( } // Parse leading attributes. - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); MaybeParseCXX11Attributes(Attrs); DS.takeAttributesFrom(Attrs); @@ -4420,7 +4403,7 @@ void Parser::ParseStructUnionBody(SourceLocation RecordLoc, if (Tok.isOneOf(tok::annot_pragma_openmp, tok::annot_attr_openmp)) { // Result can be ignored, because it must be always empty. AccessSpecifier AS = AS_none; - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); (void)ParseOpenMPDeclarativeDirectiveWithExtDecl(AS, Attrs); continue; } @@ -4539,7 +4522,7 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS, } // If attributes exist after tag, parse them. - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); MaybeParseAttributes(PAKM_GNU | PAKM_Declspec | PAKM_CXX11, attrs); SourceLocation ScopedEnumKWLoc; @@ -4942,7 +4925,7 @@ void Parser::ParseEnumBody(SourceLocation StartLoc, Decl *EnumDecl) { SourceLocation IdentLoc = ConsumeToken(); // If attributes exist after the enumerator, parse them. - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); MaybeParseGNUAttributes(attrs); if (standardAttributesAllowed() && isCXX11AttributeSpecifier()) { if (getLangOpts().CPlusPlus) @@ -5623,9 +5606,9 @@ void Parser::ParseTypeQualifierListOpt( Optional> CodeCompletionHandler) { if (standardAttributesAllowed() && (AttrReqs & AR_CXX11AttributesParsed) && isCXX11AttributeSpecifier()) { - ParsedAttributesWithRange attrs(AttrFactory); - ParseCXX11Attributes(attrs); - DS.takeAttributesFrom(attrs); + ParsedAttributes Attrs(AttrFactory); + ParseCXX11Attributes(Attrs); + DS.takeAttributesFrom(Attrs); } SourceLocation EndLoc; @@ -6642,7 +6625,7 @@ void Parser::ParseFunctionDeclarator(Declarator &D, SmallVector DynamicExceptionRanges; ExprResult NoexceptExpr; CachedTokens *ExceptionSpecTokens = nullptr; - ParsedAttributesWithRange FnAttrs(AttrFactory); + ParsedAttributes FnAttrs(AttrFactory); TypeResult TrailingReturnType; SourceLocation TrailingReturnTypeLoc; @@ -6923,10 +6906,9 @@ void Parser::ParseFunctionDeclaratorIdentifierList( /// [C++11] attribute-specifier-seq parameter-declaration /// void Parser::ParseParameterDeclarationClause( - DeclaratorContext DeclaratorCtx, - ParsedAttributes &FirstArgAttrs, - SmallVectorImpl &ParamInfo, - SourceLocation &EllipsisLoc) { + DeclaratorContext DeclaratorCtx, ParsedAttributes &FirstArgAttrs, + SmallVectorImpl &ParamInfo, + SourceLocation &EllipsisLoc) { // Avoid exceeding the maximum function scope depth. // See https://bugs.llvm.org/show_bug.cgi?id=19607 diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp index 77fc504..1bb43f5 100644 --- a/clang/lib/Parse/ParseDeclCXX.cpp +++ b/clang/lib/Parse/ParseDeclCXX.cpp @@ -73,7 +73,7 @@ Parser::DeclGroupPtrTy Parser::ParseNamespace(DeclaratorContext Context, InnerNamespaceInfoList ExtraNSs; SourceLocation FirstNestedInlineLoc; - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); auto ReadAttributes = [&] { bool MoreToParse; @@ -251,9 +251,9 @@ void Parser::ParseInnerNamespace(const InnerNamespaceInfoList &InnerNSs, if (index == InnerNSs.size()) { while (!tryParseMisplacedModuleImport() && Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) { - ParsedAttributesWithRange attrs(AttrFactory); - MaybeParseCXX11Attributes(attrs); - ParseExternalDeclaration(attrs); + ParsedAttributes Attrs(AttrFactory); + MaybeParseCXX11Attributes(Attrs); + ParseExternalDeclaration(Attrs); } // The caller is what called check -- we are simply calling @@ -354,7 +354,7 @@ Decl *Parser::ParseLinkage(ParsingDeclSpec &DS, DeclaratorContext Context) { getCurScope(), DS.getSourceRange().getBegin(), Lang.get(), Tok.is(tok::l_brace) ? Tok.getLocation() : SourceLocation()); - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); MaybeParseCXX11Attributes(attrs); if (Tok.isNot(tok::l_brace)) { @@ -404,9 +404,9 @@ Decl *Parser::ParseLinkage(ParsingDeclSpec &DS, DeclaratorContext Context) { break; LLVM_FALLTHROUGH; default: - ParsedAttributesWithRange attrs(AttrFactory); - MaybeParseCXX11Attributes(attrs); - ParseExternalDeclaration(attrs); + ParsedAttributes Attrs(AttrFactory); + MaybeParseCXX11Attributes(Attrs); + ParseExternalDeclaration(Attrs); continue; } @@ -436,7 +436,7 @@ Decl *Parser::ParseExportDeclaration() { if (Tok.isNot(tok::l_brace)) { // FIXME: Factor out a ParseExternalDeclarationWithAttrs. - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); MaybeParseCXX11Attributes(Attrs); MaybeParseMicrosoftAttributes(Attrs); ParseExternalDeclaration(Attrs); @@ -456,7 +456,7 @@ Decl *Parser::ParseExportDeclaration() { while (!tryParseMisplacedModuleImport() && Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) { - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); MaybeParseCXX11Attributes(Attrs); MaybeParseMicrosoftAttributes(Attrs); ParseExternalDeclaration(Attrs); @@ -469,11 +469,9 @@ Decl *Parser::ParseExportDeclaration() { /// ParseUsingDirectiveOrDeclaration - Parse C++ using using-declaration or /// using-directive. Assumes that current token is 'using'. -Parser::DeclGroupPtrTy -Parser::ParseUsingDirectiveOrDeclaration(DeclaratorContext Context, - const ParsedTemplateInfo &TemplateInfo, - SourceLocation &DeclEnd, - ParsedAttributesWithRange &attrs) { +Parser::DeclGroupPtrTy Parser::ParseUsingDirectiveOrDeclaration( + DeclaratorContext Context, const ParsedTemplateInfo &TemplateInfo, + SourceLocation &DeclEnd, ParsedAttributes &Attrs) { assert(Tok.is(tok::kw_using) && "Not using token"); ObjCDeclContextSwitch ObjCDC(*this); @@ -502,12 +500,12 @@ Parser::ParseUsingDirectiveOrDeclaration(DeclaratorContext Context, << 0 /* directive */ << R << FixItHint::CreateRemoval(R); } - Decl *UsingDir = ParseUsingDirective(Context, UsingLoc, DeclEnd, attrs); + Decl *UsingDir = ParseUsingDirective(Context, UsingLoc, DeclEnd, Attrs); return Actions.ConvertDeclToDeclGroup(UsingDir); } // Otherwise, it must be a using-declaration or an alias-declaration. - return ParseUsingDeclaration(Context, TemplateInfo, UsingLoc, DeclEnd, attrs, + return ParseUsingDeclaration(Context, TemplateInfo, UsingLoc, DeclEnd, Attrs, AS_none); } @@ -682,11 +680,10 @@ bool Parser::ParseUsingDeclarator(DeclaratorContext Context, /// /// elaborated-enum-specifier: /// 'enum' nested-name-specifier[opt] identifier -Parser::DeclGroupPtrTy -Parser::ParseUsingDeclaration( +Parser::DeclGroupPtrTy Parser::ParseUsingDeclaration( DeclaratorContext Context, const ParsedTemplateInfo &TemplateInfo, SourceLocation UsingLoc, SourceLocation &DeclEnd, - ParsedAttributesWithRange &PrefixAttrs, AccessSpecifier AS) { + ParsedAttributes &PrefixAttrs, AccessSpecifier AS) { SourceLocation UELoc; bool InInitStatement = Context == DeclaratorContext::SelectionInit || Context == DeclaratorContext::ForInit; @@ -724,7 +721,7 @@ Parser::ParseUsingDeclaration( // Check for misplaced attributes before the identifier in an // alias-declaration. - ParsedAttributesWithRange MisplacedAttrs(AttrFactory); + ParsedAttributes MisplacedAttrs(AttrFactory); MaybeParseCXX11Attributes(MisplacedAttrs); if (InInitStatement && Tok.isNot(tok::identifier)) @@ -733,7 +730,7 @@ Parser::ParseUsingDeclaration( UsingDeclarator D; bool InvalidDeclarator = ParseUsingDeclarator(Context, D); - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); MaybeParseAttributes(PAKM_GNU | PAKM_CXX11, Attrs); // If we had any misplaced attributes from earlier, this is where they @@ -1471,9 +1468,9 @@ bool Parser::isValidAfterTypeSpecifier(bool CouldBeBitfield) { void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind, SourceLocation StartLoc, DeclSpec &DS, const ParsedTemplateInfo &TemplateInfo, - AccessSpecifier AS, - bool EnteringContext, DeclSpecContext DSC, - ParsedAttributesWithRange &Attributes) { + AccessSpecifier AS, bool EnteringContext, + DeclSpecContext DSC, + ParsedAttributes &Attributes) { DeclSpec::TST TagType; if (TagTokKind == tok::kw_struct) TagType = DeclSpec::TST_struct; @@ -1504,7 +1501,7 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind, (TemplateInfo.Kind != ParsedTemplateInfo::NonTemplate); SuppressAccessChecks diagsFromTag(*this, shouldDelayDiagsInTag); - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); // If attributes exist after tag, parse them. MaybeParseAttributes(PAKM_CXX11 | PAKM_Declspec | PAKM_GNU, attrs); @@ -2163,7 +2160,7 @@ BaseResult Parser::ParseBaseSpecifier(Decl *ClassDecl) { bool IsVirtual = false; SourceLocation StartLoc = Tok.getLocation(); - ParsedAttributesWithRange Attributes(AttrFactory); + ParsedAttributes Attributes(AttrFactory); MaybeParseCXX11Attributes(Attributes); // Parse the 'virtual' keyword. @@ -2680,8 +2677,8 @@ Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS, TemplateInfo, TemplateDiags); } - ParsedAttributesWithRange attrs(AttrFactory); - ParsedAttributesViewWithRange FnAttrs; + ParsedAttributes attrs(AttrFactory); + ParsedAttributesView FnAttrs; // Optional C++11 attribute-specifier MaybeParseCXX11Attributes(attrs); @@ -3176,7 +3173,7 @@ void Parser::SkipCXXMemberSpecification(SourceLocation RecordLoc, // Diagnose any C++11 attributes after 'final' keyword. // We deliberately discard these attributes. - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); CheckMisplacedCXX11Attribute(Attrs, AttrFixitLoc); // This can only happen if we had malformed misplaced attributes; @@ -3216,14 +3213,15 @@ void Parser::SkipCXXMemberSpecification(SourceLocation RecordLoc, T.skipToEnd(); // Parse and discard any trailing attributes. - ParsedAttributes Attrs(AttrFactory); - if (Tok.is(tok::kw___attribute)) + if (Tok.is(tok::kw___attribute)) { + ParsedAttributes Attrs(AttrFactory); MaybeParseGNUAttributes(Attrs); + } } Parser::DeclGroupPtrTy Parser::ParseCXXClassMemberDeclarationWithPragmas( - AccessSpecifier &AS, ParsedAttributesWithRange &AccessAttrs, - DeclSpec::TST TagType, Decl *TagDecl) { + AccessSpecifier &AS, ParsedAttributes &AccessAttrs, DeclSpec::TST TagType, + Decl *TagDecl) { ParenBraceBracketBalancer BalancerRAIIObj(*this); switch (Tok.getKind()) { @@ -3333,7 +3331,7 @@ Parser::DeclGroupPtrTy Parser::ParseCXXClassMemberDeclarationWithPragmas( /// void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc, SourceLocation AttrFixitLoc, - ParsedAttributesWithRange &Attrs, + ParsedAttributes &Attrs, unsigned TagType, Decl *TagDecl) { assert((TagType == DeclSpec::TST_struct || TagType == DeclSpec::TST_interface || @@ -3517,7 +3515,7 @@ void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc, CurAS = AS_private; else CurAS = AS_public; - ParsedAttributesWithRange AccessAttrs(AttrFactory); + ParsedAttributes AccessAttrs(AttrFactory); if (TagDecl) { // While we still have something to read, read the member-declarations. @@ -4370,7 +4368,7 @@ bool Parser::ParseCXX11AttributeArgs(IdentifierInfo *AttrName, return true; } -/// ParseCXX11AttributeSpecifier - Parse a C++11 or C2x attribute-specifier. +/// Parse a C++11 or C2x attribute-specifier. /// /// [C++11] attribute-specifier: /// '[' '[' attribute-list ']' ']' @@ -4523,17 +4521,17 @@ void Parser::ParseCXX11AttributeSpecifierInternal(ParsedAttributes &Attrs, /// /// attribute-specifier-seq: /// attribute-specifier-seq[opt] attribute-specifier -void Parser::ParseCXX11Attributes(ParsedAttributesWithRange &attrs) { +void Parser::ParseCXX11Attributes(ParsedAttributes &Attrs) { assert(standardAttributesAllowed()); SourceLocation StartLoc = Tok.getLocation(); SourceLocation EndLoc = StartLoc; do { - ParseCXX11AttributeSpecifier(attrs, &EndLoc); + ParseCXX11AttributeSpecifier(Attrs, &EndLoc); } while (isCXX11AttributeSpecifier()); - attrs.Range = SourceRange(StartLoc, EndLoc); + Attrs.Range = SourceRange(StartLoc, EndLoc); } void Parser::DiagnoseAndSkipCXX11Attributes() { @@ -4666,7 +4664,7 @@ void Parser::ParseMicrosoftUuidAttributeArgs(ParsedAttributes &Attrs) { /// [MS] ms-attribute-seq: /// ms-attribute[opt] /// ms-attribute ms-attribute-seq -void Parser::ParseMicrosoftAttributes(ParsedAttributesWithRange &Attrs) { +void Parser::ParseMicrosoftAttributes(ParsedAttributes &Attrs) { assert(Tok.is(tok::l_square) && "Not a Microsoft attribute list"); SourceLocation StartLoc = Tok.getLocation(); diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp index 7c93df3..7b66f6c 100644 --- a/clang/lib/Parse/ParseExprCXX.cpp +++ b/clang/lib/Parse/ParseExprCXX.cpp @@ -1252,7 +1252,7 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer( TemplateParameterDepthRAII CurTemplateDepthTracker(TemplateParameterDepth); Actions.PushLambdaScope(); - ParsedAttributesWithRange Attr(AttrFactory); + ParsedAttributes Attr(AttrFactory); if (getLangOpts().CUDA) { // In CUDA code, GNU attributes are allowed to appear immediately after the // "[...]", even if there is no "(...)" before the lambda body. @@ -1913,7 +1913,7 @@ Parser::ParseCXXTypeConstructExpression(const DeclSpec &DS) { Parser::DeclGroupPtrTy Parser::ParseAliasDeclarationInInitStatement(DeclaratorContext Context, - ParsedAttributesWithRange &Attrs) { + ParsedAttributes &Attrs) { assert(Tok.is(tok::kw_using) && "Expected using"); assert((Context == DeclaratorContext::ForInit || Context == DeclaratorContext::SelectionInit) && @@ -1992,7 +1992,7 @@ Parser::ParseCXXCondition(StmtResult *InitStmt, SourceLocation Loc, return Sema::ConditionError(); } - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); MaybeParseCXX11Attributes(attrs); const auto WarnOnInit = [this, &CK] { diff --git a/clang/lib/Parse/ParseObjc.cpp b/clang/lib/Parse/ParseObjc.cpp index 08f131e..719513e 100644 --- a/clang/lib/Parse/ParseObjc.cpp +++ b/clang/lib/Parse/ParseObjc.cpp @@ -45,8 +45,7 @@ void Parser::MaybeSkipAttributes(tok::ObjCKeywordKind Kind) { /// [OBJC] objc-protocol-definition /// [OBJC] objc-method-definition /// [OBJC] '@' 'end' -Parser::DeclGroupPtrTy -Parser::ParseObjCAtDirectives(ParsedAttributesWithRange &Attrs) { +Parser::DeclGroupPtrTy Parser::ParseObjCAtDirectives(ParsedAttributes &Attrs) { SourceLocation AtLoc = ConsumeToken(); // the "@" if (Tok.is(tok::code_completion)) { @@ -651,7 +650,7 @@ void Parser::ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey, if (Tok.is(tok::r_brace)) break; - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); // Since we call ParseDeclarationOrFunctionDefinition() instead of // ParseExternalDeclaration() below (so that this doesn't parse nested @@ -2217,7 +2216,7 @@ Parser::ParseObjCAtImplementationDeclaration(SourceLocation AtLoc, { ObjCImplParsingDataRAII ObjCImplParsing(*this, ObjCImpDecl); while (!ObjCImplParsing.isFinished() && !isEofOrEom()) { - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); MaybeParseCXX11Attributes(attrs); if (DeclGroupPtrTy DGP = ParseExternalDeclaration(attrs)) { DeclGroupRef DG = DGP.get(); diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp index 3cb3010..d2ba4d6 100644 --- a/clang/lib/Parse/ParseOpenMP.cpp +++ b/clang/lib/Parse/ParseOpenMP.cpp @@ -2025,7 +2025,7 @@ void Parser::ParseOMPEndDeclareTargetDirective(OpenMPDirectiveKind BeginDKind, /// annot_pragma_openmp_end /// Parser::DeclGroupPtrTy Parser::ParseOpenMPDeclarativeDirectiveWithExtDecl( - AccessSpecifier &AS, ParsedAttributesWithRange &Attrs, bool Delayed, + AccessSpecifier &AS, ParsedAttributes &Attrs, bool Delayed, DeclSpec::TST TagType, Decl *Tag) { assert(Tok.isOneOf(tok::annot_pragma_openmp, tok::annot_attr_openmp) && "Not an OpenMP directive!"); diff --git a/clang/lib/Parse/ParsePragma.cpp b/clang/lib/Parse/ParsePragma.cpp index eb83870..75577f8 100644 --- a/clang/lib/Parse/ParsePragma.cpp +++ b/clang/lib/Parse/ParsePragma.cpp @@ -341,7 +341,7 @@ struct PragmaAttributeHandler : public PragmaHandler { Token &FirstToken) override; /// A pool of attributes that were parsed in \#pragma clang attribute. - ParsedAttributesWithRange AttributesForPragmaAttribute; + ParsedAttributes AttributesForPragmaAttribute; }; struct PragmaMaxTokensHereHandler : public PragmaHandler { @@ -1365,13 +1365,12 @@ bool Parser::HandlePragmaLoopHint(LoopHint &Hint) { namespace { struct PragmaAttributeInfo { enum ActionType { Push, Pop, Attribute }; - ParsedAttributesWithRange &Attributes; + ParsedAttributes &Attributes; ActionType Action; const IdentifierInfo *Namespace = nullptr; ArrayRef Tokens; - PragmaAttributeInfo(ParsedAttributesWithRange &Attributes) - : Attributes(Attributes) {} + PragmaAttributeInfo(ParsedAttributes &Attributes) : Attributes(Attributes) {} }; #include "clang/Parse/AttrSubMatchRulesParserStringSwitches.inc" @@ -1654,7 +1653,7 @@ void Parser::HandlePragmaAttribute() { /*IsReinject=*/false); ConsumeAnnotationToken(); - ParsedAttributesWithRange &Attrs = Info->Attributes; + ParsedAttributes &Attrs = Info->Attributes; Attrs.clearListOnly(); auto SkipToEnd = [this]() { diff --git a/clang/lib/Parse/ParseStmt.cpp b/clang/lib/Parse/ParseStmt.cpp index 1a1610b..d2c88ce 100644 --- a/clang/lib/Parse/ParseStmt.cpp +++ b/clang/lib/Parse/ParseStmt.cpp @@ -105,7 +105,7 @@ Parser::ParseStatementOrDeclaration(StmtVector &Stmts, // statement are different from [[]] attributes that follow an __attribute__ // at the start of the statement. Thus, we're not using MaybeParseAttributes // here because we don't want to allow arbitrary orderings. - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); MaybeParseCXX11Attributes(Attrs, /*MightBeObjCMessageSend*/ true); if (getLangOpts().OpenCL) MaybeParseGNUAttributes(Attrs); @@ -158,7 +158,7 @@ private: StmtResult Parser::ParseStatementOrDeclarationAfterAttributes( StmtVector &Stmts, ParsedStmtContext StmtCtx, - SourceLocation *TrailingElseLoc, ParsedAttributesWithRange &Attrs) { + SourceLocation *TrailingElseLoc, ParsedAttributes &Attrs) { const char *SemiError = nullptr; StmtResult Res; SourceLocation GNUAttributeLoc; @@ -624,7 +624,7 @@ StmtResult Parser::ParseSEHLeaveStatement() { /// identifier ':' statement /// [GNU] identifier ':' attributes[opt] statement /// -StmtResult Parser::ParseLabeledStatement(ParsedAttributesWithRange &attrs, +StmtResult Parser::ParseLabeledStatement(ParsedAttributes &Attrs, ParsedStmtContext StmtCtx) { assert(Tok.is(tok::identifier) && Tok.getIdentifierInfo() && "Not an identifier!"); @@ -644,7 +644,7 @@ StmtResult Parser::ParseLabeledStatement(ParsedAttributesWithRange &attrs, // Read label attributes, if present. StmtResult SubStmt; if (Tok.is(tok::kw___attribute)) { - ParsedAttributesWithRange TempAttrs(AttrFactory); + ParsedAttributes TempAttrs(AttrFactory); ParseGNUAttributes(TempAttrs); // In C++, GNU attributes only apply to the label if they are followed by a @@ -655,7 +655,7 @@ StmtResult Parser::ParseLabeledStatement(ParsedAttributesWithRange &attrs, // and followed by a semicolon, GCC will reject (it appears to parse the // attributes as part of a statement in that case). That looks like a bug. if (!getLangOpts().CPlusPlus || Tok.is(tok::semi)) - attrs.takeAllFrom(TempAttrs); + Attrs.takeAllFrom(TempAttrs); else { StmtVector Stmts; SubStmt = ParseStatementOrDeclarationAfterAttributes(Stmts, StmtCtx, @@ -675,8 +675,8 @@ StmtResult Parser::ParseLabeledStatement(ParsedAttributesWithRange &attrs, LabelDecl *LD = Actions.LookupOrCreateLabel(IdentTok.getIdentifierInfo(), IdentTok.getLocation()); - Actions.ProcessDeclAttributeList(Actions.CurScope, LD, attrs); - attrs.clear(); + Actions.ProcessDeclAttributeList(Actions.CurScope, LD, Attrs); + Attrs.clear(); return Actions.ActOnLabelStmt(IdentTok.getLocation(), LD, ColonLoc, SubStmt.get()); @@ -1118,7 +1118,7 @@ StmtResult Parser::ParseCompoundStatementBody(bool isStmtExpr) { while (Tok.is(tok::kw___extension__)) ConsumeToken(); - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); MaybeParseCXX11Attributes(attrs, /*MightBeObjCMessageSend*/ true); // If this is the start of a declaration, parse it as such. @@ -1924,7 +1924,7 @@ StmtResult Parser::ParseForStatement(SourceLocation *TrailingElseLoc) { return StmtError(); } - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); MaybeParseCXX11Attributes(attrs); SourceLocation EmptyInitStmtSemiLoc; @@ -1955,8 +1955,8 @@ StmtResult Parser::ParseForStatement(SourceLocation *TrailingElseLoc) { ? FixItHint::CreateInsertion(Loc, "auto &&") : FixItHint()); - ForRangeInfo.LoopVar = Actions.ActOnCXXForRangeIdentifier( - getCurScope(), Loc, Name, attrs, attrs.Range.getEnd()); + ForRangeInfo.LoopVar = + Actions.ActOnCXXForRangeIdentifier(getCurScope(), Loc, Name, attrs); } else if (isForInitDeclaration()) { // for (int X = 4; ParenBraceBracketBalancer BalancerRAIIObj(*this); @@ -2325,9 +2325,9 @@ StmtResult Parser::ParseReturnStatement() { StmtResult Parser::ParsePragmaLoopHint(StmtVector &Stmts, ParsedStmtContext StmtCtx, SourceLocation *TrailingElseLoc, - ParsedAttributesWithRange &Attrs) { + ParsedAttributes &Attrs) { // Create temporary attribute list. - ParsedAttributesWithRange TempAttrs(AttrFactory); + ParsedAttributes TempAttrs(AttrFactory); SourceLocation StartLoc = Tok.getLocation(); @@ -2580,7 +2580,7 @@ StmtResult Parser::ParseCXXCatchBlock(bool FnCatch) { // without default arguments. Decl *ExceptionDecl = nullptr; if (Tok.isNot(tok::ellipsis)) { - ParsedAttributesWithRange Attributes(AttrFactory); + ParsedAttributes Attributes(AttrFactory); MaybeParseCXX11Attributes(Attributes); DeclSpec DS(AttrFactory); diff --git a/clang/lib/Parse/ParseTemplate.cpp b/clang/lib/Parse/ParseTemplate.cpp index 0d8ab6a..211d1a3 100644 --- a/clang/lib/Parse/ParseTemplate.cpp +++ b/clang/lib/Parse/ParseTemplate.cpp @@ -204,7 +204,7 @@ Decl *Parser::ParseSingleDeclarationAfterTemplate( return nullptr; } - ParsedAttributesWithRange prefixAttrs(AttrFactory); + ParsedAttributes prefixAttrs(AttrFactory); MaybeParseCXX11Attributes(prefixAttrs); if (Tok.is(tok::kw_using)) { diff --git a/clang/lib/Parse/ParseTentative.cpp b/clang/lib/Parse/ParseTentative.cpp index 817e181..512993a 100644 --- a/clang/lib/Parse/ParseTentative.cpp +++ b/clang/lib/Parse/ParseTentative.cpp @@ -1913,7 +1913,7 @@ Parser::TryParseParameterDeclarationClause(bool *InvalidAsDeclaration, /*OuterMightBeMessageSend*/true)) return TPResult::True; - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); MaybeParseMicrosoftAttributes(attrs); // decl-specifier-seq diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp index bc5b504..8bba3d4 100644 --- a/clang/lib/Parse/Parser.cpp +++ b/clang/lib/Parse/Parser.cpp @@ -721,7 +721,7 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result, break; } - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); MaybeParseCXX11Attributes(attrs); Result = ParseExternalDeclaration(attrs); @@ -764,9 +764,8 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result, /// /// [Modules-TS] module-import-declaration /// -Parser::DeclGroupPtrTy -Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, - ParsingDeclSpec *DS) { +Parser::DeclGroupPtrTy Parser::ParseExternalDeclaration(ParsedAttributes &Attrs, + ParsingDeclSpec *DS) { DestroyTemplateIdAnnotationsRAIIObj CleanupRAII(*this); ParenBraceBracketBalancer BalancerRAIIObj(*this); @@ -820,7 +819,7 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, case tok::annot_attr_openmp: case tok::annot_pragma_openmp: { AccessSpecifier AS = AS_none; - return ParseOpenMPDeclarativeDirectiveWithExtDecl(AS, attrs); + return ParseOpenMPDeclarativeDirectiveWithExtDecl(AS, Attrs); } case tok::annot_pragma_ms_pointers_to_members: HandlePragmaMSPointersToMembers(); @@ -840,7 +839,7 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, case tok::semi: // Either a C++11 empty-declaration or attribute-declaration. SingleDecl = - Actions.ActOnEmptyDeclaration(getCurScope(), attrs, Tok.getLocation()); + Actions.ActOnEmptyDeclaration(getCurScope(), Attrs, Tok.getLocation()); ConsumeExtraSemi(OutsideFunction); break; case tok::r_brace: @@ -854,10 +853,10 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, // __extension__ silences extension warnings in the subexpression. ExtensionRAIIObject O(Diags); // Use RAII to do this. ConsumeToken(); - return ParseExternalDeclaration(attrs); + return ParseExternalDeclaration(Attrs); } case tok::kw_asm: { - ProhibitAttributes(attrs); + ProhibitAttributes(Attrs); SourceLocation StartLoc = Tok.getLocation(); SourceLocation EndLoc; @@ -882,7 +881,7 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, break; } case tok::at: - return ParseObjCAtDirectives(attrs); + return ParseObjCAtDirectives(Attrs); case tok::minus: case tok::plus: if (!getLangOpts().ObjC) { @@ -908,13 +907,13 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, Sema::ModuleImportState IS = Sema::ModuleImportState::NotACXX20Module; if (getLangOpts().CPlusPlusModules) { llvm_unreachable("not expecting a c++20 import here"); - ProhibitAttributes(attrs); + ProhibitAttributes(Attrs); } SingleDecl = ParseModuleImport(SourceLocation(), IS); } break; case tok::kw_export: if (getLangOpts().CPlusPlusModules || getLangOpts().ModulesTS) { - ProhibitAttributes(attrs); + ProhibitAttributes(Attrs); SingleDecl = ParseExportDeclaration(); break; } @@ -930,7 +929,7 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, // A function definition cannot start with any of these keywords. { SourceLocation DeclEnd; - return ParseDeclaration(DeclaratorContext::File, DeclEnd, attrs); + return ParseDeclaration(DeclaratorContext::File, DeclEnd, Attrs); } case tok::kw_static: @@ -940,7 +939,7 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, Diag(ConsumeToken(), diag::warn_static_inline_explicit_inst_ignored) << 0; SourceLocation DeclEnd; - return ParseDeclaration(DeclaratorContext::File, DeclEnd, attrs); + return ParseDeclaration(DeclaratorContext::File, DeclEnd, Attrs); } goto dont_know; @@ -951,7 +950,7 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, // Inline namespaces. Allowed as an extension even in C++03. if (NextKind == tok::kw_namespace) { SourceLocation DeclEnd; - return ParseDeclaration(DeclaratorContext::File, DeclEnd, attrs); + return ParseDeclaration(DeclaratorContext::File, DeclEnd, Attrs); } // Parse (then ignore) 'inline' prior to a template instantiation. This is @@ -960,7 +959,7 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, Diag(ConsumeToken(), diag::warn_static_inline_explicit_inst_ignored) << 1; SourceLocation DeclEnd; - return ParseDeclaration(DeclaratorContext::File, DeclEnd, attrs); + return ParseDeclaration(DeclaratorContext::File, DeclEnd, Attrs); } } goto dont_know; @@ -975,7 +974,7 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, diag::ext_extern_template) << SourceRange(ExternLoc, TemplateLoc); SourceLocation DeclEnd; return Actions.ConvertDeclToDeclGroup(ParseExplicitInstantiation( - DeclaratorContext::File, ExternLoc, TemplateLoc, DeclEnd, attrs)); + DeclaratorContext::File, ExternLoc, TemplateLoc, DeclEnd, Attrs)); } goto dont_know; @@ -996,7 +995,7 @@ Parser::ParseExternalDeclaration(ParsedAttributesWithRange &attrs, return nullptr; } // We can't tell whether this is a function-definition or declaration yet. - return ParseDeclarationOrFunctionDefinition(attrs, DS); + return ParseDeclarationOrFunctionDefinition(Attrs, DS); } // This routine returns a DeclGroup, if the thing we parsed only contains a @@ -1060,10 +1059,8 @@ bool Parser::isStartOfFunctionDefinition(const ParsingDeclarator &Declarator) { /// [OMP] threadprivate-directive /// [OMP] allocate-directive [TODO] /// -Parser::DeclGroupPtrTy -Parser::ParseDeclOrFunctionDefInternal(ParsedAttributesWithRange &attrs, - ParsingDeclSpec &DS, - AccessSpecifier AS) { +Parser::DeclGroupPtrTy Parser::ParseDeclOrFunctionDefInternal( + ParsedAttributes &Attrs, ParsingDeclSpec &DS, AccessSpecifier AS) { MaybeParseMicrosoftAttributes(DS.getAttributes()); // Parse the common declaration-specifiers piece. ParseDeclarationSpecifiers(DS, ParsedTemplateInfo(), AS, @@ -1102,7 +1099,7 @@ Parser::ParseDeclOrFunctionDefInternal(ParsedAttributesWithRange &attrs, ? DS.getTypeSpecTypeLoc().getLocWithOffset( LengthOfTSTToken(DS.getTypeSpecType())) : SourceLocation(); - ProhibitAttributes(attrs, CorrectLocationForAttributes); + ProhibitAttributes(Attrs, CorrectLocationForAttributes); ConsumeToken(); RecordDecl *AnonRecord = nullptr; Decl *TheDecl = Actions.ParsedFreeStandingDeclSpec(getCurScope(), AS_none, @@ -1115,7 +1112,7 @@ Parser::ParseDeclOrFunctionDefInternal(ParsedAttributesWithRange &attrs, return Actions.ConvertDeclToDeclGroup(TheDecl); } - DS.takeAttributesFrom(attrs); + DS.takeAttributesFrom(Attrs); // ObjC2 allows prefix attributes on class interfaces and protocols. // FIXME: This still needs better diagnostics. We should only accept @@ -1161,12 +1158,10 @@ Parser::ParseDeclOrFunctionDefInternal(ParsedAttributesWithRange &attrs, return ParseDeclGroup(DS, DeclaratorContext::File); } -Parser::DeclGroupPtrTy -Parser::ParseDeclarationOrFunctionDefinition(ParsedAttributesWithRange &attrs, - ParsingDeclSpec *DS, - AccessSpecifier AS) { +Parser::DeclGroupPtrTy Parser::ParseDeclarationOrFunctionDefinition( + ParsedAttributes &Attrs, ParsingDeclSpec *DS, AccessSpecifier AS) { if (DS) { - return ParseDeclOrFunctionDefInternal(attrs, *DS, AS); + return ParseDeclOrFunctionDefInternal(Attrs, *DS, AS); } else { ParsingDeclSpec PDS(*this); // Must temporarily exit the objective-c container scope for @@ -1174,7 +1169,7 @@ Parser::ParseDeclarationOrFunctionDefinition(ParsedAttributesWithRange &attrs, // afterwards. ObjCDeclContextSwitch ObjCDC(*this); - return ParseDeclOrFunctionDefInternal(attrs, PDS, AS); + return ParseDeclOrFunctionDefInternal(Attrs, PDS, AS); } } @@ -2292,9 +2287,9 @@ void Parser::ParseMicrosoftIfExistsExternalDeclaration() { // Parse the declarations. // FIXME: Support module import within __if_exists? while (Tok.isNot(tok::r_brace) && !isEofOrEom()) { - ParsedAttributesWithRange attrs(AttrFactory); - MaybeParseCXX11Attributes(attrs); - DeclGroupPtrTy Result = ParseExternalDeclaration(attrs); + ParsedAttributes Attrs(AttrFactory); + MaybeParseCXX11Attributes(Attrs); + DeclGroupPtrTy Result = ParseExternalDeclaration(Attrs); if (Result && !getCurScope()->getParent()) Actions.getASTConsumer().HandleTopLevelDecl(Result.get()); } @@ -2380,7 +2375,7 @@ Parser::ParseModuleDecl(Sema::ModuleImportState &ImportState) { } // We don't support any module attributes yet; just parse them and diagnose. - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); MaybeParseCXX11Attributes(Attrs); ProhibitCXX11Attributes(Attrs, diag::err_attribute_not_module_attr); @@ -2446,7 +2441,7 @@ Decl *Parser::ParseModuleImport(SourceLocation AtLoc, return nullptr; } - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); MaybeParseCXX11Attributes(Attrs); // We don't support any module import attributes yet. ProhibitCXX11Attributes(Attrs, diag::err_attribute_not_import_attr); diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index ad05e9a..8d46d60 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -13147,11 +13147,9 @@ void Sema::ActOnCXXForRangeDecl(Decl *D) { } } -StmtResult -Sema::ActOnCXXForRangeIdentifier(Scope *S, SourceLocation IdentLoc, - IdentifierInfo *Ident, - ParsedAttributes &Attrs, - SourceLocation AttrEnd) { +StmtResult Sema::ActOnCXXForRangeIdentifier(Scope *S, SourceLocation IdentLoc, + IdentifierInfo *Ident, + ParsedAttributes &Attrs) { // C++1y [stmt.iter]p1: // A range-based for statement of the form // for ( for-range-identifier : for-range-initializer ) statement @@ -13166,7 +13164,7 @@ Sema::ActOnCXXForRangeIdentifier(Scope *S, SourceLocation IdentLoc, Declarator D(DS, DeclaratorContext::ForInit); D.SetIdentifier(Ident, IdentLoc); - D.takeAttributes(Attrs, AttrEnd); + D.takeAttributes(Attrs); D.AddTypeInfo(DeclaratorChunk::getReference(0, IdentLoc, /*lvalue*/ false), IdentLoc); @@ -13174,7 +13172,8 @@ Sema::ActOnCXXForRangeIdentifier(Scope *S, SourceLocation IdentLoc, cast(Var)->setCXXForRangeDecl(true); FinalizeDeclaration(Var); return ActOnDeclStmt(FinalizeDeclaratorGroup(S, DS, Var), IdentLoc, - AttrEnd.isValid() ? AttrEnd : IdentLoc); + Attrs.Range.getEnd().isValid() ? Attrs.Range.getEnd() + : IdentLoc); } void Sema::CheckCompleteVariableDeclaration(VarDecl *var) { diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index 0b5440c..48fb642 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -2641,12 +2641,11 @@ Sema::CheckBaseSpecifier(CXXRecordDecl *Class, /// example: /// class foo : public bar, virtual private baz { /// 'public bar' and 'virtual private baz' are each base-specifiers. -BaseResult -Sema::ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange, - ParsedAttributes &Attributes, - bool Virtual, AccessSpecifier Access, - ParsedType basetype, SourceLocation BaseLoc, - SourceLocation EllipsisLoc) { +BaseResult Sema::ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange, + const ParsedAttributesView &Attributes, + bool Virtual, AccessSpecifier Access, + ParsedType basetype, SourceLocation BaseLoc, + SourceLocation EllipsisLoc) { if (!classdecl) return true; diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index e23fd23..069ba43 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -587,7 +587,7 @@ StmtResult Sema::BuildAttributedStmt(SourceLocation AttrsLoc, return AttributedStmt::Create(Context, AttrsLoc, Attrs, SubStmt); } -StmtResult Sema::ActOnAttributedStmt(const ParsedAttributesWithRange &Attrs, +StmtResult Sema::ActOnAttributedStmt(const ParsedAttributes &Attrs, Stmt *SubStmt) { SmallVector SemanticAttrs; ProcessStmtAttributes(SubStmt, Attrs, SemanticAttrs); diff --git a/clang/lib/Sema/SemaStmtAttr.cpp b/clang/lib/Sema/SemaStmtAttr.cpp index 0277627..b03c055 100644 --- a/clang/lib/Sema/SemaStmtAttr.cpp +++ b/clang/lib/Sema/SemaStmtAttr.cpp @@ -495,8 +495,7 @@ static Attr *ProcessStmtAttribute(Sema &S, Stmt *St, const ParsedAttr &A, } } -void Sema::ProcessStmtAttributes(Stmt *S, - const ParsedAttributesWithRange &InAttrs, +void Sema::ProcessStmtAttributes(Stmt *S, const ParsedAttributes &InAttrs, SmallVectorImpl &OutAttrs) { for (const ParsedAttr &AL : InAttrs) { if (const Attr *A = ProcessStmtAttribute(*this, S, AL, InAttrs.Range)) diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 419ccbb..d9f7995 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -368,7 +368,8 @@ enum TypeAttrLocation { }; static void processTypeAttrs(TypeProcessingState &state, QualType &type, - TypeAttrLocation TAL, ParsedAttributesView &attrs); + TypeAttrLocation TAL, + const ParsedAttributesView &attrs); static bool handleFunctionTypeAttr(TypeProcessingState &state, ParsedAttr &attr, QualType &type); @@ -8149,7 +8150,12 @@ static bool isAddressSpaceKind(const ParsedAttr &attr) { static void processTypeAttrs(TypeProcessingState &state, QualType &type, TypeAttrLocation TAL, - ParsedAttributesView &attrs) { + const ParsedAttributesView &attrs) { + + state.setParsedNoDeref(false); + if (attrs.empty()) + return; + // Scan through and apply attributes to this type where it makes sense. Some // attributes (such as __address_space__, __vector_size__, etc) apply to the // type, but others can be present in the type specifiers even though they @@ -8159,9 +8165,6 @@ static void processTypeAttrs(TypeProcessingState &state, QualType &type, // sure we visit every element once. Copy the attributes list, and iterate // over that. ParsedAttributesView AttrsCopy{attrs}; - - state.setParsedNoDeref(false); - for (ParsedAttr &attr : AttrsCopy) { // Skip attributes that were marked to be invalid. diff --git a/clang/test/SemaOpenCL/address-spaces.cl b/clang/test/SemaOpenCL/address-spaces.cl index 21992d9..5fe79ea 100644 --- a/clang/test/SemaOpenCL/address-spaces.cl +++ b/clang/test/SemaOpenCL/address-spaces.cl @@ -258,7 +258,7 @@ __kernel void k() { void func_multiple_addr2(void) { typedef __private int private_int_t; - __private __attribute__((opencl_global)) int var1; // expected-error {{multiple address spaces specified for type}} \ + __attribute__((opencl_global)) __private int var1; // expected-error {{multiple address spaces specified for type}} \ // expected-error {{function scope variable cannot be declared in global address space}} __private __attribute__((opencl_global)) int *var2; // expected-error {{multiple address spaces specified for type}} __attribute__((opencl_global)) private_int_t var3; // expected-error {{multiple address spaces specified for type}} -- 2.7.4