Fix ASTContext::typesAreCompatible to allow for int/enum compatibility (C99 6.7.2.2p4).
Fix Sema::MergeFunctionDecl to allow for function type compatibility (by using the predicate on ASTContext). Function types don't have to be identical to be compatible...


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45784 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/AST/ASTContext.cpp b/AST/ASTContext.cpp
index e8e5bcc..582babb 100644
--- a/AST/ASTContext.cpp
+++ b/AST/ASTContext.cpp
@@ -1618,15 +1618,23 @@
   if (rcanon->getTypeClass() == Type::Reference)
     rcanon = cast<ReferenceType>(rcanon)->getReferenceeType();
   
-  // If the canonical type classes don't match, they can't be compatible
+  // If the canonical type classes don't match...
   if (lcanon->getTypeClass() != rcanon->getTypeClass()) {
     // For Objective-C, it is possible for two types to be compatible
     // when their classes don't match (when dealing with "id"). If either type
     // is an interface, we defer to objcTypesAreCompatible(). 
     if (lcanon->isObjCInterfaceType() || rcanon->isObjCInterfaceType())
       return objcTypesAreCompatible(lcanon, rcanon);
+	  
+	// C99 6.7.2.2p4: Each enumerated type shall be compatible with char,
+	// a signed integer type, or an unsigned integer type.
+	if ((lcanon->isEnumeralType() && rcanon->isIntegralType()) ||
+	    (rcanon->isEnumeralType() && lcanon->isIntegralType()))
+	  return true;
+	  
     return false;
   }
+  // The canonical type classes match.
   switch (lcanon->getTypeClass()) {
     case Type::Pointer:
       return pointerTypesAreCompatible(lcanon, rcanon);