[cfe-commits] r72715 - /cfe/trunk/lib/AST/ASTContext.cpp
Eli Friedman
eli.friedman at gmail.com
Mon Jun 1 22:28:57 PDT 2009
Author: efriedma
Date: Tue Jun 2 00:28:56 2009
New Revision: 72715
URL: http://llvm.org/viewvc/llvm-project?rev=72715&view=rev
Log:
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.
Modified:
cfe/trunk/lib/AST/ASTContext.cpp
Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=72715&r1=72714&r2=72715&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Tue Jun 2 00:28:56 2009
@@ -3028,18 +3028,33 @@
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 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:
More information about the cfe-commits
mailing list