@@ -8192,7 +8192,7 @@ void Tokenizer::validateC() const
8192
8192
syntaxErrorC (tok, " template<..." );
8193
8193
if (Token::Match (tok, " %name% :: %name%" ))
8194
8194
syntaxErrorC (tok, tok->str () + tok->strAt (1 ) + tok->strAt (2 ));
8195
- if (Token::Match (tok, " class|namespace %name% [:{] " ))
8195
+ if (Token::Match (tok, " class|namespace %name% :|::|{ " ))
8196
8196
syntaxErrorC (tok, tok->str () + tok->strAt (1 ) + tok->strAt (2 ));
8197
8197
}
8198
8198
}
@@ -8708,7 +8708,8 @@ void Tokenizer::findGarbageCode() const
8708
8708
syntaxError (tok);
8709
8709
if (Token::Match (tok, " typedef [,;:]" ))
8710
8710
syntaxError (tok);
8711
- if (Token::Match (tok, " ! %comp%" ))
8711
+ if (Token::Match (tok, " !|~ %comp%" ) &&
8712
+ !(isCPP () && tok->strAt (1 ) == " >" && Token::simpleMatch (tok->tokAt (-1 ), " operator" )))
8712
8713
syntaxError (tok);
8713
8714
if (Token::Match (tok, " ] %name%" ) && (!isCPP () || !(tok->tokAt (-1 ) && Token::simpleMatch (tok->tokAt (-2 ), " delete [" )))) {
8714
8715
if (tok->next ()->isUpperCaseName ())
@@ -8782,30 +8783,27 @@ void Tokenizer::findGarbageCode() const
8782
8783
// Garbage templates..
8783
8784
if (isCPP ()) {
8784
8785
for (const Token *tok = tokens (); tok; tok = tok->next ()) {
8785
- if (Token::simpleMatch (tok, " < >" )) {
8786
- if (!(Token::Match (tok->tokAt (-1 ), " %name%" ) || (tok->tokAt (-1 ) && Token::Match (tok->tokAt (-2 ), " operator %op%" ))))
8787
- syntaxError (tok);
8788
- if (!tok->tokAt (-1 ) || tok->tokAt (-1 )->isLiteral ())
8789
- syntaxError (tok);
8790
- }
8786
+ if (Token::simpleMatch (tok, " < >" ) && !(Token::Match (tok->tokAt (-1 ), " %name%" ) || (tok->tokAt (-1 ) && Token::Match (tok->tokAt (-2 ), " operator %op%" ))))
8787
+ syntaxError (tok);
8788
+ if (Token::simpleMatch (tok, " : template" ) && !Token::Match (tok->tokAt (-1 ), " public|private|protected" ))
8789
+ syntaxError (tok);
8791
8790
if (!Token::simpleMatch (tok, " template <" ))
8792
8791
continue ;
8793
8792
if (!tok->tokAt (2 ) || tok->tokAt (2 )->isLiteral ())
8794
8793
syntaxError (tok);
8795
- if (tok->previous () && !Token::Match (tok->previous (), " :|;|{|}|)|>|\" C++\" " )) {
8794
+ if (tok->previous () && !Token::Match (tok->previous (), " :|,| ;|{|}|)|< |>|\" C++\" " )) {
8796
8795
if (tok->previous ()->isUpperCaseName ())
8797
8796
unknownMacroError (tok->previous ());
8798
8797
else
8799
8798
syntaxError (tok);
8800
8799
}
8801
- const Token * const tok1 = tok;
8802
- tok = tok->next ()->findClosingBracket ();
8803
- if (!tok)
8804
- syntaxError (tok1);
8805
- if (!Token::Match (tok, " >|>> ::|...| %name%" ) &&
8806
- !Token::Match (tok, " >|>> [ [ %name%" ) &&
8807
- !Token::Match (tok, " > >|*" ))
8808
- syntaxError (tok->next () ? tok->next () : tok1);
8800
+ const Token * const tok1 = tok->next ()->findClosingBracket ();
8801
+ if (!tok1)
8802
+ syntaxError (tok);
8803
+ if (!Token::Match (tok1, " >|>> ::|...| %name%" ) &&
8804
+ !Token::Match (tok1, " >|>> [ [ %name%" ) &&
8805
+ !Token::Match (tok1, " > >|*" ))
8806
+ syntaxError (tok1->next () ? tok1->next () : tok);
8809
8807
}
8810
8808
}
8811
8809
0 commit comments