@@ -1779,6 +1779,36 @@ void Parser::checkPotentialAngleBracket(ExprResult &PotentialTemplateName) {
17791779 Priority);
17801780}
17811781
1782+ bool Parser::isMissingTemplateKeywordBeforeScope () {
1783+ assert (Tok.is (tok::coloncolon));
1784+ Sema::DisableTypoCorrectionRAII DTC (Actions);
1785+ ColonProtectionRAIIObject ColonProtection (*this );
1786+
1787+ SourceLocation StartLoc = Tok.getLocation ();
1788+ if (TryAnnotateTypeOrScopeToken ())
1789+ return true ;
1790+ if (Tok.isSimpleTypeSpecifier (getLangOpts ()))
1791+ return false ;
1792+ CXXScopeSpec SS;
1793+ ParseOptionalCXXScopeSpecifier (SS, /* ObjectType=*/ nullptr ,
1794+ /* ObjectHasErrors=*/ false ,
1795+ /* EnteringContext=*/ false );
1796+ ExprResult Result = tryParseCXXIdExpression (SS, /* isAddressOfOperand=*/ false );
1797+
1798+ if (PP.isBacktrackEnabled ())
1799+ PP.RevertCachedTokens (1 );
1800+ else
1801+ PP.EnterToken (Tok, /* IsReinject=*/ true );
1802+
1803+ SourceLocation EndLoc = Tok.getLocation ();
1804+ Tok.setLocation (StartLoc);
1805+ Tok.setKind (tok::annot_primary_expr);
1806+ setExprAnnotation (Tok, Result);
1807+ Tok.setAnnotationEndLoc (EndLoc);
1808+ PP.AnnotateCachedTokens (Tok);
1809+ return Result.isInvalid ();
1810+ }
1811+
17821812bool Parser::checkPotentialAngleBracketDelimiter (
17831813 const AngleBracketTracker::Loc &LAngle, const Token &OpToken) {
17841814 // If a comma in an expression context is followed by a type that can be a
@@ -1802,36 +1832,14 @@ bool Parser::checkPotentialAngleBracketDelimiter(
18021832 return true ;
18031833 }
18041834
1805- if (OpToken.is (tok::greater) && Tok.is (tok::coloncolon)) {
1806- Sema::DisableTypoCorrectionRAII DTC (Actions);
1807-
1808- SourceLocation StartLoc = Tok.getLocation ();
1809- CXXScopeSpec SS;
1810- ParseOptionalCXXScopeSpecifier (SS, /* ObjectType=*/ nullptr ,
1811- /* ObjectHasErrors=*/ false ,
1812- /* EnteringContext=*/ false );
1813- ExprResult Result =
1814- tryParseCXXIdExpression (SS, /* isAddressOfOperand=*/ false );
1815-
1816- if (PP.isBacktrackEnabled ())
1817- PP.RevertCachedTokens (1 );
1818- else
1819- PP.EnterToken (Tok, /* IsReinject=*/ true );
1820-
1821- SourceLocation EndLoc = Tok.getLocation ();
1822- Tok.setLocation (StartLoc);
1823- Tok.setKind (tok::annot_primary_expr);
1824- setExprAnnotation (Tok, Result);
1825- Tok.setAnnotationEndLoc (EndLoc);
1826- PP.AnnotateCachedTokens (Tok);
1827-
1828- if (Result.isInvalid ()) {
1829- Actions.diagnoseExprIntendedAsTemplateName (
1830- getCurScope (), LAngle.TemplateName , LAngle.LessLoc ,
1831- OpToken.getLocation ());
1832- AngleBrackets.clear (*this );
1833- return true ;
1834- }
1835+ if (OpToken.is (tok::greater) && Tok.is (tok::coloncolon) &&
1836+ !NextToken ().isOneOf (tok::kw_new, tok::kw_delete) &&
1837+ isMissingTemplateKeywordBeforeScope ()) {
1838+ Actions.diagnoseExprIntendedAsTemplateName (
1839+ getCurScope (), LAngle.TemplateName , LAngle.LessLoc ,
1840+ OpToken.getLocation ());
1841+ AngleBrackets.clear (*this );
1842+ return true ;
18351843 }
18361844
18371845 // After a '>' (etc), we're no longer potentially in a construct that's
0 commit comments