diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2009-06-02 05:28:56 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2009-06-02 05:28:56 +0000 |
commit | 07d258756dc856c6987c394a0972884e6ed46765 (patch) | |
tree | 590cc1ca869affe373d84edcd5d2165c68938309 /lib/AST/ASTContext.cpp | |
parent | 22869e69c0076b683497d4856beb6400eca86f4b (diff) |
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
Diffstat (limited to 'lib/AST/ASTContext.cpp')
-rw-r--r-- | lib/AST/ASTContext.cpp | 43 |
1 files changed, 26 insertions, 17 deletions
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<ExtQualType>(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<ExtQualType>(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: |