From: Eli Friedman Date: Tue, 2 Jun 2009 05:28:56 +0000 (+0000) Subject: Cleaned-up version of gc attribute type merging. I still don't like it X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=07d258756dc856c6987c394a0972884e6ed46765;p=clang Cleaned-up version of gc attribute type merging. I still don't like it very much, but I have a feeling we're never going to have an implementation that makes sense because of compatibility issues. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72715 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 28325edbd4..6a7113c685 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -3028,18 +3028,33 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) { if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto; if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto; - QualType::GCAttrTypes RHSGCAttr = QualType::GCNone; - QualType::GCAttrTypes LHSGCAttr = QualType::GCNone; + // Strip off objc_gc attributes off the top level so they can be merged. + // This is a complete mess, but the attribute itself doesn't make much sense. if (RHSClass == Type::ExtQual) { - RHSGCAttr = RHSCan.getObjCGCAttr(); - if (RHSGCAttr != QualType::GCNone) - RHSClass = RHSCan.getUnqualifiedType()->getTypeClass(); + QualType::GCAttrTypes GCAttr = RHSCan.getObjCGCAttr(); + if (GCAttr != QualType::GCNone) { + RHS = QualType(cast(RHS.getDesugaredType())->getBaseType(), + RHS.getCVRQualifiers()); + QualType Result = mergeTypes(LHS, RHS); + if (Result.getObjCGCAttr() == QualType::GCNone) + Result = getObjCGCQualType(Result, GCAttr); + else if (Result.getObjCGCAttr() != GCAttr) + Result = QualType(); + return Result; + } } - if (LHSClass == Type::ExtQual) { - LHSGCAttr = LHSCan.getObjCGCAttr(); - if (LHSGCAttr != QualType::GCNone) - LHSClass = LHSCan.getUnqualifiedType()->getTypeClass(); + QualType::GCAttrTypes GCAttr = LHSCan.getObjCGCAttr(); + if (GCAttr != QualType::GCNone) { + LHS = QualType(cast(LHS.getDesugaredType())->getBaseType(), + LHS.getCVRQualifiers()); + QualType Result = mergeTypes(LHS, RHS); + if (Result.getObjCGCAttr() == QualType::GCNone) + Result = getObjCGCQualType(Result, GCAttr); + else if (Result.getObjCGCAttr() != GCAttr) + Result = QualType(); + getObjCGCQualType(Result, GCAttr); + } } // Same as above for arrays @@ -3139,16 +3154,10 @@ 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)) { - if (RHSGCAttr != LHSGCAttr && RHSGCAttr != QualType::GCNone) - LHS = getObjCGCQualType(LHS, RHSGCAttr); + if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) return LHS; - } - if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) { - if (RHSGCAttr != LHSGCAttr && LHSGCAttr != QualType::GCNone) - RHS = getObjCGCQualType(RHS, LHSGCAttr); + if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) return RHS; - } return getPointerType(ResultType); } case Type::BlockPointer: