Index: clang/include/clang/Parse/Parser.h =================================================================== --- clang/include/clang/Parse/Parser.h +++ clang/include/clang/Parse/Parser.h @@ -1544,7 +1544,7 @@ }; NamedDecl *ParseCXXInlineMethodDef(AccessSpecifier AS, - ParsedAttributes &AccessAttrs, + const ParsedAttributesView &AccessAttrs, ParsingDeclarator &D, const ParsedTemplateInfo &TemplateInfo, const VirtSpecifiers &VS, @@ -1580,15 +1580,15 @@ //===--------------------------------------------------------------------===// // 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 @@ // 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ } bool DiagnoseProhibitedCXX11Attribute(); - void CheckMisplacedCXX11Attribute(ParsedAttributesWithRange &Attrs, + void CheckMisplacedCXX11Attribute(ParsedAttributes &Attrs, SourceLocation CorrectLocation) { if (!standardAttributesAllowed()) return; @@ -2609,14 +2605,14 @@ 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 @@ Attrs.clear(); } - void ProhibitAttributes(ParsedAttributesViewWithRange &Attrs, + void ProhibitAttributes(ParsedAttributesView &Attrs, SourceLocation FixItLoc = SourceLocation()) { if (Attrs.Range.isInvalid()) return; @@ -2637,8 +2633,7 @@ // 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 @@ /// 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 @@ /// __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,30 +2696,14 @@ 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; @@ -2749,20 +2711,7 @@ 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, @@ -2790,25 +2739,17 @@ } 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 @@ 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 @@ 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); @@ -2914,11 +2855,12 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ /// 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); Index: clang/include/clang/Sema/DeclSpec.h =================================================================== --- clang/include/clang/Sema/DeclSpec.h +++ clang/include/clang/Sema/DeclSpec.h @@ -368,7 +368,7 @@ ExplicitSpecifier FS_explicit_specifier; // attributes. - ParsedAttributesWithRange Attrs; + ParsedAttributes Attrs; // Scope specifier for the type spec, if applicable. CXXScopeSpec TypeScope; @@ -786,7 +786,7 @@ /// 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 @@ /// __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; } Index: clang/include/clang/Sema/ParsedAttr.h =================================================================== --- clang/include/clang/Sema/ParsedAttr.h +++ clang/include/clang/Sema/ParsedAttr.h @@ -900,6 +900,7 @@ 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]; } @@ -1014,6 +1015,7 @@ void clear() { clearListOnly(); pool.clear(); + Range = SourceRange(); } /// Add attribute with expression arguments. @@ -1097,27 +1099,6 @@ 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 { Index: clang/include/clang/Sema/Sema.h =================================================================== --- clang/include/clang/Sema/Sema.h +++ clang/include/clang/Sema/Sema.h @@ -2867,8 +2867,7 @@ 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 @@ /// 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 @@ 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 @@ 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); Index: clang/lib/Parse/ParseCXXInlineMethods.cpp =================================================================== --- clang/lib/Parse/ParseCXXInlineMethods.cpp +++ clang/lib/Parse/ParseCXXInlineMethods.cpp @@ -22,9 +22,9 @@ /// 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 @@ ConsumeAnyToken(/*ConsumeCodeCompletionTok=*/true); ParsedAttributes Attrs(AttrFactory); - SourceLocation endLoc; if (LA.Decls.size() > 0) { Decl *D = LA.Decls[0]; @@ -743,7 +742,7 @@ 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 @@ } 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 @@ 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; } Index: clang/lib/Parse/ParseDecl.cpp =================================================================== --- clang/lib/Parse/ParseDecl.cpp +++ clang/lib/Parse/ParseDecl.cpp @@ -40,10 +40,8 @@ /// 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 @@ 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 @@ /// ',' 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 @@ void Parser::ParseAttributeWithTypeArg(IdentifierInfo &AttrName, SourceLocation AttrNameLoc, ParsedAttributes &Attrs, - SourceLocation *EndLoc, IdentifierInfo *ScopeName, SourceLocation ScopeLoc, ParsedAttr::Syntax Syntax) { @@ -501,14 +497,10 @@ /// 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 @@ ScopeName, ScopeLoc, Syntax); return; } else if (attributeIsTypeArgAttr(*AttrName)) { - ParseAttributeWithTypeArg(*AttrName, AttrNameLoc, Attrs, EndLoc, ScopeName, + ParseAttributeWithTypeArg(*AttrName, AttrNameLoc, Attrs, ScopeName, ScopeLoc, Syntax); return; } @@ -745,7 +737,7 @@ /// [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!"); @@ -1427,13 +1419,10 @@ /// 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()) { @@ -1502,7 +1491,6 @@ Syntax); } - void Parser::ParseSwiftNewTypeAttribute( IdentifierInfo &AttrName, SourceLocation AttrNameLoc, ParsedAttributes &Attrs, SourceLocation *EndLoc, IdentifierInfo *ScopeName, @@ -1544,7 +1532,6 @@ ScopeName, ScopeLoc, Args, llvm::array_lengthof(Args), Syntax); } - void Parser::ParseTypeTagForDatatypeAttribute(IdentifierInfo &AttrName, SourceLocation AttrNameLoc, ParsedAttributes &Attrs, @@ -1645,7 +1632,7 @@ /// 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)); @@ -1671,8 +1658,8 @@ 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. @@ -1709,7 +1696,7 @@ } } -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(); @@ -1723,7 +1710,7 @@ // 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) @@ -1760,10 +1747,10 @@ /// [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. @@ -1773,31 +1760,31 @@ 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); } @@ -1828,9 +1815,8 @@ /// 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); @@ -2628,7 +2614,7 @@ 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(); @@ -3125,7 +3111,7 @@ 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) { @@ -3369,7 +3355,7 @@ 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; @@ -3530,7 +3516,7 @@ 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; @@ -4093,7 +4079,7 @@ // 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); @@ -4298,7 +4284,7 @@ } // Parse leading attributes. - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); MaybeParseCXX11Attributes(Attrs); DS.takeAttributesFrom(Attrs); @@ -4418,7 +4404,7 @@ 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; } @@ -4537,7 +4523,7 @@ } // If attributes exist after tag, parse them. - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); MaybeParseAttributes(PAKM_GNU | PAKM_Declspec | PAKM_CXX11, attrs); SourceLocation ScopedEnumKWLoc; @@ -4940,7 +4926,7 @@ 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) @@ -5621,9 +5607,9 @@ 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; @@ -6640,7 +6626,7 @@ SmallVector DynamicExceptionRanges; ExprResult NoexceptExpr; CachedTokens *ExceptionSpecTokens = nullptr; - ParsedAttributesWithRange FnAttrs(AttrFactory); + ParsedAttributes FnAttrs(AttrFactory); TypeResult TrailingReturnType; SourceLocation TrailingReturnTypeLoc; @@ -6921,10 +6907,9 @@ /// [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 Index: clang/lib/Parse/ParseDeclCXX.cpp =================================================================== --- clang/lib/Parse/ParseDeclCXX.cpp +++ clang/lib/Parse/ParseDeclCXX.cpp @@ -73,7 +73,7 @@ InnerNamespaceInfoList ExtraNSs; SourceLocation FirstNestedInlineLoc; - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); SourceLocation attrLoc; if (getLangOpts().CPlusPlus11 && isCXX11AttributeSpecifier()) { Diag(Tok.getLocation(), getLangOpts().CPlusPlus17 @@ -241,9 +241,9 @@ 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 @@ -344,7 +344,7 @@ 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)) { @@ -394,9 +394,9 @@ break; LLVM_FALLTHROUGH; default: - ParsedAttributesWithRange attrs(AttrFactory); - MaybeParseCXX11Attributes(attrs); - ParseExternalDeclaration(attrs); + ParsedAttributes Attrs(AttrFactory); + MaybeParseCXX11Attributes(Attrs); + ParseExternalDeclaration(Attrs); continue; } @@ -426,7 +426,7 @@ if (Tok.isNot(tok::l_brace)) { // FIXME: Factor out a ParseExternalDeclarationWithAttrs. - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); MaybeParseCXX11Attributes(Attrs); MaybeParseMicrosoftAttributes(Attrs); ParseExternalDeclaration(Attrs); @@ -446,7 +446,7 @@ while (!tryParseMisplacedModuleImport() && Tok.isNot(tok::r_brace) && Tok.isNot(tok::eof)) { - ParsedAttributesWithRange Attrs(AttrFactory); + ParsedAttributes Attrs(AttrFactory); MaybeParseCXX11Attributes(Attrs); MaybeParseMicrosoftAttributes(Attrs); ParseExternalDeclaration(Attrs); @@ -459,11 +459,9 @@ /// 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); @@ -672,11 +670,10 @@ /// /// 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; @@ -714,7 +711,7 @@ // 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)) @@ -723,7 +720,7 @@ 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 @@ -1461,9 +1458,9 @@ 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; @@ -1494,7 +1491,7 @@ (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); @@ -2153,7 +2150,7 @@ bool IsVirtual = false; SourceLocation StartLoc = Tok.getLocation(); - ParsedAttributesWithRange Attributes(AttrFactory); + ParsedAttributes Attributes(AttrFactory); MaybeParseCXX11Attributes(Attributes); // Parse the 'virtual' keyword. @@ -2670,8 +2667,8 @@ TemplateInfo, TemplateDiags); } - ParsedAttributesWithRange attrs(AttrFactory); - ParsedAttributesViewWithRange FnAttrs; + ParsedAttributes attrs(AttrFactory); + ParsedAttributesView FnAttrs; // Optional C++11 attribute-specifier MaybeParseCXX11Attributes(attrs); @@ -3166,7 +3163,7 @@ // 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; @@ -3206,14 +3203,15 @@ 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()) { @@ -3323,7 +3321,7 @@ /// void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc, SourceLocation AttrFixitLoc, - ParsedAttributesWithRange &Attrs, + ParsedAttributes &Attrs, unsigned TagType, Decl *TagDecl) { assert((TagType == DeclSpec::TST_struct || TagType == DeclSpec::TST_interface || @@ -3507,7 +3505,7 @@ 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. @@ -4360,7 +4358,7 @@ 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 ']' ']' @@ -4513,17 +4511,17 @@ /// /// 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() { @@ -4656,7 +4654,7 @@ /// [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(); Index: clang/lib/Parse/ParseExprCXX.cpp =================================================================== --- clang/lib/Parse/ParseExprCXX.cpp +++ clang/lib/Parse/ParseExprCXX.cpp @@ -1252,7 +1252,7 @@ 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::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 @@ return Sema::ConditionError(); } - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); MaybeParseCXX11Attributes(attrs); const auto WarnOnInit = [this, &CK] { Index: clang/lib/Parse/ParseObjc.cpp =================================================================== --- clang/lib/Parse/ParseObjc.cpp +++ clang/lib/Parse/ParseObjc.cpp @@ -45,8 +45,7 @@ /// [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 @@ 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 @@ { 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(); Index: clang/lib/Parse/ParseOpenMP.cpp =================================================================== --- clang/lib/Parse/ParseOpenMP.cpp +++ clang/lib/Parse/ParseOpenMP.cpp @@ -2022,7 +2022,7 @@ /// 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!"); Index: clang/lib/Parse/ParsePragma.cpp =================================================================== --- clang/lib/Parse/ParsePragma.cpp +++ clang/lib/Parse/ParsePragma.cpp @@ -341,7 +341,7 @@ 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 @@ 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" @@ -1641,7 +1640,7 @@ /*IsReinject=*/false); ConsumeAnnotationToken(); - ParsedAttributesWithRange &Attrs = Info->Attributes; + ParsedAttributes &Attrs = Info->Attributes; Attrs.clearListOnly(); auto SkipToEnd = [this]() { Index: clang/lib/Parse/ParseStmt.cpp =================================================================== --- clang/lib/Parse/ParseStmt.cpp +++ clang/lib/Parse/ParseStmt.cpp @@ -105,7 +105,7 @@ // 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 @@ 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 @@ /// 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 @@ // 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 @@ // 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 @@ 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 @@ 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 @@ return StmtError(); } - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); MaybeParseCXX11Attributes(attrs); SourceLocation EmptyInitStmtSemiLoc; @@ -1955,8 +1955,8 @@ ? 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::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 @@ // without default arguments. Decl *ExceptionDecl = nullptr; if (Tok.isNot(tok::ellipsis)) { - ParsedAttributesWithRange Attributes(AttrFactory); + ParsedAttributes Attributes(AttrFactory); MaybeParseCXX11Attributes(Attributes); DeclSpec DS(AttrFactory); Index: clang/lib/Parse/ParseTemplate.cpp =================================================================== --- clang/lib/Parse/ParseTemplate.cpp +++ clang/lib/Parse/ParseTemplate.cpp @@ -204,7 +204,7 @@ return nullptr; } - ParsedAttributesWithRange prefixAttrs(AttrFactory); + ParsedAttributes prefixAttrs(AttrFactory); MaybeParseCXX11Attributes(prefixAttrs); if (Tok.is(tok::kw_using)) { Index: clang/lib/Parse/ParseTentative.cpp =================================================================== --- clang/lib/Parse/ParseTentative.cpp +++ clang/lib/Parse/ParseTentative.cpp @@ -1913,7 +1913,7 @@ /*OuterMightBeMessageSend*/true)) return TPResult::True; - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); MaybeParseMicrosoftAttributes(attrs); // decl-specifier-seq Index: clang/lib/Parse/Parser.cpp =================================================================== --- clang/lib/Parse/Parser.cpp +++ clang/lib/Parse/Parser.cpp @@ -721,7 +721,7 @@ break; } - ParsedAttributesWithRange attrs(AttrFactory); + ParsedAttributes attrs(AttrFactory); MaybeParseCXX11Attributes(attrs); Result = ParseExternalDeclaration(attrs); @@ -764,9 +764,8 @@ /// /// [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 @@ 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 @@ 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 @@ // __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 @@ break; } case tok::at: - return ParseObjCAtDirectives(attrs); + return ParseObjCAtDirectives(Attrs); case tok::minus: case tok::plus: if (!getLangOpts().ObjC) { @@ -908,13 +907,13 @@ 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 @@ // 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 @@ 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 @@ // 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 @@ 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 @@ 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 @@ 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 @@ /// [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 @@ ? 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 @@ 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 @@ 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 @@ // afterwards. ObjCDeclContextSwitch ObjCDC(*this); - return ParseDeclOrFunctionDefInternal(attrs, PDS, AS); + return ParseDeclOrFunctionDefInternal(Attrs, PDS, AS); } } @@ -2292,9 +2287,9 @@ // 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 @@ } // 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 @@ 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); Index: clang/lib/Sema/SemaDecl.cpp =================================================================== --- clang/lib/Sema/SemaDecl.cpp +++ clang/lib/Sema/SemaDecl.cpp @@ -13153,11 +13153,9 @@ } } -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 @@ -13172,7 +13170,7 @@ 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); @@ -13180,7 +13178,8 @@ 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) { Index: clang/lib/Sema/SemaDeclCXX.cpp =================================================================== --- clang/lib/Sema/SemaDeclCXX.cpp +++ clang/lib/Sema/SemaDeclCXX.cpp @@ -2615,12 +2615,11 @@ /// 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; Index: clang/lib/Sema/SemaStmt.cpp =================================================================== --- clang/lib/Sema/SemaStmt.cpp +++ clang/lib/Sema/SemaStmt.cpp @@ -587,7 +587,7 @@ 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); Index: clang/lib/Sema/SemaStmtAttr.cpp =================================================================== --- clang/lib/Sema/SemaStmtAttr.cpp +++ clang/lib/Sema/SemaStmtAttr.cpp @@ -495,8 +495,7 @@ } } -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)) Index: clang/lib/Sema/SemaType.cpp =================================================================== --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -362,7 +362,8 @@ }; 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); @@ -8123,7 +8124,12 @@ 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 @@ -8133,9 +8139,6 @@ // 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. Index: clang/test/SemaOpenCL/address-spaces.cl =================================================================== --- clang/test/SemaOpenCL/address-spaces.cl +++ clang/test/SemaOpenCL/address-spaces.cl @@ -258,7 +258,7 @@ 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}}