diff --git a/AST/Decl.cpp b/AST/Decl.cpp
index 30ca5e6..804e9cc 100644
--- a/AST/Decl.cpp
+++ b/AST/Decl.cpp
@@ -293,13 +293,15 @@
 /// ObjcAddInstanceVariablesToClass - Inserts instance variables
 /// into ObjcInterfaceDecl's fields.
 ///
-void ObjcInterfaceDecl::ObjcAddInstanceVariablesToClass(ObjcIvarDecl **ivars,
-                                                        unsigned numIvars) {
+void ObjcInterfaceDecl::addInstanceVariablesToClass(ObjcIvarDecl **ivars,
+                                                    unsigned numIvars,
+                                                    SourceLocation RB) {
   NumIvars = numIvars;
   if (numIvars) {
     Ivars = new ObjcIvarDecl*[numIvars];
     memcpy(Ivars, ivars, numIvars*sizeof(ObjcIvarDecl*));
   }
+  RBracLoc = RB;
 }
 
 /// ObjcAddInstanceVariablesToClassImpl - Checks for correctness of Instance 
@@ -315,13 +317,14 @@
   }
 }
 
-/// addObjcMethods - Insert instance and methods declarations into
+/// addMethods - Insert instance and methods declarations into
 /// ObjcInterfaceDecl's InsMethods and ClsMethods fields.
 ///
-void ObjcInterfaceDecl::ObjcAddMethods(ObjcMethodDecl **insMethods, 
-                                       unsigned numInsMembers,
-                                       ObjcMethodDecl **clsMethods,
-                                       unsigned numClsMembers) {
+void ObjcInterfaceDecl::addMethods(ObjcMethodDecl **insMethods, 
+                                   unsigned numInsMembers,
+                                   ObjcMethodDecl **clsMethods,
+                                   unsigned numClsMembers,
+                                   SourceLocation endLoc) {
   NumInstanceMethods = numInsMembers;
   if (numInsMembers) {
     InstanceMethods = new ObjcMethodDecl*[numInsMembers];
@@ -332,15 +335,17 @@
     ClassMethods = new ObjcMethodDecl*[numClsMembers];
     memcpy(ClassMethods, clsMethods, numClsMembers*sizeof(ObjcMethodDecl*));
   }
+  EndLoc = endLoc;
 }
 
-/// ObjcAddProtoMethods - Insert instance and methods declarations into
+/// addMethods - Insert instance and methods declarations into
 /// ObjcProtocolDecl's ProtoInsMethods and ProtoClsMethods fields.
 ///
-void ObjcProtocolDecl::ObjcAddProtoMethods(ObjcMethodDecl **insMethods, 
-                                           unsigned numInsMembers,
-                                           ObjcMethodDecl **clsMethods,
-                                           unsigned numClsMembers) {
+void ObjcProtocolDecl::addMethods(ObjcMethodDecl **insMethods, 
+                                  unsigned numInsMembers,
+                                  ObjcMethodDecl **clsMethods,
+                                  unsigned numClsMembers,
+                                  SourceLocation AtEndLoc) {
   NumInstanceMethods = numInsMembers;
   if (numInsMembers) {
     InstanceMethods = new ObjcMethodDecl*[numInsMembers];
@@ -353,13 +358,14 @@
   }
 }
 
-/// ObjcAddCat - Insert instance and methods declarations into
+/// addMethods - Insert instance and methods declarations into
 /// ObjcCategoryDecl's CatInsMethods and CatClsMethods fields.
 ///
-void ObjcCategoryDecl::ObjcAddCatMethods(ObjcMethodDecl **insMethods, 
-                                         unsigned numInsMembers,
-                                         ObjcMethodDecl **clsMethods,
-                                         unsigned numClsMembers) {
+void ObjcCategoryDecl::addMethods(ObjcMethodDecl **insMethods, 
+                                  unsigned numInsMembers,
+                                  ObjcMethodDecl **clsMethods,
+                                  unsigned numClsMembers,
+                                  SourceLocation AtEndLoc) {
   NumInstanceMethods = numInsMembers;
   if (numInsMembers) {
     InstanceMethods = new ObjcMethodDecl*[numInsMembers];
@@ -372,13 +378,14 @@
   }
 }
 
-/// ObjcAddCatImplMethods - Insert instance and methods declarations into
+/// addMethods - Insert instance and methods declarations into
 /// ObjcCategoryImplDecl's CatInsMethods and CatClsMethods fields.
 ///
-void ObjcCategoryImplDecl::ObjcAddCatImplMethods(ObjcMethodDecl **insMethods, 
-                                                 unsigned numInsMembers,
-                                                 ObjcMethodDecl **clsMethods,
-                                                 unsigned numClsMembers) {
+void ObjcCategoryImplDecl::addMethods(ObjcMethodDecl **insMethods, 
+                                      unsigned numInsMembers,
+                                      ObjcMethodDecl **clsMethods,
+                                      unsigned numClsMembers,
+                                      SourceLocation AtEndLoc) {
   NumInstanceMethods = numInsMembers;
   if (numInsMembers) {
     InstanceMethods = new ObjcMethodDecl*[numInsMembers];
@@ -394,10 +401,11 @@
 /// ObjcAddImplMethods - Insert instance and methods declarations into
 /// ObjcImplementationDecl's InsMethods and ClsMethods fields.
 ///
-void ObjcImplementationDecl::ObjcAddImplMethods(ObjcMethodDecl **insMethods, 
-                                                unsigned numInsMembers,
-                                                ObjcMethodDecl **clsMethods,
-                                                unsigned numClsMembers) {
+void ObjcImplementationDecl::addMethods(ObjcMethodDecl **insMethods, 
+                                        unsigned numInsMembers,
+                                        ObjcMethodDecl **clsMethods,
+                                        unsigned numClsMembers,
+                                        SourceLocation AtEndLoc) {
   NumInstanceMethods = numInsMembers;
   if (numInsMembers) {
     InstanceMethods = new ObjcMethodDecl*[numInsMembers];
diff --git a/Parse/ParseDecl.cpp b/Parse/ParseDecl.cpp
index a525792..1e786da 100644
--- a/Parse/ParseDecl.cpp
+++ b/Parse/ParseDecl.cpp
@@ -758,10 +758,11 @@
     }
   }
   
-  MatchRHSPunctuation(tok::r_brace, LBraceLoc);
+  SourceLocation RBraceLoc = MatchRHSPunctuation(tok::r_brace, LBraceLoc);
   
   Actions.ActOnFields(CurScope,
-		      RecordLoc,TagDecl,&FieldDecls[0],FieldDecls.size());
+		      RecordLoc,TagDecl,&FieldDecls[0],FieldDecls.size(),
+                      LBraceLoc, RBraceLoc);
   
   AttributeList *AttrList = 0;
   // If attributes exist after struct contents, parse them.
diff --git a/Parse/ParseObjc.cpp b/Parse/ParseObjc.cpp
index 4abf8fd..c628f4d 100644
--- a/Parse/ParseObjc.cpp
+++ b/Parse/ParseObjc.cpp
@@ -193,7 +193,7 @@
                       ProtocolRefs.size(), attrList);
             
   if (Tok.is(tok::l_brace))
-    ParseObjCClassInstanceVariables(ClsType);
+    ParseObjCClassInstanceVariables(ClsType, atLoc);
 
   ParseObjCInterfaceDeclList(ClsType, tok::objc_interface);
 
@@ -222,12 +222,15 @@
 					tok::ObjCKeywordKind contextKey) {
   llvm::SmallVector<DeclTy*, 32>  allMethods;
   tok::ObjCKeywordKind MethodImplKind = tok::objc_not_keyword;
+  SourceLocation AtEndLoc;
+  
   while (1) {
     if (Tok.is(tok::at)) {
       SourceLocation AtLoc = ConsumeToken(); // the "@"
       tok::ObjCKeywordKind ocKind = Tok.getObjCKeywordID();
       
       if (ocKind == tok::objc_end) { // terminate list
+        AtEndLoc = AtLoc;
         break;
       } else if (ocKind == tok::objc_required) { // protocols only
         ConsumeToken();
@@ -268,8 +271,8 @@
   }
   if (allMethods.size())
     /// Insert collected methods declarations into the @interface object.
-    Actions.ActOnAddMethodsToObjcDecl(CurScope, interfaceDecl,
-                                      &allMethods[0], allMethods.size());
+    Actions.ActOnAddMethodsToObjcDecl(CurScope, interfaceDecl, &allMethods[0], 
+                                      allMethods.size(), AtEndLoc);
 }
 
 ///   Parse property attribute declarations.
@@ -683,7 +686,8 @@
 ///   objc-instance-variable-decl:
 ///     struct-declaration 
 ///
-void Parser::ParseObjCClassInstanceVariables(DeclTy *interfaceDecl) {
+void Parser::ParseObjCClassInstanceVariables(DeclTy *interfaceDecl,
+                                             SourceLocation atLoc) {
   assert(Tok.is(tok::l_brace) && "expected {");
   llvm::SmallVector<DeclTy*, 16> IvarDecls;
   llvm::SmallVector<DeclTy*, 32> AllIvarDecls;
@@ -737,12 +741,12 @@
       SkipUntil(tok::r_brace, true, true);
     }
   }
+  SourceLocation RBraceLoc = MatchRHSPunctuation(tok::r_brace, LBraceLoc);
   if (AllIvarDecls.size()) {  // Check for {} - no ivars in braces
-    Actions.ActOnFields(CurScope, LBraceLoc, interfaceDecl, 
+    Actions.ActOnFields(CurScope, atLoc, interfaceDecl,
                         &AllIvarDecls[0], AllIvarDecls.size(),
-                        &AllVisibilities[0]);
+                        LBraceLoc, RBraceLoc, &AllVisibilities[0]);
   }
-  MatchRHSPunctuation(tok::r_brace, LBraceLoc);
   return;
 }
 
@@ -893,11 +897,12 @@
 				  atLoc, nameId, nameLoc,
                                   superClassId, superClassLoc);
   
-  if (Tok.is(tok::l_brace))
-    ParseObjCClassInstanceVariables(ImplClsType/*FIXME*/); // we have ivars
+  if (Tok.is(tok::l_brace)) // we have ivars
+    ParseObjCClassInstanceVariables(ImplClsType/*FIXME*/, atLoc);
   
   return ImplClsType;
 }
+
 Parser::DeclTy *Parser::ParseObjCAtEndDeclaration(SourceLocation atLoc) {
   assert(Tok.isObjCAtKeyword(tok::objc_end) &&
          "ParseObjCAtEndDeclaration(): Expected @end");
@@ -908,7 +913,8 @@
     // could be 0.
     /// Insert collected methods declarations into the @interface object.
     Actions.ActOnAddMethodsToObjcDecl(CurScope, ObjcImpDecl,
-                                      &AllImplMethods[0],AllImplMethods.size());
+                                      &AllImplMethods[0], AllImplMethods.size(),
+                                      atLoc);
     ObjcImpDecl = 0;
     AllImplMethods.clear();
   }
diff --git a/Sema/Sema.h b/Sema/Sema.h
index f553356..dcf024e 100644
--- a/Sema/Sema.h
+++ b/Sema/Sema.h
@@ -203,9 +203,10 @@
                                       
   // This is used for both record definitions and ObjC interface declarations.
   virtual void ActOnFields(Scope* S,
-				 SourceLocation RecLoc, DeclTy *TagDecl,
-                                 DeclTy **Fields, unsigned NumFields,
-                                 tok::ObjCKeywordKind *visibility = 0);
+                           SourceLocation RecLoc, DeclTy *TagDecl,
+                           DeclTy **Fields, unsigned NumFields,
+                           SourceLocation LBrac, SourceLocation RBrac,
+                           tok::ObjCKeywordKind *visibility = 0);
   virtual DeclTy *ActOnEnumConstant(Scope *S, DeclTy *EnumDecl,
                                     DeclTy *LastEnumConstant,
                                     SourceLocation IdLoc, IdentifierInfo *Id,
@@ -517,7 +518,8 @@
                                        Protocols);
 
   virtual void ActOnAddMethodsToObjcDecl(Scope* S, DeclTy *ClassDecl, 
-				         DeclTy **allMethods, unsigned allNum);
+				         DeclTy **allMethods, unsigned allNum,
+                                         SourceLocation AtEndLoc);
   
   virtual DeclTy *ActOnMethodDeclaration(
     SourceLocation BeginLoc, // location of the + or -.
diff --git a/Sema/SemaDecl.cpp b/Sema/SemaDecl.cpp
index 12efd45..1ec54d5 100644
--- a/Sema/SemaDecl.cpp
+++ b/Sema/SemaDecl.cpp
@@ -1263,7 +1263,7 @@
   /// (legacy objective-c @implementation decl without an @interface decl).
   /// Add implementations's ivar to the synthesize class's ivar list.
   if (IDecl->ImplicitInterfaceDecl()) {
-    IDecl->ObjcAddInstanceVariablesToClass(ivars, numIvars);
+    IDecl->addInstanceVariablesToClass(ivars, numIvars, SourceLocation());
     return;
   }
   
@@ -1631,6 +1631,7 @@
 void Sema::ActOnFields(Scope* S,
                        SourceLocation RecLoc, DeclTy *RecDecl,
                        DeclTy **Fields, unsigned NumFields,
+                       SourceLocation LBrac, SourceLocation RBrac,
                        tok::ObjCKeywordKind *visibility) {
   Decl *EnclosingDecl = static_cast<Decl*>(RecDecl);
   assert(EnclosingDecl && "missing record or interface decl");
@@ -1769,7 +1770,7 @@
                     reinterpret_cast<ObjcIvarDecl**>(&RecFields[0]);
     if (isa<ObjcInterfaceDecl>(static_cast<Decl*>(RecDecl)))
       cast<ObjcInterfaceDecl>(static_cast<Decl*>(RecDecl))->
-        ObjcAddInstanceVariablesToClass(ClsFields, RecFields.size());
+        addInstanceVariablesToClass(ClsFields, RecFields.size(), RBrac);
     else if (isa<ObjcImplementationDecl>(static_cast<Decl*>(RecDecl))) {
       ObjcImplementationDecl* IMPDecl = 
         cast<ObjcImplementationDecl>(static_cast<Decl*>(RecDecl));
@@ -1844,7 +1845,8 @@
 }
 
 void Sema::ActOnAddMethodsToObjcDecl(Scope* S, DeclTy *classDecl,
-                                     DeclTy **allMethods, unsigned allNum) {
+                                     DeclTy **allMethods, unsigned allNum,
+                                     SourceLocation AtEndLoc) {
   Decl *ClassDecl = static_cast<Decl *>(classDecl);
 
   // FIXME: If we don't have a ClassDecl, we have an error. I (snaroff) would
@@ -1906,26 +1908,26 @@
   }
   
   if (ObjcInterfaceDecl *I = dyn_cast<ObjcInterfaceDecl>(ClassDecl)) {
-    I->ObjcAddMethods(&insMethods[0], insMethods.size(),
-                      &clsMethods[0], clsMethods.size());
+    I->addMethods(&insMethods[0], insMethods.size(),
+                  &clsMethods[0], clsMethods.size(), AtEndLoc);
   } else if (ObjcProtocolDecl *P = dyn_cast<ObjcProtocolDecl>(ClassDecl)) {
-    P->ObjcAddProtoMethods(&insMethods[0], insMethods.size(),
-                           &clsMethods[0], clsMethods.size());
+    P->addMethods(&insMethods[0], insMethods.size(),
+                  &clsMethods[0], clsMethods.size(), AtEndLoc);
   }
   else if (ObjcCategoryDecl *C = dyn_cast<ObjcCategoryDecl>(ClassDecl)) {
-    C->ObjcAddCatMethods(&insMethods[0], insMethods.size(),
-                         &clsMethods[0], clsMethods.size());
+    C->addMethods(&insMethods[0], insMethods.size(),
+                  &clsMethods[0], clsMethods.size(), AtEndLoc);
   }
   else if (ObjcImplementationDecl *IC = 
                 dyn_cast<ObjcImplementationDecl>(ClassDecl)) {
-    IC->ObjcAddImplMethods(&insMethods[0], insMethods.size(),
-                           &clsMethods[0], clsMethods.size());
+    IC->addMethods(&insMethods[0], insMethods.size(),
+                   &clsMethods[0], clsMethods.size(), AtEndLoc);
     if (ObjcInterfaceDecl* IDecl = getObjCInterfaceDecl(IC->getIdentifier()))
       ImplMethodsVsClassMethods(IC, IDecl);
   } else {
     ObjcCategoryImplDecl* CatImplClass = cast<ObjcCategoryImplDecl>(ClassDecl);
-    CatImplClass->ObjcAddCatImplMethods(&insMethods[0], insMethods.size(),
-                                        &clsMethods[0], clsMethods.size());
+    CatImplClass->addMethods(&insMethods[0], insMethods.size(),
+                             &clsMethods[0], clsMethods.size(), AtEndLoc);
     ObjcInterfaceDecl* IDecl = CatImplClass->getClassInterface();
     // Find category interface decl and then check that all methods declared
     // in this interface is implemented in the category @implementation.
diff --git a/clang.xcodeproj/project.pbxproj b/clang.xcodeproj/project.pbxproj
index fe4cf8d..de41b46 100644
--- a/clang.xcodeproj/project.pbxproj
+++ b/clang.xcodeproj/project.pbxproj
@@ -756,7 +756,6 @@
 		08FB7793FE84155DC02AAC07 /* Project object */ = {
 			isa = PBXProject;
 			buildConfigurationList = 1DEB923508733DC60010E9CD /* Build configuration list for PBXProject "clang" */;
-			compatibilityVersion = "Xcode 2.4";
 			hasScannedForEncodings = 1;
 			mainGroup = 08FB7794FE84155DC02AAC07 /* clang */;
 			projectDirPath = "";
diff --git a/include/clang/AST/DeclObjC.h b/include/clang/AST/DeclObjC.h
index 6157187..e5d6fb8 100644
--- a/include/clang/AST/DeclObjC.h
+++ b/include/clang/AST/DeclObjC.h
@@ -73,10 +73,13 @@
   ObjcCategoryDecl *CategoryList;
   
   bool ForwardDecl; // declared with @class.
+  
+  SourceLocation RBracLoc; // marks the end of the instance variables.
+  SourceLocation EndLoc; // marks the end of the entire interface.
 public:
-  ObjcInterfaceDecl(SourceLocation L, unsigned numRefProtos,
+  ObjcInterfaceDecl(SourceLocation atLoc, unsigned numRefProtos,
                     IdentifierInfo *Id, bool FD = false)
-    : TypeDecl(ObjcInterface, L, Id, 0), SuperClass(0),
+    : TypeDecl(ObjcInterface, atLoc, Id, 0), SuperClass(0),
       ReferencedProtocols(0), NumReferencedProtocols(-1), Ivars(0), 
       NumIvars(-1),
       InstanceMethods(0), NumInstanceMethods(-1), 
@@ -109,11 +112,12 @@
   ObjcMethodDecl** getClassMethods() const { return ClassMethods; }
   int getNumClassMethods() const { return NumClassMethods; }
   
-  void ObjcAddInstanceVariablesToClass(ObjcIvarDecl **ivars, 
-				       unsigned numIvars);
+  void addInstanceVariablesToClass(ObjcIvarDecl **ivars, unsigned numIvars,
+                                   SourceLocation RBracLoc);
 
-  void ObjcAddMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
-                      ObjcMethodDecl **clsMethods, unsigned numClsMembers);
+  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
+                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
+                  SourceLocation AtEnd);
   
   bool isForwardDecl() const { return ForwardDecl; }
   void setForwardDecl(bool val) { ForwardDecl = val; }
@@ -132,6 +136,14 @@
   }
   ObjcMethodDecl *lookupInstanceMethod(Selector &Sel);
   ObjcMethodDecl *lookupClassMethod(Selector &Sel);
+
+  // Location information, modeled after the Stmt API. For interfaces, 
+  // which are fairly course grain, the end refers to the '}' token.
+  SourceLocation getLocStart() const { return getLocation(); } // '@'interface
+  SourceLocation getLocEnd() const { return RBracLoc; }
+  
+  // We also need to record the @end location.
+  SourceLocation getAtEndLoc() const { return EndLoc; }
   
   /// ImplicitInterfaceDecl - check that this is an implicitely declared
   /// ObjcInterfaceDecl node. This is for legacy objective-c @implementation
@@ -313,8 +325,9 @@
       NumReferencedProtocols = numRefProtos;
     }    
   }
-  void ObjcAddProtoMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
-                           ObjcMethodDecl **clsMethods, unsigned numClsMembers);
+  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
+                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
+                  SourceLocation AtEndLoc);
   
   void setReferencedProtocols(int idx, ObjcProtocolDecl *OID) {
     assert((idx < NumReferencedProtocols) && "index out of range");
@@ -480,8 +493,9 @@
   ObjcMethodDecl **getClassMethods() const { return ClassMethods; }
   int getNumClassMethods() const { return NumClassMethods; }
   
-  void ObjcAddCatMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
-                         ObjcMethodDecl **clsMethods, unsigned numClsMembers);
+  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
+                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
+                  SourceLocation AtEndLoc);
   
   ObjcCategoryDecl *getNextClassCategory() const { return NextClassCategory; }
   void insertNextClassCategory() {
@@ -525,9 +539,9 @@
   ObjcMethodDecl **getClassMethods() const { return ClassMethods; }
   int getNumClassMethods() const { return NumClassMethods; }
   
-  void ObjcAddCatImplMethods(
-        ObjcMethodDecl **insMethods, unsigned numInsMembers,
-        ObjcMethodDecl **clsMethods, unsigned numClsMembers);
+  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
+                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
+                  SourceLocation AtEndLoc);
   
   static bool classof(const Decl *D) { return D->getKind() == ObjcCategoryImpl;}
   static bool classof(const ObjcCategoryImplDecl *D) { return true; }
@@ -581,8 +595,9 @@
   void ObjcAddInstanceVariablesToClassImpl(ObjcIvarDecl **ivars, 
                                            unsigned numIvars);
     
-  void ObjcAddImplMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
-                          ObjcMethodDecl **clsMethods, unsigned numClsMembers);
+  void addMethods(ObjcMethodDecl **insMethods, unsigned numInsMembers,
+                  ObjcMethodDecl **clsMethods, unsigned numClsMembers,
+                  SourceLocation AtEndLoc);
     
   ObjcInterfaceDecl *getClassInterface() const { return ClassInterface; }
   ObjcInterfaceDecl *getSuperClass() const { return SuperClass; }
diff --git a/include/clang/Parse/Action.h b/include/clang/Parse/Action.h
index a237bf3..a80fb08 100644
--- a/include/clang/Parse/Action.h
+++ b/include/clang/Parse/Action.h
@@ -180,10 +180,10 @@
                              Declarator &D, ExprTy *BitfieldWidth) {
     return 0;
   }
-  virtual void ActOnFields(Scope* S,
-				 SourceLocation RecLoc, DeclTy *TagDecl,
-                                 DeclTy **Fields, unsigned NumFields,
-                                 tok::ObjCKeywordKind *visibility = 0) {}
+  virtual void ActOnFields(Scope* S, SourceLocation RecLoc, DeclTy *TagDecl,
+                           DeclTy **Fields, unsigned NumFields, 
+                           SourceLocation LBrac, SourceLocation RBrac,
+                           tok::ObjCKeywordKind *visibility = 0) {}
   virtual DeclTy *ActOnEnumConstant(Scope *S, DeclTy *EnumDecl,
                                     DeclTy *LastEnumConstant,
                                     SourceLocation IdLoc, IdentifierInfo *Id,
@@ -541,7 +541,8 @@
     Scope* S, 
     DeclTy *ClassDecl,
     DeclTy **allMethods, 
-    unsigned allNum) {
+    unsigned allNum,
+    SourceLocation AtEndLoc) {
     return;
   }
   // ActOnClassMessage - used for both unary and keyword messages.
diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h
index a41d357..0ca6eaf 100644
--- a/include/clang/Parse/Parser.h
+++ b/include/clang/Parse/Parser.h
@@ -258,7 +258,8 @@
   DeclTy *ParseObjCAtClassDeclaration(SourceLocation atLoc);
   DeclTy *ParseObjCAtInterfaceDeclaration(SourceLocation atLoc, 
                                           AttributeList *prefixAttrs = 0);
-  void ParseObjCClassInstanceVariables(DeclTy *interfaceDecl);
+  void ParseObjCClassInstanceVariables(DeclTy *interfaceDecl, 
+                                       SourceLocation atLoc);
   bool ParseObjCProtocolReferences(llvm::SmallVectorImpl<IdentifierInfo*> &);
   void ParseObjCInterfaceDeclList(DeclTy *interfaceDecl,
 				  tok::ObjCKeywordKind contextKey);
