]> granicus.if.org Git - clang/commitdiff
Make sure the arithmetic conversion are done for relation and equality operators.
authorSteve Naroff <snaroff@apple.com>
Fri, 10 Aug 2007 18:26:40 +0000 (18:26 +0000)
committerSteve Naroff <snaroff@apple.com>
Fri, 10 Aug 2007 18:26:40 +0000 (18:26 +0000)
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

Sema/SemaExpr.cpp

index 22f8805b6b2a798fc74c900a7ebe79e4d48b8462..8a3576aaf3a242e0ead26add7146cf770672c627 100644 (file)
@@ -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();