Make sure to allow assigning a pointer to a bool.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51778 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 7f80203..500d5b7 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -1267,10 +1267,10 @@
 Sema::CheckAssignmentConstraints(QualType lhsType, QualType rhsType) {
   // Get canonical types.  We're not formatting these types, just comparing
   // them.
-  lhsType = lhsType.getCanonicalType();
-  rhsType = rhsType.getCanonicalType();
-  
-  if (lhsType.getUnqualifiedType() == rhsType.getUnqualifiedType())
+  lhsType = lhsType.getCanonicalType().getUnqualifiedType();
+  rhsType = rhsType.getCanonicalType().getUnqualifiedType();
+
+  if (lhsType == rhsType)
     return Compatible; // Common case: fast path an exact match.
 
   if (lhsType->isReferenceType() || rhsType->isReferenceType()) {
@@ -1278,7 +1278,7 @@
       return Compatible;
     return Incompatible;
   }
-  
+
   if (lhsType->isObjCQualifiedIdType() || rhsType->isObjCQualifiedIdType()) {
     if (ObjCQualifiedIdTypesAreCompatible(lhsType, rhsType, false))
       return Compatible;
@@ -1291,7 +1291,7 @@
       if (LV->getElementType().getTypePtr() == rhsType.getTypePtr())
         return Compatible;
     }
-    
+
     // If LHS and RHS are both vectors of integer or both vectors of floating
     // point types, and the total vector length is the same, allow the
     // conversion.  This is a bitcast; no bits are changed but the result type
@@ -1306,14 +1306,14 @@
     }
     return Incompatible;
   }      
-  
+
   if (lhsType->isArithmeticType() && rhsType->isArithmeticType())
     return Compatible;
-  
+
   if (isa<PointerType>(lhsType)) {
     if (rhsType->isIntegerType())
       return IntToPointer;
-      
+
     if (isa<PointerType>(rhsType))
       return CheckPointerTypesForAssignment(lhsType, rhsType);
     return Incompatible;
@@ -1321,14 +1321,17 @@
 
   if (isa<PointerType>(rhsType)) {
     // C99 6.5.16.1p1: the left operand is _Bool and the right is a pointer.
-    if (lhsType->isIntegerType() && lhsType != Context.BoolTy)
+    if (lhsType == Context.BoolTy)
+      return Compatible;
+
+    if (lhsType->isIntegerType())
       return PointerToInt;
 
     if (isa<PointerType>(lhsType)) 
       return CheckPointerTypesForAssignment(lhsType, rhsType);
     return Incompatible;
   }
-  
+
   if (isa<TagType>(lhsType) && isa<TagType>(rhsType)) {
     if (Context.typesAreCompatible(lhsType, rhsType))
       return Compatible;
diff --git a/test/Sema/init.c b/test/Sema/init.c
index ffe678c..efc934d 100644
--- a/test/Sema/init.c
+++ b/test/Sema/init.c
@@ -42,3 +42,11 @@
 
   return bp;
 }
+
+int pbool(void) {
+  typedef const _Bool cbool;
+  _Bool pbool1 = (void *) 0;
+  cbool pbool2 = &pbool;
+  return pbool2;
+}
+