From bd601e45c3b2d3bc0e3e02118ed45a6dd0907230 Mon Sep 17 00:00:00 2001 From: "zik.saleeba" Date: Wed, 16 Feb 2011 04:46:04 +0000 Subject: [PATCH] Structure element access wasn't obeying precedence rules. It is now. Fixed test case 50. git-svn-id: http://picoc.googlecode.com/svn/trunk@545 21eae674-98b7-11dd-bd71-f92a316d2d60 --- expression.c | 21 +++++++++++---------- tests/50_logical_second_arg.c | 4 ++-- tests/50_logical_second_arg.expect | 4 ++-- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/expression.c b/expression.c index e09eb7a..85dc5b3 100644 --- a/expression.c +++ b/expression.c @@ -1085,20 +1085,21 @@ int ExpressionParse(struct ParseState *Parser, struct Value **Result) else if (OperatorPrecedence[(int)Token].InfixPrecedence != 0) { /* scan and collapse the stack, then push */ + Precedence = BracketPrecedence + OperatorPrecedence[(int)Token].InfixPrecedence; + + /* for right to left order, only go down to the next higher precedence so we evaluate it in reverse order */ + /* for left to right order, collapse down to this precedence so we evaluate it in forward order */ + if (IS_LEFT_TO_RIGHT(OperatorPrecedence[(int)Token].InfixPrecedence)) + ExpressionStackCollapse(Parser, &StackTop, Precedence, &IgnorePrecedence); + else + ExpressionStackCollapse(Parser, &StackTop, Precedence+1, &IgnorePrecedence); + if (Token == TokenDot || Token == TokenArrow) + { ExpressionGetStructElement(Parser, &StackTop, Token); /* this operator is followed by a struct element so handle it as a special case */ + } else { - /* a standard infix operator */ - Precedence = BracketPrecedence + OperatorPrecedence[(int)Token].InfixPrecedence; - - /* for right to left order, only go down to the next higher precedence so we evaluate it in reverse order */ - /* for left to right order, collapse down to this precedence so we evaluate it in forward order */ - if (IS_LEFT_TO_RIGHT(OperatorPrecedence[(int)Token].InfixPrecedence)) - ExpressionStackCollapse(Parser, &StackTop, Precedence, &IgnorePrecedence); - else - ExpressionStackCollapse(Parser, &StackTop, Precedence+1, &IgnorePrecedence); - /* if it's a && or || operator we may not need to evaluate the right hand side of the expression */ if ( (Token == TokenLogicalOr || Token == TokenLogicalAnd) && IS_NUMERIC_COERCIBLE(StackTop->Val)) { diff --git a/tests/50_logical_second_arg.c b/tests/50_logical_second_arg.c index 898afbd..f4be825 100644 --- a/tests/50_logical_second_arg.c +++ b/tests/50_logical_second_arg.c @@ -19,8 +19,8 @@ int main() printf("%d\n", joe() && fred()); printf("%d\n", joe() || fred()); printf("%d\n", fred() && (1 + joe())); - printf("%d\n", fred() || (1 + joe())); - printf("%d\n", joe() && (1 + fred())); + printf("%d\n", fred() || (0 + joe())); + printf("%d\n", joe() && (0 + fred())); printf("%d\n", joe() || (1 + fred())); return 0; diff --git a/tests/50_logical_second_arg.expect b/tests/50_logical_second_arg.expect index 526de95..d6174ae 100644 --- a/tests/50_logical_second_arg.expect +++ b/tests/50_logical_second_arg.expect @@ -15,6 +15,6 @@ joe 1 joe fred -1 -joe 0 +joe +1