@@ -4944,6 +4944,26 @@ void Parser::ParseStructDeclaration(
4944
4944
}
4945
4945
}
4946
4946
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 LangStd = getLangOpts ().LangStd ;
4955
+ if (LangStd != LangStandard::lang_unspecified) {
4956
+ auto Lang = LangStandard::getLangStandardForKind (LangStd).getLanguage ();
4957
+ assert (Lang == Language::C || Lang == Language::OpenCL);
4958
+ }
4959
+ #endif
4960
+ for (auto *LA : LAs) {
4961
+ ParseLexedCAttribute (*LA, OutAttrs);
4962
+ delete LA;
4963
+ }
4964
+ LAs.clear ();
4965
+ }
4966
+
4947
4967
// / Finish parsing an attribute for which parsing was delayed.
4948
4968
// / This will be called at the end of parsing a class declaration
4949
4969
// / for each LateParsedAttribute. We consume the saved tokens and
@@ -5032,7 +5052,7 @@ void Parser::ParseStructUnionBody(SourceLocation RecordLoc,
5032
5052
5033
5053
// `LateAttrParseExperimentalExtOnly=true` requests that only attributes
5034
5054
// marked with `LateAttrParseExperimentalExt` are late parsed.
5035
- LateParsedAttrList LateFieldAttrs (/* PSoon=*/ false ,
5055
+ LateParsedAttrList LateFieldAttrs (/* PSoon=*/ true ,
5036
5056
/* LateAttrParseExperimentalExtOnly=*/ true );
5037
5057
5038
5058
// While we still have something to read, read the declarations in the struct.
@@ -5141,9 +5161,7 @@ void Parser::ParseStructUnionBody(SourceLocation RecordLoc,
5141
5161
MaybeParseGNUAttributes (attrs, &LateFieldAttrs);
5142
5162
5143
5163
// Late parse field attributes if necessary.
5144
- assert (!getLangOpts ().CPlusPlus );
5145
- for (auto *LateAttr : LateFieldAttrs)
5146
- ParseLexedCAttribute (*LateAttr);
5164
+ ParseLexedCAttributeList (LateFieldAttrs, /* EnterScope=*/ false );
5147
5165
5148
5166
SmallVector<Decl *, 32 > FieldDecls (TagDecl->fields ());
5149
5167
0 commit comments