Author: rsmith Date: Thu May 9 12:45:46 2019 New Revision: 360369 URL: http://llvm.org/viewvc/llvm-project?rev=360369&view=rev Log: Simplify tracking of end of consumed decl-specifier sequence.
Patch by Tyker! Differential Revision: https://reviews.llvm.org/D60934 Modified: cfe/trunk/lib/Parse/ParseDecl.cpp Modified: cfe/trunk/lib/Parse/ParseDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseDecl.cpp?rev=360369&r1=360368&r2=360369&view=diff ============================================================================== --- cfe/trunk/lib/Parse/ParseDecl.cpp (original) +++ cfe/trunk/lib/Parse/ParseDecl.cpp Thu May 9 12:45:46 2019 @@ -3004,12 +3004,12 @@ void Parser::ParseDeclarationSpecifiers( while (1) { bool isInvalid = false; bool isStorageClass = false; - bool isAlreadyConsumed = false; const char *PrevSpec = nullptr; unsigned DiagID = 0; - // This value need to be set when isAlreadyConsumed is set to true. - SourceLocation RangeEnd; + // This value needs to be set to the location of the last token if the last + // token of the specifier is already consumed. + SourceLocation ConsumedEnd; // HACK: MSVC doesn't consider _Atomic to be a keyword and its STL // implementation for VS2013 uses _Atomic as an identifier for one of the @@ -3566,8 +3566,7 @@ void Parser::ParseDeclarationSpecifiers( SourceLocation ExplicitLoc = Loc; SourceLocation CloseParenLoc; ExplicitSpecifier ExplicitSpec(nullptr, ExplicitSpecKind::ResolvedTrue); - isAlreadyConsumed = true; - RangeEnd = ExplicitLoc; + ConsumedEnd = ExplicitLoc; ConsumeToken(); // kw_explicit if (Tok.is(tok::l_paren)) { if (getLangOpts().CPlusPlus2a) { @@ -3575,7 +3574,7 @@ void Parser::ParseDeclarationSpecifiers( BalancedDelimiterTracker Tracker(*this, tok::l_paren); Tracker.consumeOpen(); ExplicitExpr = ParseConstantExpression(); - RangeEnd = Tok.getLocation(); + ConsumedEnd = Tok.getLocation(); if (ExplicitExpr.isUsable()) { CloseParenLoc = Tok.getLocation(); Tracker.consumeClose(); @@ -3934,10 +3933,7 @@ void Parser::ParseDeclarationSpecifiers( continue; } - assert((!isAlreadyConsumed || RangeEnd != SourceLocation()) && - "both or neither of isAlreadyConsumed and " - "RangeEnd needs to be set"); - DS.SetRangeEnd(isAlreadyConsumed ? RangeEnd : Tok.getLocation()); + DS.SetRangeEnd(ConsumedEnd.isValid() ? ConsumedEnd : Tok.getLocation()); // If the specifier wasn't legal, issue a diagnostic. if (isInvalid) { @@ -3958,7 +3954,7 @@ void Parser::ParseDeclarationSpecifiers( Diag(Loc, DiagID) << PrevSpec; } - if (DiagID != diag::err_bool_redeclaration && !isAlreadyConsumed) + if (DiagID != diag::err_bool_redeclaration && ConsumedEnd.isInvalid()) // After an error the next token can be an annotation token. ConsumeAnyToken(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits