[cfe-commits] r54083 - in /cfe/trunk: include/clang/AST/ASTContext.h include/clang/AST/Type.h lib/AST/ASTContext.cpp lib/AST/Type.cpp lib/Sema/SemaType.cpp test/Sema/objc-protocol-1.m

Chris Lattner sabre at nondot.org
Fri Jul 25 17:46:51 PDT 2008


Author: lattner
Date: Fri Jul 25 19:46:50 2008
New Revision: 54083

URL: http://llvm.org/viewvc/llvm-project?rev=54083&view=rev
Log:
fix several problems with the protocol qualified id handling where id was implicit.

First, fix canonical type handling of these, since protocol qualified id's are always
canonical.  Next, enhance SemaType to actually make these when used (instead of int)
allowing them to actually be used when appropriate.  Finally remove a bunch of logic
relating to the mishandling of canonical types with protocol-qual id's.  This fixes
rdar://5986251

Modified:
    cfe/trunk/include/clang/AST/ASTContext.h
    cfe/trunk/include/clang/AST/Type.h
    cfe/trunk/lib/AST/ASTContext.cpp
    cfe/trunk/lib/AST/Type.cpp
    cfe/trunk/lib/Sema/SemaType.cpp
    cfe/trunk/test/Sema/objc-protocol-1.m

Modified: cfe/trunk/include/clang/AST/ASTContext.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=54083&r1=54082&r2=54083&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/ASTContext.h (original)
+++ cfe/trunk/include/clang/AST/ASTContext.h Fri Jul 25 19:46:50 2008
@@ -217,8 +217,7 @@
   
   /// getObjCQualifiedIdType - Return an ObjCQualifiedIdType for a 
   /// given 'id' and conforming protocol list.
-  QualType getObjCQualifiedIdType(QualType idType,
-                                  ObjCProtocolDecl **ProtocolList, 
+  QualType getObjCQualifiedIdType(ObjCProtocolDecl **ProtocolList, 
                                   unsigned NumProtocols);
                                   
 

Modified: cfe/trunk/include/clang/AST/Type.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Type.h?rev=54083&r1=54082&r2=54083&view=diff

==============================================================================
--- cfe/trunk/include/clang/AST/Type.h (original)
+++ cfe/trunk/include/clang/AST/Type.h Fri Jul 25 19:46:50 2008
@@ -1227,8 +1227,8 @@
   // List is sorted on protocol name. No protocol is enterred more than once.
   llvm::SmallVector<ObjCProtocolDecl*, 8> Protocols;
     
-  ObjCQualifiedIdType(QualType can, ObjCProtocolDecl **Protos,  unsigned NumP)
-  : Type(ObjCQualifiedId, can), 
+  ObjCQualifiedIdType(ObjCProtocolDecl **Protos, unsigned NumP)
+    : Type(ObjCQualifiedId, QualType()/*these are always canonical*/), 
   Protocols(Protos, Protos+NumP) { }
   friend class ASTContext;  // ASTContext creates these.
 public:
@@ -1250,7 +1250,7 @@
   virtual void getAsStringInternal(std::string &InnerString) const;
     
   void Profile(llvm::FoldingSetNodeID &ID);
-  static void Profile(llvm::FoldingSetNodeID &ID, 
+  static void Profile(llvm::FoldingSetNodeID &ID,
                       ObjCProtocolDecl **protocols, unsigned NumProtocols);
     
   static bool classof(const Type *T) { 

Modified: cfe/trunk/lib/AST/ASTContext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=54083&r1=54082&r2=54083&view=diff

==============================================================================
--- cfe/trunk/lib/AST/ASTContext.cpp (original)
+++ cfe/trunk/lib/AST/ASTContext.cpp Fri Jul 25 19:46:50 2008
@@ -929,8 +929,7 @@
 
 /// getObjCQualifiedIdType - Return an ObjCQualifiedIdType for the 'id' decl
 /// and the conforming protocol list.
-QualType ASTContext::getObjCQualifiedIdType(QualType idType,
-                                            ObjCProtocolDecl **Protocols, 
+QualType ASTContext::getObjCQualifiedIdType(ObjCProtocolDecl **Protocols, 
                                             unsigned NumProtocols) {
   // Sort the protocol list alphabetically to canonicalize it.
   SortAndUniqueProtocols(Protocols, NumProtocols);
@@ -940,21 +939,11 @@
   
   void *InsertPos = 0;
   if (ObjCQualifiedIdType *QT =
-      ObjCQualifiedIdTypes.FindNodeOrInsertPos(ID, InsertPos))
+        ObjCQualifiedIdTypes.FindNodeOrInsertPos(ID, InsertPos))
     return QualType(QT, 0);
   
   // No Match;
-  QualType Canonical;
-  if (!idType->isCanonical()) {
-    Canonical = getObjCQualifiedIdType(getCanonicalType(idType), 
-                                       Protocols, NumProtocols);
-    ObjCQualifiedIdType *NewQT = 
-      ObjCQualifiedIdTypes.FindNodeOrInsertPos(ID, InsertPos);
-    assert(NewQT == 0 && "Shouldn't be in the map!");
-  }
-  
-  ObjCQualifiedIdType *QType = 
-    new ObjCQualifiedIdType(Canonical, Protocols, NumProtocols);
+  ObjCQualifiedIdType *QType = new ObjCQualifiedIdType(Protocols, NumProtocols);
   Types.push_back(QType);
   ObjCQualifiedIdTypes.InsertNode(QType, InsertPos);
   return QualType(QType, 0);

Modified: cfe/trunk/lib/AST/Type.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=54083&r1=54082&r2=54083&view=diff

==============================================================================
--- cfe/trunk/lib/AST/Type.cpp (original)
+++ cfe/trunk/lib/AST/Type.cpp Fri Jul 25 19:46:50 2008
@@ -743,8 +743,8 @@
 }
 
 void ObjCQualifiedIdType::Profile(llvm::FoldingSetNodeID &ID,
-                                         ObjCProtocolDecl **protocols, 
-                                         unsigned NumProtocols) {
+                                  ObjCProtocolDecl **protocols, 
+                                  unsigned NumProtocols) {
   for (unsigned i = 0; i != NumProtocols; i++)
     ID.AddPointer(protocols[i]);
 }

Modified: cfe/trunk/lib/Sema/SemaType.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=54083&r1=54082&r2=54083&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaType.cpp (original)
+++ cfe/trunk/lib/Sema/SemaType.cpp Fri Jul 25 19:46:50 2008
@@ -43,6 +43,14 @@
     }
     break;
   case DeclSpec::TST_unspecified:
+    // "<proto1,proto2>" is an objc qualified ID with a missing id.
+    if (llvm::SmallVector<Action::DeclTy *, 8> *PQ=DS.getProtocolQualifiers()) {
+      Action::DeclTy **PPDecl = &(*PQ)[0];
+      Result = Context.getObjCQualifiedIdType((ObjCProtocolDecl**)(PPDecl),
+                                              DS.getNumProtocolQualifiers());
+      break;
+    }
+      
     // Unspecified typespec defaults to int in C90.  However, the C90 grammar
     // [C90 6.5] only allows a decl-spec if there was *some* type-specifier,
     // type-qualifier, or storage-class-specifier.  If not, emit an extwarn.
@@ -128,13 +136,12 @@
                                    reinterpret_cast<ObjCProtocolDecl**>(PPDecl),
                                                  DS.getNumProtocolQualifiers());
       break;
-    }
-    else if (TypedefDecl *typeDecl = dyn_cast<TypedefDecl>(D)) {
+    } else if (TypedefDecl *typeDecl = dyn_cast<TypedefDecl>(D)) {
       if (Context.getObjCIdType() == Context.getTypedefType(typeDecl)
           && DS.getProtocolQualifiers()) {
           // id<protocol-list>
         Action::DeclTy **PPDecl = &(*DS.getProtocolQualifiers())[0];
-        Result = Context.getObjCQualifiedIdType(typeDecl->getUnderlyingType(),
+        Result = Context.getObjCQualifiedIdType(
                                  reinterpret_cast<ObjCProtocolDecl**>(PPDecl),
                                             DS.getNumProtocolQualifiers());
         break;

Modified: cfe/trunk/test/Sema/objc-protocol-1.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/objc-protocol-1.m?rev=54083&r1=54082&r2=54083&view=diff

==============================================================================
--- cfe/trunk/test/Sema/objc-protocol-1.m (original)
+++ cfe/trunk/test/Sema/objc-protocol-1.m Fri Jul 25 19:46:50 2008
@@ -1,10 +1,14 @@
 // RUN: clang -fsyntax-only -verify %s
+// rdar://5986251
 
 @protocol SomeProtocol
+- (void) bar;
 @end
 
 void foo(id x) {
   bar((short<SomeProtocol>)x); // expected-error {{expected ')'}} expected-error {{to match this '('}}
   bar((<SomeProtocol>)x);      // expected-warning {{protocol qualifiers without 'id' is archaic}}
+
+  [(<SomeProtocol>)x bar];      // expected-warning {{protocol qualifiers without 'id' is archaic}}
 }
 





More information about the cfe-commits mailing list