AST: fixed 'a.b++' and '*c[5]--'

This commit is contained in:
Daniel Marjamäki 2014-04-27 16:02:24 +02:00
parent ecec4b0b46
commit 9f2e37da37
2 changed files with 18 additions and 2 deletions

View File

@ -456,7 +456,7 @@ static void compileTerm(Token *& tok, std::stack<Token*> &op, unsigned int depth
compileUnaryOp(tok, compileExpression, op, depth);
} else if (tok->isName()) {
const bool templatefunc = Token::Match(tok, "%var% <") && Token::simpleMatch(tok->linkAt(1), "> (");
if (Token::Match(tok->next(), "++|--")) { // post increment / decrement
if (!Token::Match(tok->previous(), ".|::") && Token::Match(tok->next(), "++|--")) { // post increment / decrement
tok = tok->next();
tok->astOperand1(tok->previous());
op.push(tok);
@ -492,8 +492,13 @@ static void compileTerm(Token *& tok, std::stack<Token*> &op, unsigned int depth
}
tok1->astOperand1(prev);
prev = tok1;
if (Token::Match(tok, "]|)"))
if (Token::Match(tok, "]|)")) {
tok = tok->next();
if (depth==1U && Token::Match(tok,"++|--") && op.empty()) {
tok->astOperand1(tok->previous()->link());
tok = tok->next();
}
}
}
op.push(par);
}
@ -566,6 +571,8 @@ static void compileScope(Token *&tok, std::stack<Token*> &op, unsigned int depth
compileBinOp(tok, compileTerm, op, depth);
else
compileUnaryOp(tok, compileDot, op, depth);
if (depth==1U && Token::Match(tok,"++|--"))
compileTerm(tok,op,depth);
} else break;
}
}
@ -587,6 +594,8 @@ static void compileDot(Token *&tok, std::stack<Token*> &op, unsigned int depth)
while (tok) {
if (tok->str() == ".") {
compileBinOp(tok, compileParAndBrackets, op, depth);
if (depth==1U && Token::Match(tok,"++|--"))
compileTerm(tok,op,depth);
} else break;
}
}

View File

@ -10257,6 +10257,9 @@ private:
if (Token::Match(tok, "%or%|<<|>>|+|-|*|/|%|&|^ =")) {
tok->str(tok->str() + "=");
tok->deleteNext();
} else if (Token::simpleMatch(tok, ": :")) {
tok->str("::");
tok->deleteNext();
}
}
@ -10407,6 +10410,10 @@ private:
ASSERT_EQUALS("1a--+", testAst("1 + --a"));
ASSERT_EQUALS("1a--+", testAst("1 + a--"));
ASSERT_EQUALS("ab+!", testAst("!(a+b)"));
ASSERT_EQUALS("ab.++", testAst("++a.b;"));
ASSERT_EQUALS("ab.++", testAst("a.b++;"));
ASSERT_EQUALS("ab::++", testAst("a::b++;"));
ASSERT_EQUALS("c5[--*", testAst("*c[5]--;"));
// Unary :: operator
ASSERT_EQUALS("abc?d12,(::e/:=",testAst("a = b ? c : ::d(1,2) / e;"));