From: Chris Lattner Date: Mon, 5 May 2008 04:10:51 +0000 (+0000) Subject: fix a bug handling right associative operators that Neil noticed, hopefully X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9e66ba6d1c1c0e11b261e3b20ff02b999621021a;p=clang fix a bug handling right associative operators that Neil noticed, hopefully the final part of PR2279 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50635 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Lex/PPExpressions.cpp b/lib/Lex/PPExpressions.cpp index 9fda8b0862..ff0578067c 100644 --- a/lib/Lex/PPExpressions.cpp +++ b/lib/Lex/PPExpressions.cpp @@ -294,19 +294,8 @@ static bool EvaluateValue(llvm::APSInt &Result, Token &PeekTok, /// getPrecedence - Return the precedence of the specified binary operator /// token. This returns: /// ~0 - Invalid token. -/// 14 - *,/,% -/// 13 - -,+ -/// 12 - <<,>> -/// 11 - >=, <=, >, < -/// 10 - ==, != -/// 9 - & -/// 8 - ^ -/// 7 - | -/// 6 - && -/// 5 - || -/// 4 - ? -/// 3 - : -/// 0 - eom, ) +/// 14 -> 3 - various operators. +/// 0 - 'eom' or ')' static unsigned getPrecedence(tok::TokenKind Kind) { switch (Kind) { default: return ~0U; @@ -402,7 +391,8 @@ static bool EvaluateDirectiveSubExpr(llvm::APSInt &LHS, unsigned MinPrec, // more tightly with RHS than we do, evaluate it completely first. if (ThisPrec < PeekPrec || (ThisPrec == PeekPrec && isRightAssoc)) { - if (EvaluateDirectiveSubExpr(RHS, ThisPrec+1, PeekTok, RHSIsLive, PP)) + if (EvaluateDirectiveSubExpr(RHS, ThisPrec+!isRightAssoc, + PeekTok, RHSIsLive, PP)) return true; PeekPrec = getPrecedence(PeekTok.getKind()); } diff --git a/test/Preprocessor/expr_liveness.c b/test/Preprocessor/expr_liveness.c index 61c073204c..da30616284 100644 --- a/test/Preprocessor/expr_liveness.c +++ b/test/Preprocessor/expr_liveness.c @@ -26,6 +26,9 @@ bar #error #endif +// PR2279 +#if 1 ? 2 ? 3 : 4 : 5 +#endif #else