Fix <rdar://problem/5928590> clang -fsyntax-only: "incompatible operand types ('int' and 'void')" on input that 'gcc -fsyntax-only' eats


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51002 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 5341ee7..68a3f8d 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -856,9 +856,16 @@
   }
   
   // C99 6.5.15p5: "If both operands have void type, the result has void type."
-  if (lexT->isVoidType() && rexT->isVoidType())
+  // The following || allows only one side to be void (a GCC-ism).
+  if (lexT->isVoidType() || rexT->isVoidType()) {
+    if (!lexT->isVoidType())
+      Diag(rex->getLocStart(), diag::ext_typecheck_cond_one_void, 
+           rex->getSourceRange());
+    if (!rexT->isVoidType())
+      Diag(lex->getLocStart(), diag::ext_typecheck_cond_one_void,
+           lex->getSourceRange());    
     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)) {