forked from OSchip/llvm-project
Parse: Switch to using EOF tokens for late parsed attributes
The EOF token injection technique is preferable to using isBeforeInTranslationUnit to determine whether or not additional cleanup is needed. I don't have an example off-hand that requires it but it is nicer nonetheless. llvm-svn: 225776
This commit is contained in:
parent
2f8f0547b1
commit
d5946f51a5
|
@ -1147,8 +1147,14 @@ void Parser::ParseLexedAttributeList(LateParsedAttrList &LAs, Decl *D,
|
|||
/// to the Attribute list for the decl.
|
||||
void Parser::ParseLexedAttribute(LateParsedAttribute &LA,
|
||||
bool EnterScope, bool OnDefinition) {
|
||||
// Save the current token position.
|
||||
SourceLocation OrigLoc = Tok.getLocation();
|
||||
// Create a fake EOF so that attribute parsing won't go off the end of the
|
||||
// attribute.
|
||||
Token AttrEnd;
|
||||
AttrEnd.startToken();
|
||||
AttrEnd.setKind(tok::eof);
|
||||
AttrEnd.setLocation(Tok.getLocation());
|
||||
AttrEnd.setEofData(LA.Toks.data());
|
||||
LA.Toks.push_back(AttrEnd);
|
||||
|
||||
// Append the current token at the end of the new token stream so that it
|
||||
// doesn't get lost.
|
||||
|
@ -1213,16 +1219,13 @@ void Parser::ParseLexedAttribute(LateParsedAttribute &LA,
|
|||
for (unsigned i = 0, ni = LA.Decls.size(); i < ni; ++i)
|
||||
Actions.ActOnFinishDelayedAttribute(getCurScope(), LA.Decls[i], Attrs);
|
||||
|
||||
if (Tok.getLocation() != OrigLoc) {
|
||||
// Due to a parsing error, we either went over the cached tokens or
|
||||
// there are still cached tokens left, so we skip the leftover tokens.
|
||||
// Since this is an uncommon situation that should be avoided, use the
|
||||
// expensive isBeforeInTranslationUnit call.
|
||||
if (PP.getSourceManager().isBeforeInTranslationUnit(Tok.getLocation(),
|
||||
OrigLoc))
|
||||
while (Tok.getLocation() != OrigLoc && Tok.isNot(tok::eof))
|
||||
ConsumeAnyToken();
|
||||
}
|
||||
// Due to a parsing error, we either went over the cached tokens or
|
||||
// there are still cached tokens left, so we skip the leftover tokens.
|
||||
while (Tok.isNot(tok::eof))
|
||||
ConsumeAnyToken();
|
||||
|
||||
if (Tok.is(tok::eof) && Tok.getEofData() == AttrEnd.getEofData())
|
||||
ConsumeAnyToken();
|
||||
}
|
||||
|
||||
void Parser::ParseTypeTagForDatatypeAttribute(IdentifierInfo &AttrName,
|
||||
|
|
Loading…
Reference in New Issue