forked from OSchip/llvm-project
This patch attempts to fix the merging of __strong/__weak attributes
in merge_types. It is incomplete. We probably want to issue a warning if user attempts to change the attribute from __weak to __strong or vice-vera. It also assumes that a __weak/__strong attribute can not be specified with other (currently one) type attriute. llvm-svn: 72711
This commit is contained in:
parent
836894405f
commit
2d725b19da
|
@ -3028,6 +3028,20 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) {
|
||||||
if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
|
if (LHSClass == Type::FunctionProto) LHSClass = Type::FunctionNoProto;
|
||||||
if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
|
if (RHSClass == Type::FunctionProto) RHSClass = Type::FunctionNoProto;
|
||||||
|
|
||||||
|
QualType::GCAttrTypes RHSGCAttr = QualType::GCNone;
|
||||||
|
QualType::GCAttrTypes LHSGCAttr = QualType::GCNone;
|
||||||
|
if (RHSClass == Type::ExtQual) {
|
||||||
|
RHSGCAttr = RHSCan.getObjCGCAttr();
|
||||||
|
if (RHSGCAttr != QualType::GCNone)
|
||||||
|
RHSClass = RHSCan.getUnqualifiedType()->getTypeClass();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (LHSClass == Type::ExtQual) {
|
||||||
|
LHSGCAttr = LHSCan.getObjCGCAttr();
|
||||||
|
if (LHSGCAttr != QualType::GCNone)
|
||||||
|
LHSClass = LHSCan.getUnqualifiedType()->getTypeClass();
|
||||||
|
}
|
||||||
|
|
||||||
// Same as above for arrays
|
// Same as above for arrays
|
||||||
if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
|
if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray)
|
||||||
LHSClass = Type::ConstantArray;
|
LHSClass = Type::ConstantArray;
|
||||||
|
@ -3125,10 +3139,16 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) {
|
||||||
QualType RHSPointee = RHS->getAsPointerType()->getPointeeType();
|
QualType RHSPointee = RHS->getAsPointerType()->getPointeeType();
|
||||||
QualType ResultType = mergeTypes(LHSPointee, RHSPointee);
|
QualType ResultType = mergeTypes(LHSPointee, RHSPointee);
|
||||||
if (ResultType.isNull()) return QualType();
|
if (ResultType.isNull()) return QualType();
|
||||||
if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType))
|
if (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) {
|
||||||
|
if (RHSGCAttr != LHSGCAttr && RHSGCAttr != QualType::GCNone)
|
||||||
|
LHS = getObjCGCQualType(LHS, RHSGCAttr);
|
||||||
return LHS;
|
return LHS;
|
||||||
if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType))
|
}
|
||||||
|
if (getCanonicalType(RHSPointee) == getCanonicalType(ResultType)) {
|
||||||
|
if (RHSGCAttr != LHSGCAttr && LHSGCAttr != QualType::GCNone)
|
||||||
|
RHS = getObjCGCQualType(RHS, LHSGCAttr);
|
||||||
return RHS;
|
return RHS;
|
||||||
|
}
|
||||||
return getPointerType(ResultType);
|
return getPointerType(ResultType);
|
||||||
}
|
}
|
||||||
case Type::BlockPointer:
|
case Type::BlockPointer:
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
// RUN: clang-cc -triple i386-apple-darwin9 -fobjc-gc -fsyntax-only -verify %s
|
// RUN: clang-cc -triple i386-apple-darwin9 -fobjc-gc -fsyntax-only -verify %s
|
||||||
// This is really dangerous! Disabling for now until we work out what's
|
|
||||||
// supposed to happen here.
|
|
||||||
// XFAIL
|
|
||||||
@interface INTF @end
|
@interface INTF @end
|
||||||
|
|
||||||
extern INTF* p2;
|
extern INTF* p2;
|
||||||
|
|
Loading…
Reference in New Issue