From: Steve Naroff Date: Fri, 10 Aug 2007 18:26:40 +0000 (+0000) Subject: Make sure the arithmetic conversion are done for relation and equality operators. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=30bf7710b5c64deb318752343bb80a70b3c53429;p=clang Make sure the arithmetic conversion are done for relation and equality operators. This fixes the following... eypedef short S; int test(S X, long long Y) { return X < Y; } Before... (CompoundStmt 0x2905d00 (ReturnStmt 0x2905cf0 (BinaryOperator 0x2905cd0 'int' '<' (ImplicitCastExpr 0x2905cc0 'int' (DeclRefExpr 0x2905c80 'S':'short' Decl='X' 0x2905c20)) (DeclRefExpr 0x2905ca0 'long long' Decl='Y' 0x2905c50)))) After... (CompoundStmt 0x2b05c30 (ReturnStmt 0x2b05c20 (BinaryOperator 0x2b05c00 'int' '<' (ImplicitCastExpr 0x2b05bf0 'long long' (DeclRefExpr 0x2b05bb0 'S':'short' Decl='X' 0x2b05b50)) (DeclRefExpr 0x2b05bd0 'long long' Decl='Y' 0x2b05b80)))) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40999 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Sema/SemaExpr.cpp b/Sema/SemaExpr.cpp index 22f8805b6b..8a3576aaf3 100644 --- a/Sema/SemaExpr.cpp +++ b/Sema/SemaExpr.cpp @@ -1026,8 +1026,13 @@ inline QualType Sema::CheckShiftOperands( // C99 6.5.7 inline QualType Sema::CheckRelationalOperands( // C99 6.5.8 Expr *&lex, Expr *&rex, SourceLocation loc) { - UsualUnaryConversions(lex); - UsualUnaryConversions(rex); + // C99 6.5.8p3 + if (lex->getType()->isArithmeticType() && rex->getType()->isArithmeticType()) + UsualArithmeticConversions(lex, rex); + else { + UsualUnaryConversions(lex); + UsualUnaryConversions(rex); + } QualType lType = lex->getType(); QualType rType = rex->getType(); @@ -1058,8 +1063,13 @@ inline QualType Sema::CheckRelationalOperands( // C99 6.5.8 inline QualType Sema::CheckEqualityOperands( // C99 6.5.9 Expr *&lex, Expr *&rex, SourceLocation loc) { - UsualUnaryConversions(lex); - UsualUnaryConversions(rex); + // C99 6.5.9p4 + if (lex->getType()->isArithmeticType() && rex->getType()->isArithmeticType()) + UsualArithmeticConversions(lex, rex); + else { + UsualUnaryConversions(lex); + UsualUnaryConversions(rex); + } QualType lType = lex->getType(); QualType rType = rex->getType();