]> granicus.if.org Git - clang/commitdiff
This patch attempts to fix the merging of __strong/__weak attributes
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 2 Jun 2009 01:40:22 +0000 (01:40 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 2 Jun 2009 01:40:22 +0000 (01:40 +0000)
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
test/SemaObjC/objc2-merge-gc-attribue-decl.m

index a4b9acc110d6860c3267d31a0a08f969be9b19e0..28325edbd40a81e21e9797a63b5d72ae2dc952d3 100644 (file)
@@ -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:
index 452d0cf3344586ae65d4ed8436d2314ffc611aee..0b483834226786fa32db7052bfda33e0df2527d8 100644 (file)
@@ -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;