minor cleanup to the actions interface to pass around SmallVectorImpl instead
of a specific smallvector size.

Fix protocol lists to pass down proper location info, so we get diagnostics
like this:

t.m:3:35: error: cannot find protocol definition for 'NSCopying', referenced by 'NSWhatever'
@interface NSWhatever : NSObject <NSCopying>
                                  ^

instead of this:

t.m:3:44: error: cannot find protocol definition for 'NSCopying', referenced by 'NSWhatever'
@interface NSWhatever : NSObject <NSCopying>
                                           ^


Add a new IdentifierLocPair typedef which is just a pair<IdentifierInfo*, SourceLocation>



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53883 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Parse/MinimalAction.cpp b/lib/Parse/MinimalAction.cpp
index f48e846..91f3c6e 100644
--- a/lib/Parse/MinimalAction.cpp
+++ b/lib/Parse/MinimalAction.cpp
@@ -91,7 +91,8 @@
 MinimalAction::ActOnStartClassInterface(SourceLocation AtInterfaceLoc,
                     IdentifierInfo *ClassName, SourceLocation ClassLoc,
                     IdentifierInfo *SuperName, SourceLocation SuperLoc,
-                    IdentifierInfo **ProtocolNames, unsigned NumProtocols,
+                    const IdentifierLocPair *ProtocolNames,
+                    unsigned NumProtocols,
                     SourceLocation EndProtoLoc, AttributeList *AttrList) {
   TypeNameInfo *TI =
     new TypeNameInfo(1, ClassName->getFETokenInfo<TypeNameInfo>());
diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp
index 95344c4..1ac26a3 100644
--- a/lib/Parse/ParseDecl.cpp
+++ b/lib/Parse/ParseDecl.cpp
@@ -413,8 +413,11 @@
           ConsumeToken(); // The identifier
           if (Tok.is(tok::less)) {
             SourceLocation endProtoLoc;
-            llvm::SmallVector<IdentifierInfo *, 8> ProtocolRefs;
+            llvm::SmallVector<IdentifierLocPair, 8> ProtocolRefs;
             ParseObjCProtocolReferences(ProtocolRefs, endProtoLoc);
+            
+            // FIXME: New'ing this here seems wrong, why not have the action do
+            // it?
             llvm::SmallVector<DeclTy *, 8> *ProtocolDecl = 
                     new llvm::SmallVector<DeclTy *, 8>;
             DS.setProtocolQualifiers(ProtocolDecl);
@@ -553,7 +556,7 @@
     case tok::less:
       if (!DS.hasTypeSpecifier()) {
         SourceLocation endProtoLoc;
-        llvm::SmallVector<IdentifierInfo *, 8> ProtocolRefs;
+        llvm::SmallVector<IdentifierLocPair, 8> ProtocolRefs;
         ParseObjCProtocolReferences(ProtocolRefs, endProtoLoc);
         llvm::SmallVector<DeclTy *, 8> *ProtocolDecl = 
                 new llvm::SmallVector<DeclTy *, 8>;
diff --git a/lib/Parse/ParseObjc.cpp b/lib/Parse/ParseObjc.cpp
index baf2667..7d7ba10 100644
--- a/lib/Parse/ParseObjc.cpp
+++ b/lib/Parse/ParseObjc.cpp
@@ -131,7 +131,7 @@
     SourceLocation lparenLoc = ConsumeParen();
     SourceLocation categoryLoc, rparenLoc;
     IdentifierInfo *categoryId = 0;
-    llvm::SmallVector<IdentifierInfo *, 8> ProtocolRefs;
+    llvm::SmallVector<IdentifierLocPair, 8> ProtocolRefs;
     
     // For ObjC2, the category name is optional (not an error).
     if (Tok.is(tok::identifier)) {
@@ -185,7 +185,7 @@
     superClassLoc = ConsumeToken();
   }
   // Next, we need to check for any protocol references.
-  llvm::SmallVector<IdentifierInfo *, 8> ProtocolRefs;
+  llvm::SmallVector<IdentifierLocPair, 8> ProtocolRefs;
   SourceLocation endProtoLoc;
   if (Tok.is(tok::less)) {
     if (ParseObjCProtocolReferences(ProtocolRefs, endProtoLoc))
@@ -337,7 +337,7 @@
 ///     copy
 ///     nonatomic
 ///
-void Parser::ParseObjCPropertyAttribute (ObjCDeclSpec &DS) {
+void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS) {
   SourceLocation loc = ConsumeParen(); // consume '('
   while (isObjCPropertyAttribute()) {
     const IdentifierInfo *II = Tok.getIdentifierInfo();
@@ -715,8 +715,9 @@
 ///   objc-protocol-refs:
 ///     '<' identifier-list '>'
 ///
-bool Parser::ParseObjCProtocolReferences(
-  llvm::SmallVectorImpl<IdentifierInfo*> &ProtocolRefs, SourceLocation &endLoc){
+bool Parser::
+ParseObjCProtocolReferences(llvm::SmallVectorImpl<IdentifierLocPair> &Protocols,
+                            SourceLocation &endLoc) {
   assert(Tok.is(tok::less) && "expected <");
   
   ConsumeToken(); // the "<"
@@ -727,7 +728,8 @@
       SkipUntil(tok::greater);
       return true;
     }
-    ProtocolRefs.push_back(Tok.getIdentifierInfo());
+    Protocols.push_back(std::make_pair(Tok.getIdentifierInfo(),
+                                          Tok.getLocation()));
     ConsumeToken();
     
     if (Tok.isNot(tok::comma))
@@ -865,15 +867,17 @@
   IdentifierInfo *protocolName = Tok.getIdentifierInfo();
   SourceLocation nameLoc = ConsumeToken();
   
-  llvm::SmallVector<IdentifierInfo *, 8> ProtocolRefs;
   if (Tok.is(tok::semi)) { // forward declaration of one protocol.
+    IdentifierLocPair ProtoInfo(protocolName, nameLoc);
     ConsumeToken();
-    ProtocolRefs.push_back(protocolName);
+    return Actions.ActOnForwardProtocolDeclaration(AtLoc, &ProtoInfo, 1);
   }
+  
   if (Tok.is(tok::comma)) { // list of forward declarations.
+    llvm::SmallVector<IdentifierLocPair, 8> ProtocolRefs;
+    ProtocolRefs.push_back(std::make_pair(protocolName, nameLoc));
+
     // Parse the list of forward declarations.
-    ProtocolRefs.push_back(protocolName);
-    
     while (1) {
       ConsumeToken(); // the ','
       if (Tok.isNot(tok::identifier)) {
@@ -881,7 +885,8 @@
         SkipUntil(tok::semi);
         return 0;
       }
-      ProtocolRefs.push_back(Tok.getIdentifierInfo());
+      ProtocolRefs.push_back(IdentifierLocPair(Tok.getIdentifierInfo(),
+                                               Tok.getLocation()));
       ConsumeToken(); // the identifier
       
       if (Tok.isNot(tok::comma))
@@ -890,17 +895,19 @@
     // Consume the ';'.
     if (ExpectAndConsume(tok::semi, diag::err_expected_semi_after, "@protocol"))
       return 0;
-  }
-  if (!ProtocolRefs.empty())
+    
     return Actions.ActOnForwardProtocolDeclaration(AtLoc,
                                                    &ProtocolRefs[0], 
                                                    ProtocolRefs.size());
+  }
+  
   // Last, and definitely not least, parse a protocol declaration.
   SourceLocation endProtoLoc;
-  if (Tok.is(tok::less)) {
-    if (ParseObjCProtocolReferences(ProtocolRefs, endProtoLoc))
-      return 0;
-  }
+  llvm::SmallVector<IdentifierLocPair, 8> ProtocolRefs;
+
+  if (Tok.is(tok::less) &&
+      ParseObjCProtocolReferences(ProtocolRefs, endProtoLoc))
+    return 0;
   
   DeclTy *ProtoType = Actions.ActOnStartProtocolInterface(AtLoc, 
                                 protocolName, nameLoc,