]> granicus.if.org Git - clang/commitdiff
Fix canonicalization of protocol-qualified types
authorDouglas Gregor <dgregor@apple.com>
Mon, 2 Jan 2012 02:00:30 +0000 (02:00 +0000)
committerDouglas Gregor <dgregor@apple.com>
Mon, 2 Jan 2012 02:00:30 +0000 (02:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147421 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTContext.cpp
lib/Rewrite/RewriteObjC.cpp

index a990989b20f28cd38bb7c0e9699df0ee1ec29c70..514a013e93810b7e2a0e1f4fc6dd705c29e2e65b 100644 (file)
@@ -2710,8 +2710,12 @@ static bool areSortedAndUniqued(ObjCProtocolDecl * const *Protocols,
                                 unsigned NumProtocols) {
   if (NumProtocols == 0) return true;
 
+  if (Protocols[0]->getCanonicalDecl() != Protocols[0])
+    return false;
+  
   for (unsigned i = 1; i != NumProtocols; ++i)
-    if (!CmpProtocolNames(Protocols[i-1], Protocols[i]))
+    if (!CmpProtocolNames(Protocols[i-1], Protocols[i]) ||
+        Protocols[i]->getCanonicalDecl() != Protocols[i])
       return false;
   return true;
 }
@@ -2723,6 +2727,10 @@ static void SortAndUniqueProtocols(ObjCProtocolDecl **Protocols,
   // Sort protocols, keyed by name.
   std::sort(Protocols, Protocols+NumProtocols, CmpProtocolNames);
 
+  // Canonicalize.
+  for (unsigned I = 0, N = NumProtocols; I != N; ++I)
+    Protocols[I] = Protocols[I]->getCanonicalDecl();
+  
   // Remove duplicates.
   ProtocolsEnd = std::unique(Protocols, ProtocolsEnd);
   NumProtocols = ProtocolsEnd-Protocols;
index 19277e8ea45e33e92fda7d6688b44f7e7e08f903..5cf1b11ad9a821da4b93d0ec85c955f85b3d37e9 100644 (file)
@@ -990,7 +990,8 @@ void RewriteObjC::RewriteCategoryDecl(ObjCCategoryDecl *CatDecl) {
 
 void RewriteObjC::RewriteProtocolDecl(ObjCProtocolDecl *PDecl) {
   SourceLocation LocStart = PDecl->getLocStart();
-
+  assert(PDecl->isThisDeclarationADefinition());
+  
   // FIXME: handle protocol headers that are declared across multiple lines.
   ReplaceText(LocStart, 0, "// ");
 
@@ -5223,6 +5224,9 @@ void RewriteObjCFragileABI::RewriteObjCProtocolMetaData(
   if (ObjCSynthesizedProtocols.count(PDecl->getCanonicalDecl()))
     return;
   
+  if (ObjCProtocolDecl *Def = PDecl->getDefinition())
+    PDecl = Def;
+  
   if (PDecl->instmeth_begin() != PDecl->instmeth_end()) {
     unsigned NumMethods = std::distance(PDecl->instmeth_begin(),
                                         PDecl->instmeth_end());