[cfe-commits] r45665 - /cfe/trunk/Sema/SemaExpr.cpp

Chris Lattner sabre at nondot.org
Sun Jan 6 14:42:31 PST 2008


Author: lattner
Date: Sun Jan  6 16:42:25 2008
New Revision: 45665

URL: http://llvm.org/viewvc/llvm-project?rev=45665&view=rev
Log:
some simplifications/cleanups to ?: sema.

Modified:
    cfe/trunk/Sema/SemaExpr.cpp

Modified: cfe/trunk/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/SemaExpr.cpp?rev=45665&r1=45664&r2=45665&view=diff

==============================================================================
--- cfe/trunk/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/Sema/SemaExpr.cpp Sun Jan  6 16:42:25 2008
@@ -765,23 +765,32 @@
          condT.getAsString());
     return QualType();
   }
-  // now check the two expressions.
-  if (lexT->isArithmeticType() && rexT->isArithmeticType()) { // C99 6.5.15p3,5
+  
+  // Now check the two expressions.
+  
+  // If both operands have arithmetic type, do the usual arithmetic conversions
+  // to find a common type: C99 6.5.15p3,5.
+  if (lexT->isArithmeticType() && rexT->isArithmeticType()) {
     UsualArithmeticConversions(lex, rex);
     return lex->getType();
   }
+  
+  // If both operands are the same structure or union type, the result is that
+  // type.
   if (const RecordType *LHSRT = lexT->getAsRecordType()) {    // C99 6.5.15p3
-    if (const RecordType *RHSRT = rexT->getAsRecordType()) {
+    if (const RecordType *RHSRT = rexT->getAsRecordType())
       if (LHSRT->getDecl() == RHSRT->getDecl())
-        return lexT;
-      
-      Diag(questionLoc, diag::err_typecheck_cond_incompatible_operands,
-           lexT.getAsString(), rexT.getAsString(),
-           lex->getSourceRange(), rex->getSourceRange());
-      return QualType();
-    }
+        // "If both the operands have structure or union type, the result has 
+        // that type."  This implies that CV qualifiers are dropped.
+        return lexT.getUnqualifiedType();
   }
-  // C99 6.5.15p3
+  
+  // C99 6.5.15p5: "If both operands have void type, the result has void type."
+  if (lexT->isVoidType() && rexT->isVoidType())
+    return lexT.getUnqualifiedType();
+  
+  // C99 6.5.15p6 - "if one operand is a null pointer constant, the result has
+  // the type of the other operand."
   if (lexT->isPointerType() && rex->isNullPointerConstant(Context)) {
     promoteExprToType(rex, lexT); // promote the null to a pointer.
     return lexT;
@@ -820,9 +829,7 @@
     }
   }
   
-  if (lexT->isVoidType() && rexT->isVoidType()) // C99 6.5.15p3
-    return lexT;
-    
+  // Otherwise, the operands are not compatible.
   Diag(questionLoc, diag::err_typecheck_cond_incompatible_operands,
        lexT.getAsString(), rexT.getAsString(),
        lex->getSourceRange(), rex->getSourceRange());





More information about the cfe-commits mailing list