diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/AST/ASTContext.h | 3 | ||||
-rw-r--r-- | clang/include/clang/AST/Type.h | 6 | ||||
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 17 | ||||
-rw-r--r-- | clang/lib/AST/Type.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Sema/SemaType.cpp | 13 | ||||
-rw-r--r-- | clang/test/Sema/objc-protocol-1.m | 4 |
6 files changed, 23 insertions, 24 deletions
diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h index c981aa4116b..0def9881402 100644 --- a/clang/include/clang/AST/ASTContext.h +++ b/clang/include/clang/AST/ASTContext.h @@ -217,8 +217,7 @@ public: /// getObjCQualifiedIdType - Return an ObjCQualifiedIdType for a /// given 'id' and conforming protocol list. - QualType getObjCQualifiedIdType(QualType idType, - ObjCProtocolDecl **ProtocolList, + QualType getObjCQualifiedIdType(ObjCProtocolDecl **ProtocolList, unsigned NumProtocols); diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 22f7abaf49b..28f6e8cf932 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -1227,8 +1227,8 @@ class ObjCQualifiedIdType : public Type, // 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 @@ public: 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) { diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 54cc8e00683..dedc9b8376a 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -929,8 +929,7 @@ QualType ASTContext::getObjCQualifiedInterfaceType(ObjCInterfaceDecl *Decl, /// 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 @@ QualType ASTContext::getObjCQualifiedIdType(QualType idType, 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); diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index 275406eabac..08f889a4bf8 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -743,8 +743,8 @@ void ObjCQualifiedInterfaceType::Profile(llvm::FoldingSetNodeID &ID) { } 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]); } diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 4bee2de9948..85a457bd562 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -43,6 +43,14 @@ QualType Sema::ConvertDeclSpecToType(const DeclSpec &DS) { } 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 @@ QualType Sema::ConvertDeclSpecToType(const DeclSpec &DS) { 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; diff --git a/clang/test/Sema/objc-protocol-1.m b/clang/test/Sema/objc-protocol-1.m index f0615a32bea..3ace0ac3de0 100644 --- a/clang/test/Sema/objc-protocol-1.m +++ b/clang/test/Sema/objc-protocol-1.m @@ -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}} } |