Index: include/clang/AST/Decl.h
===================================================================
--- include/clang/AST/Decl.h	(revision 75016)
+++ include/clang/AST/Decl.h	(working copy)
@@ -994,16 +994,19 @@
   // FIXME: This can be packed into the bitfields in Decl.
   bool Mutable : 1;
   Expr *BitWidth;
+  SourceLocation TypeSpecStartLoc;
 protected:
   FieldDecl(Kind DK, DeclContext *DC, SourceLocation L, 
-            IdentifierInfo *Id, QualType T, Expr *BW, bool Mutable)
-    : ValueDecl(DK, DC, L, Id, T), Mutable(Mutable), BitWidth(BW)
-      { }
+            IdentifierInfo *Id, QualType T, Expr *BW, bool Mutable,
+            SourceLocation TSSL = SourceLocation())
+    : ValueDecl(DK, DC, L, Id, T), Mutable(Mutable), BitWidth(BW),
+      TypeSpecStartLoc(TSSL) { }
 
 public:
   static FieldDecl *Create(ASTContext &C, DeclContext *DC, SourceLocation L, 
                            IdentifierInfo *Id, QualType T, Expr *BW, 
-                           bool Mutable);
+                           bool Mutable,
+                           SourceLocation TypeSpecStartLoc = SourceLocation());
 
   /// isMutable - Determines whether this field is mutable (C++ only).
   bool isMutable() const { return Mutable; }
@@ -1011,6 +1014,9 @@
   /// \brief Set whether this field is mutable (C++ only).
   void setMutable(bool M) { Mutable = M; }
 
+  SourceLocation getTypeSpecStartLoc() const { return TypeSpecStartLoc; }
+  void setTypeSpecStartLoc(SourceLocation TSSL) { TypeSpecStartLoc = TSSL; }
+
   /// isBitfield - Determines whether this field is a bitfield.
   bool isBitField() const { return BitWidth != NULL; }
 
Index: lib/Frontend/PCHReaderDecl.cpp
===================================================================
--- lib/Frontend/PCHReaderDecl.cpp	(revision 75016)
+++ lib/Frontend/PCHReaderDecl.cpp	(working copy)
@@ -332,6 +332,7 @@
 void PCHDeclReader::VisitFieldDecl(FieldDecl *FD) {
   VisitValueDecl(FD);
   FD->setMutable(Record[Idx++]);
+  FD->setTypeSpecStartLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
   if (Record[Idx++])
     FD->setBitWidth(Reader.ReadDeclExpr());
 }
@@ -666,7 +667,7 @@
     break;
   case pch::DECL_FIELD:
     D = FieldDecl::Create(*Context, 0, SourceLocation(), 0, QualType(), 0, 
-                          false);
+                          false, SourceLocation());
     break;
   case pch::DECL_VAR:
     D = VarDecl::Create(*Context, 0, SourceLocation(), 0, QualType(),
Index: lib/Frontend/PCHWriterDecl.cpp
===================================================================
--- lib/Frontend/PCHWriterDecl.cpp	(revision 75016)
+++ lib/Frontend/PCHWriterDecl.cpp	(working copy)
@@ -324,6 +324,7 @@
 void PCHDeclWriter::VisitFieldDecl(FieldDecl *D) {
   VisitValueDecl(D);
   Record.push_back(D->isMutable());
+  Writer.AddSourceLocation(D->getTypeSpecStartLoc(), Record);
   Record.push_back(D->getBitWidth()? 1 : 0);
   if (D->getBitWidth())
     Writer.AddStmt(D->getBitWidth());
Index: lib/Sema/SemaTemplateInstantiateDecl.cpp
===================================================================
--- lib/Sema/SemaTemplateInstantiateDecl.cpp	(revision 75016)
+++ lib/Sema/SemaTemplateInstantiateDecl.cpp	(working copy)
@@ -182,6 +182,7 @@
                                             D->getLocation(),
                                             D->isMutable(),
                                             BitWidth,
+                                            D->getTypeSpecStartLoc(),
                                             D->getAccess(),
                                             0);
   if (Field) {
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp	(revision 75016)
+++ lib/Sema/SemaDecl.cpp	(working copy)
@@ -1269,7 +1269,8 @@
     Anon = FieldDecl::Create(Context, OwningClass, Record->getLocation(),
                              /*IdentifierInfo=*/0, 
                              Context.getTypeDeclType(Record),
-                             /*BitWidth=*/0, /*Mutable=*/false);
+                             /*BitWidth=*/0, /*Mutable=*/false,
+                             DS.getSourceRange().getBegin());
     Anon->setAccess(AS_public);
     if (getLangOptions().CPlusPlus)
       FieldCollector->Add(cast<FieldDecl>(Anon));
@@ -3930,10 +3931,12 @@
   if (PrevDecl && !isDeclInScope(PrevDecl, Record, S))
     PrevDecl = 0;
 
-  FieldDecl *NewFD 
-    = CheckFieldDecl(II, T, Record, Loc,
-               D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_mutable,
-                     BitWidth, AS, PrevDecl, &D);
+  bool Mutable
+    = (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_mutable);
+  SourceLocation TSSL = D.getSourceRange().getBegin();
+  FieldDecl *NewFD
+    = CheckFieldDecl(II, T, Record, Loc, Mutable, BitWidth, TSSL,
+                     AS, PrevDecl, &D);
   if (NewFD->isInvalidDecl() && PrevDecl) {
     // Don't introduce NewFD into scope; there's already something
     // with the same name in the same scope.
@@ -3958,6 +3961,7 @@
 FieldDecl *Sema::CheckFieldDecl(DeclarationName Name, QualType T, 
                                 RecordDecl *Record, SourceLocation Loc,
                                 bool Mutable, Expr *BitWidth, 
+                                SourceLocation TSSL,
                                 AccessSpecifier AS, NamedDecl *PrevDecl,
                                 Declarator *D) {
   IdentifierInfo *II = Name.getAsIdentifierInfo();
@@ -4003,7 +4007,7 @@
   }
   
   FieldDecl *NewFD = FieldDecl::Create(Context, Record, Loc, II, T, BitWidth,
-                                       Mutable);
+                                       Mutable, TSSL);
   if (InvalidDecl)
     NewFD->setInvalidDecl();
 
Index: lib/Sema/Sema.h
===================================================================
--- lib/Sema/Sema.h	(revision 75016)
+++ lib/Sema/Sema.h	(working copy)
@@ -541,6 +541,7 @@
   FieldDecl *CheckFieldDecl(DeclarationName Name, QualType T, 
                             RecordDecl *Record, SourceLocation Loc,
                             bool Mutable, Expr *BitfieldWidth,
+                            SourceLocation TSSL,
                             AccessSpecifier AS, NamedDecl *PrevDecl,
                             Declarator *D = 0);
   
Index: lib/AST/Decl.cpp
===================================================================
--- lib/AST/Decl.cpp	(revision 75016)
+++ lib/AST/Decl.cpp	(working copy)
@@ -149,8 +149,8 @@
 
 FieldDecl *FieldDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation L,
                              IdentifierInfo *Id, QualType T, Expr *BW,
-                             bool Mutable) {
-  return new (C) FieldDecl(Decl::Field, DC, L, Id, T, BW, Mutable);
+                             bool Mutable, SourceLocation TSSL) {
+  return new (C) FieldDecl(Decl::Field, DC, L, Id, T, BW, Mutable, TSSL);
 }
 
 bool FieldDecl::isAnonymousStructOrUnion() const {
