if (Tok.getKind() == tok::less) {
llvm::SmallVector<IdentifierInfo *, 8> ProtocolRefs;
ParseObjCProtocolReferences(ProtocolRefs);
+ Actions.ActOnFindProtocolDeclaration(CurScope,
+ Loc,
+ &ProtocolRefs[0],
+ ProtocolRefs.size());
}
continue;
}
SourceLocation AtProtocolLoc,
IdentifierInfo **IdentList,
unsigned NumElts);
+
+ virtual DeclTy **ActOnFindProtocolDeclaration(Scope *S,
+ SourceLocation TypeLoc,
+ IdentifierInfo **ProtocolId,
+ unsigned NumProtocols);
virtual void ActOnAddMethodsToObjcDecl(Scope* S, DeclTy *ClassDecl,
DeclTy **allMethods, unsigned allNum);
IdentifierInfo *Id,
SourceLocation IdLoc) {
// Note that Protocols have their own namespace.
- ScopedDecl *PrDecl = LookupScopedDecl(Id, Decl::IDNS_Protocol,
- IdLoc, S);
+ ScopedDecl *PrDecl = NULL;
+ for (ScopedDecl *D = Id->getFETokenInfo<ScopedDecl>(); D; D = D->getNext()) {
+ if (D->getIdentifierNamespace() == Decl::IDNS_Protocol) {
+ PrDecl = D;
+ break;
+ }
+ }
+
if (PrDecl && !isa<ObjcProtocolDecl>(PrDecl))
PrDecl = 0;
return cast_or_null<ObjcProtocolDecl>(static_cast<Decl*>(PrDecl));
return PDecl;
}
+/// ActOnFindProtocolDeclaration - This routine looks for a previously
+/// declared protocol and returns it. If not found, issues diagnostic.
+/// Will build a list of previously protocol declarations found in the list.
+Action::DeclTy **
+Sema::ActOnFindProtocolDeclaration(Scope *S,
+ SourceLocation TypeLoc,
+ IdentifierInfo **ProtocolId,
+ unsigned NumProtocols) {
+ for (unsigned i = 0; i != NumProtocols; ++i) {
+ ObjcProtocolDecl *PDecl = getObjCProtocolDecl(S, ProtocolId[i],
+ TypeLoc);
+ if (!PDecl)
+ Diag(TypeLoc, diag::err_undeclared_protocol,
+ ProtocolId[i]->getName());
+ }
+ return 0;
+}
+
/// ActOnForwardProtocolDeclaration -
/// Scope will always be top level file scope.
Action::DeclTy *
DE06B73D0A8307640050E87E /* LangOptions.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = LangOptions.h; sourceTree = "<group>"; };
DE06BECA0A854E4B0050E87E /* Scope.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Scope.h; path = clang/Parse/Scope.h; sourceTree = "<group>"; };
DE06D42F0A8BB52D0050E87E /* Parser.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Parser.cpp; path = Parse/Parser.cpp; sourceTree = "<group>"; };
- DE06E8130A8FF9330050E87E /* Action.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Action.h; path = clang/Parse/Action.h; sourceTree = "<group>"; };
+ DE06E8130A8FF9330050E87E /* Action.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = Action.h; path = clang/Parse/Action.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
DE0FCA620A95859D00248FD5 /* Expr.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = Expr.h; path = clang/AST/Expr.h; sourceTree = "<group>"; };
DE0FCB330A9C21F100248FD5 /* Expr.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = Expr.cpp; path = AST/Expr.cpp; sourceTree = "<group>"; };
DE1732FF0B068B700080B521 /* ASTContext.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = ASTContext.cpp; path = AST/ASTContext.cpp; sourceTree = "<group>"; };
08FB7793FE84155DC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "clang" */;
+ compatibilityVersion = "Xcode 2.4";
hasScannedForEncodings = 1;
mainGroup = 08FB7794FE84155DC02AAC07 /* clang */;
projectDirPath = "";
"duplicate declaration of method '%0'")
DIAG(err_previous_declaration, ERROR,
"previous declaration is here")
+DIAG(err_undeclared_protocol, ERROR,
+ "cannot find protocol declaration for '%0'")
//===----------------------------------------------------------------------===//
return 0;
}
+ /// ActOnFindProtocolDeclaration - This routine looks for a previously
+ /// declared protocol and returns it. If not found, issues diagnostic.
+ /// Will build a list of previously protocol declarations found in the list.
+ virtual DeclTy **ActOnFindProtocolDeclaration(Scope *S,
+ SourceLocation TypeLoc,
+ IdentifierInfo **ProtocolId,
+ unsigned NumProtocols) {
+ return 0;
+ }
+
+
//===----------------------- Obj-C Expressions --------------------------===//
virtual ExprResult ParseObjCStringLiteral(ExprTy *string) {
return 0;
--- /dev/null
+// RUN: clang -fsyntax-only -verify %s
+
+@protocol p1, p4;
+@protocol p2 @end
+
+@interface T
+- (T<p2, p3, p1, p4>*) meth; // expected-error {{cannot find protocol declaration for 'p3'}}
+- (T<p2, p3, p1, p4>*) meth; // expected-error {{cannot find protocol declaration for 'p3'}}
+@end