diff --git a/lib/tokenlist.cpp b/lib/tokenlist.cpp index bfc4adc83..1569072f5 100644 --- a/lib/tokenlist.cpp +++ b/lib/tokenlist.cpp @@ -473,7 +473,7 @@ static void compileScope(Token *&tok, std::stack &op, unsigned int depth static bool isPrefixUnary(const Token* tok) { if (!tok->previous() - || (Token::Match(tok->previous(), "(|[|{|%op%|;|}|?|:|,") + || (Token::Match(tok->previous(), "(|[|{|%op%|;|}|?|:|,|return|throw") && (tok->previous()->type() != Token::eIncDecOp || tok->type() == Token::eIncDecOp))) return true; diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index d33fd0195..698723a81 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -10358,6 +10358,9 @@ private: } else if (Token::simpleMatch(tok, ": :")) { tok->str("::"); tok->deleteNext(); + } else if (Token::Match(tok, ">|<|= =")) { + tok->str(tok->str() + tok->strAt(1)); + tok->deleteNext(); } } @@ -10379,6 +10382,12 @@ private: // Create AST.. tokenList.createAst(); + // Basic AST validation + for (const Token *tok = tokenList.front(); tok; tok = tok->next()) { + if (tok->astOperand2() && !tok->astOperand1() && tok->str() != ";") + return "Op2 but no Op1 for token: " + tok->str(); + } + // Return stringified AST if (verbose) return tokenList.front()->astTop()->astStringVerbose(0,0); @@ -10446,7 +10455,7 @@ private: // for ASSERT_EQUALS("for;;(", testAst("for(;;)")); ASSERT_EQUALS("fora0=a8note>0==tp-notei1-[->type>4>||(", testAst("if ((tp->note[i - 1]->note == 0) || (tp->note[i - 1]->type > 4)) {}")); - ASSERT_EQUALS("a-bi[j1+[>", testAst("a->b[i][j+1]")); + ASSERT_EQUALS("iftpnote.i1-[note.0==tpnote.i1-[type.4>||(", testAst("if ((tp.note[i - 1].note == 0) || (tp.note[i - 1].type > 4)) {}")); + ASSERT_EQUALS("ab.i[j1+[", testAst("a.b[i][j+1]")); // problems with: x=expr ASSERT_EQUALS("=\n" @@ -10524,6 +10533,7 @@ private: ASSERT_EQUALS("ab.++", testAst("a.b++;")); ASSERT_EQUALS("ab::++", testAst("a::b++;")); ASSERT_EQUALS("c5[--*", testAst("*c[5]--;")); + ASSERT_EQUALS("a*bc:?return", testAst("return *a ? b : c;")); // Unary :: operator ASSERT_EQUALS("abcd::12,(e/:?=", testAst("a = b ? c : ::d(1,2) / e;"));