@@ -4944,6 +4944,24 @@ void Parser::ParseStructDeclaration(
49444944 }
49454945}
49464946
4947+ // TODO: All callers of this function should be moved to
4948+ // `Parser::ParseLexedAttributeList`.
4949+ void Parser::ParseLexedCAttributeList (LateParsedAttrList &LAs, bool EnterScope,
4950+ ParsedAttributes *OutAttrs) {
4951+ assert (LAs.parseSoon () &&
4952+ " Attribute list should be marked for immediate parsing." );
4953+ #ifndef NDEBUG
4954+ auto Lang =
4955+ LangStandard::getLangStandardForKind (getLangOpts ().LangStd ).getLanguage ();
4956+ assert (Lang == Language::C || Lang == Language::OpenCL);
4957+ #endif
4958+ for (auto *LA : LAs) {
4959+ ParseLexedCAttribute (*LA, OutAttrs);
4960+ delete LA;
4961+ }
4962+ LAs.clear ();
4963+ }
4964+
49474965// / Finish parsing an attribute for which parsing was delayed.
49484966// / This will be called at the end of parsing a class declaration
49494967// / for each LateParsedAttribute. We consume the saved tokens and
@@ -5032,7 +5050,7 @@ void Parser::ParseStructUnionBody(SourceLocation RecordLoc,
50325050
50335051 // `LateAttrParseExperimentalExtOnly=true` requests that only attributes
50345052 // marked with `LateAttrParseExperimentalExt` are late parsed.
5035- LateParsedAttrList LateFieldAttrs (/* PSoon=*/ false ,
5053+ LateParsedAttrList LateFieldAttrs (/* PSoon=*/ true ,
50365054 /* LateAttrParseExperimentalExtOnly=*/ true );
50375055
50385056 // While we still have something to read, read the declarations in the struct.
@@ -5141,9 +5159,7 @@ void Parser::ParseStructUnionBody(SourceLocation RecordLoc,
51415159 MaybeParseGNUAttributes (attrs, &LateFieldAttrs);
51425160
51435161 // Late parse field attributes if necessary.
5144- assert (!getLangOpts ().CPlusPlus );
5145- for (auto *LateAttr : LateFieldAttrs)
5146- ParseLexedCAttribute (*LateAttr);
5162+ ParseLexedCAttributeList (LateFieldAttrs, /* EnterScope=*/ false );
51475163
51485164 SmallVector<Decl *, 32 > FieldDecls (TagDecl->fields ());
51495165
0 commit comments