mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2024-11-27 22:22:17 +00:00
Merge branch 'cooking' of github.com:graphitemaster/gmqcc into cooking
This commit is contained in:
commit
dd289ed0e1
1 changed files with 29 additions and 3 deletions
32
parser.c
32
parser.c
|
@ -1629,7 +1629,7 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma
|
|||
/* only warn once about an assignment in a truth value because the current code
|
||||
* would trigger twice on: if(a = b && ...), once for the if-truth-value, once for the && part
|
||||
*/
|
||||
bool warn_truthvalue = true;
|
||||
bool warn_parenthesis = true;
|
||||
|
||||
/* count the parens because an if starts with one, so the
|
||||
* end of a condition is an unmatched closing paren
|
||||
|
@ -1692,6 +1692,17 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma
|
|||
if (vec_size(sy.ops) && !vec_last(sy.ops).isparen)
|
||||
olast = &operators[vec_last(sy.ops).etype-1];
|
||||
|
||||
/* first only apply higher precedences, assoc_left+equal comes after we warn about precedence rules */
|
||||
while (olast && op->prec < olast->prec)
|
||||
{
|
||||
if (!parser_sy_apply_operator(parser, &sy))
|
||||
goto onerr;
|
||||
if (vec_size(sy.ops) && !vec_last(sy.ops).isparen)
|
||||
olast = &operators[vec_last(sy.ops).etype-1];
|
||||
else
|
||||
olast = NULL;
|
||||
}
|
||||
|
||||
#define IsAssignOp(x) (\
|
||||
(x) == opid1('=') || \
|
||||
(x) == opid2('+','=') || \
|
||||
|
@ -1703,14 +1714,29 @@ static ast_expression* parse_expression_leave(parser_t *parser, bool stopatcomma
|
|||
(x) == opid2('|','=') || \
|
||||
(x) == opid3('&','~','=') \
|
||||
)
|
||||
if (warn_truthvalue) {
|
||||
if (warn_parenthesis) {
|
||||
if ( (olast && IsAssignOp(olast->id) && (op->id == opid2('&','&') || op->id == opid2('|','|'))) ||
|
||||
(olast && IsAssignOp(op->id) && (olast->id == opid2('&','&') || olast->id == opid2('|','|'))) ||
|
||||
(truthvalue && !vec_size(sy.paren) && IsAssignOp(op->id))
|
||||
)
|
||||
{
|
||||
(void)!parsewarning(parser, WARN_PARENTHESIS, "suggesting parenthesis around assignment used as truth value");
|
||||
warn_truthvalue = false;
|
||||
warn_parenthesis = false;
|
||||
}
|
||||
|
||||
if (olast && olast->id != op->id) {
|
||||
if ((op->id == opid1('&') || op->id == opid1('|') || op->id == opid1('^')) &&
|
||||
(olast->id == opid1('&') || olast->id == opid1('|') || olast->id == opid1('^')))
|
||||
{
|
||||
(void)!parsewarning(parser, WARN_PARENTHESIS, "suggesting parenthesis around bitwise operations");
|
||||
warn_parenthesis = false;
|
||||
}
|
||||
else if ((op->id == opid2('&','&') || op->id == opid2('|','|')) &&
|
||||
(olast->id == opid2('&','&') || olast->id == opid2('|','|')))
|
||||
{
|
||||
(void)!parsewarning(parser, WARN_PARENTHESIS, "suggesting parenthesis around logical operations");
|
||||
warn_parenthesis = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue