@@ -43,37 +43,44 @@ void CheckPostfixOperator::postfixOperator()
4343 for (std::size_t i = 0 ; i < functions; ++i) {
4444 const Scope * scope = symbolDatabase->functionScopes [i];
4545 for (const Token* tok = scope->classStart ->next (); tok != scope->classEnd ; tok = tok->next ()) {
46- if (tok->type () == Token::eIncDecOp) {
47- bool result = false ;
48- if (Token::Match (tok->tokAt (-2 ), " ;|{|}" ) && Token::Match (tok->next (), " ;|)|," )) {
46+ bool result = false ;
47+ const Variable *var = tok->variable ();
48+ if (var && Token::Match (tok, " %var% ++|--" )) {
49+ if (Token::Match (tok->previous (), " ;|{|}" ) && Token::Match (tok->tokAt (2 ), " ;|,|)" )) {
4950 result = true ;
50- } else if (tok->strAt (-2 ) == " ," ) {
51- int ii (1 );
52- while (tok->strAt (ii) != " )" && tok->tokAt (ii) != 0 ) {
53- if (tok->strAt (ii) == " ;" ) {
51+ } else if (tok->strAt (-1 ) == " ," ) {
52+ for (const Token* tok2 = tok->tokAt (2 ); tok2 != 0 && tok2->str () != " )" ; tok2 = tok2->next ()) {
53+ if (tok2->str () == " ;" ) {
5454 result = true ;
5555 break ;
56- }
57- ++ii;
56+ } else if (tok2->str () == " (" )
57+ tok2 = tok2->link ();
58+ }
59+ } else if (tok->strAt (-1 ) == " ." ) {
60+ for (const Token* tok2 = tok->tokAt (-2 ); tok2 != 0 ; tok2 = tok2->previous ()) {
61+ if (Token::Match (tok2, " ;|{|}" )) {
62+ result = true ;
63+ break ;
64+ } else if (Token::Match (tok2, " )|]|>" ) && tok2->link ())
65+ tok2 = tok2->link ();
66+ else if (tok2->isAssignmentOp () || Token::Match (tok2, " (|[" ))
67+ break ;
5868 }
59- } else if (tok->strAt (-2 ) == " <<" && tok->strAt (1 ) == " <<" ) {
60- result = true ;
6169 }
70+ }
6271
63- if (result && tok->previous ()->varId ()) {
64- const Variable *var = tok->previous ()->variable ();
65- if (!var || var->isPointer () || var->isArray () || var->isReference ())
66- continue ;
72+ if (result) {
73+ if (var->isPointer () || var->isArray ())
74+ continue ;
6775
68- const Token *decltok = var->nameToken ();
76+ const Token *decltok = var->nameToken ();
6977
70- if (Token::Match (decltok->previous (), " iterator|const_iterator|reverse_iterator|const_reverse_iterator" )) {
71- // the variable is an iterator
72- postfixOperatorError (tok);
73- } else if (var->type ()) {
74- // the variable is an instance of class
75- postfixOperatorError (tok);
76- }
78+ if (Token::Match (decltok->previous (), " iterator|const_iterator|reverse_iterator|const_reverse_iterator" )) {
79+ // the variable is an iterator
80+ postfixOperatorError (tok);
81+ } else if (var->type ()) {
82+ // the variable is an instance of class
83+ postfixOperatorError (tok);
7784 }
7885 }
7986 }
0 commit comments