From 585f7b2f5c818d7579cffc91590bdc9e3d8b645d Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Tue, 2 Jun 2009 01:40:22 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72711 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/ASTContext.cpp | 24 ++++++++++++++++++-- test/SemaObjC/objc2-merge-gc-attribue-decl.m | 3 --- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index a4b9acc110..28325edbd4 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -3028,6 +3028,20 @@ 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; + 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 if (LHSClass == Type::VariableArray || LHSClass == Type::IncompleteArray) LHSClass = Type::ConstantArray; @@ -3125,10 +3139,16 @@ 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 (getCanonicalType(LHSPointee) == getCanonicalType(ResultType)) { + if (RHSGCAttr != LHSGCAttr && RHSGCAttr != QualType::GCNone) + LHS = getObjCGCQualType(LHS, RHSGCAttr); 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 getPointerType(ResultType); } case Type::BlockPointer: diff --git a/test/SemaObjC/objc2-merge-gc-attribue-decl.m b/test/SemaObjC/objc2-merge-gc-attribue-decl.m index 452d0cf334..0b48383422 100644 --- a/test/SemaObjC/objc2-merge-gc-attribue-decl.m +++ b/test/SemaObjC/objc2-merge-gc-attribue-decl.m @@ -1,7 +1,4 @@ // 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 extern INTF* p2; -- 2.40.0