Implement Sebastian's idea for simplifying our handling of the greater-than operator/delimiter. Also, clean up after ourselves following a failed parse of a template-argument-list

llvm-svn: 64166
This commit is contained in:
Douglas Gregor 2009-02-09 21:04:56 +00:00
parent fe174df170
commit 0db4ccd7fb
3 changed files with 13 additions and 25 deletions

View File

@ -64,34 +64,18 @@ class Parser {
/// argument list.
bool GreaterThanIsOperator;
/// \brief RAII object that makes '>' behave like the closing angle
/// bracket for a template argument list.
struct MakeGreaterThanTemplateArgumentListTerminator {
/// \brief RAII object that makes '>' behave either as an operator
/// or as the closing angle bracket for a template argument list.
struct GreaterThanIsOperatorScope {
bool &GreaterThanIsOperator;
bool OldGreaterThanIsOperator;
MakeGreaterThanTemplateArgumentListTerminator(bool &GTIO)
GreaterThanIsOperatorScope(bool &GTIO, bool Val)
: GreaterThanIsOperator(GTIO), OldGreaterThanIsOperator(GTIO) {
GTIO = false;
GreaterThanIsOperator = Val;
}
~MakeGreaterThanTemplateArgumentListTerminator() {
GreaterThanIsOperator = OldGreaterThanIsOperator;
}
};
/// \brief RAII object that makes '>' behave like an
/// operator. Occurs, for example, inside parentheses.
struct MakeGreaterThanAnOperator {
bool &GreaterThanIsOperator;
bool OldGreaterThanIsOperator;
MakeGreaterThanAnOperator(bool &GTIO)
: GreaterThanIsOperator(GTIO), OldGreaterThanIsOperator(GTIO) {
GTIO = true;
}
~MakeGreaterThanAnOperator() {
~GreaterThanIsOperatorScope() {
GreaterThanIsOperator = OldGreaterThanIsOperator;
}
};

View File

@ -1112,7 +1112,7 @@ Parser::OwningExprResult
Parser::ParseParenExpression(ParenParseOption &ExprType,
TypeTy *&CastTy, SourceLocation &RParenLoc) {
assert(Tok.is(tok::l_paren) && "Not a paren expr!");
MakeGreaterThanAnOperator G(GreaterThanIsOperator);
GreaterThanIsOperatorScope G(GreaterThanIsOperator, true);
SourceLocation OpenLoc = ConsumeParen();
OwningExprResult Result(Actions, true);
CastTy = 0;

View File

@ -371,13 +371,17 @@ void Parser::AnnotateTemplateIdToken(DeclTy *Template, TemplateNameKind TNK,
TemplateArgList TemplateArgs;
TemplateArgIsTypeList TemplateArgIsType;
{
MakeGreaterThanTemplateArgumentListTerminator G(GreaterThanIsOperator);
GreaterThanIsOperatorScope G(GreaterThanIsOperator, false);
if (Tok.isNot(tok::greater) &&
ParseTemplateArgumentList(TemplateArgs, TemplateArgIsType)) {
// Try to find the closing '>'.
SkipUntil(tok::greater, true, true);
// Clean up any template arguments that we successfully parsed.
ASTTemplateArgsPtr TemplateArgsPtr(Actions, &TemplateArgs[0],
&TemplateArgIsType[0],
TemplateArgs.size());
// FIXME: What's our recovery strategy for failed template-argument-lists?
return;
}
}