[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