]> granicus.if.org Git - clang/commitdiff
Fix some issues with array type merging. (No visible difference,
authorEli Friedman <eli.friedman@gmail.com>
Fri, 22 Aug 2008 01:48:21 +0000 (01:48 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Fri, 22 Aug 2008 01:48:21 +0000 (01:48 +0000)
because nothing uses the merged types yet.)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@55161 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTContext.cpp

index b8b15628d7dcc97be56f1a6da06e8acfa42b2b1a..bb8743babd15ff23c0dd5c359c4a4291acf5d1f4 100644 (file)
@@ -1849,8 +1849,8 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) {
     QualType RHSPointee = RHS->getAsPointerType()->getPointeeType();
     QualType ResultType = mergeTypes(LHSPointee, RHSPointee);
     if (ResultType.isNull()) return QualType();
-    if (getCanonicalType(LHSPointee) != getCanonicalType(ResultType)) return LHS;
-    if (getCanonicalType(RHSPointee) != getCanonicalType(ResultType)) return RHS;
+    if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) return LHS;
+    if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) return RHS;
     return getPointerType(ResultType);
   }
   case Type::ConstantArray:
@@ -1864,12 +1864,16 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) {
     QualType RHSElem = getAsArrayType(RHS)->getElementType();
     QualType ResultType = mergeTypes(LHSElem, RHSElem);
     if (ResultType.isNull()) return QualType();
-    if (LCAT && getCanonicalType(LHSElem) != getCanonicalType(ResultType)) return LHS;
-    if (RCAT && getCanonicalType(RHSElem) != getCanonicalType(ResultType)) return RHS;
+    if (LCAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType)) return LHS;
+    if (RCAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType)) return RHS;
+    if (LCAT) return getConstantArrayType(ResultType, LCAT->getSize(),
+                                          ArrayType::ArraySizeModifier(), 0);
+    if (RCAT) return getConstantArrayType(ResultType, RCAT->getSize(),
+                                          ArrayType::ArraySizeModifier(), 0);
     const VariableArrayType* LVAT = getAsVariableArrayType(LHS);
     const VariableArrayType* RVAT = getAsVariableArrayType(RHS);
-    if (LVAT && getCanonicalType(LHSElem) != getCanonicalType(ResultType)) return LHS;
-    if (RVAT && getCanonicalType(RHSElem) != getCanonicalType(ResultType)) return RHS;
+    if (LVAT && getCanonicalType(LHSElem) == getCanonicalType(ResultType)) return LHS;
+    if (RVAT && getCanonicalType(RHSElem) == getCanonicalType(ResultType)) return RHS;
     if (LVAT) {
       // FIXME: This isn't correct! But tricky to implement because
       // the array's size has to be the size of LHS, but the type
@@ -1882,8 +1886,8 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) {
       // has to be different.
       return RHS;
     }
-    if (getCanonicalType(LHSElem) != getCanonicalType(ResultType)) return LHS;
-    if (getCanonicalType(RHSElem) != getCanonicalType(ResultType)) return RHS;
+    if (getCanonicalType(LHSElem) == getCanonicalType(ResultType)) return LHS;
+    if (getCanonicalType(RHSElem) == getCanonicalType(ResultType)) return RHS;
     return getIncompleteArrayType(ResultType, ArrayType::ArraySizeModifier(), 0);
   }
   case Type::FunctionNoProto: