Index: lib/Parse/ParseDeclCXX.cpp
===================================================================
--- lib/Parse/ParseDeclCXX.cpp	(revision 169063)
+++ lib/Parse/ParseDeclCXX.cpp	(working copy)
@@ -1008,6 +1008,26 @@
   return false;
 }
 
+/// \brief Apply fixit to code by removing code specified with a source range 
+///  and inserting same code at a location specified.
+/// \param Range Source range of code to be removed.
+/// \param InsertLocation Source location where removed code will be inserted.
+/// \param DiagID Diagnostic ID to be used in diagnostic.
+void Parser::CutAndPasteCode(SourceRange Range, 
+                             SourceLocation InsertLocation, 
+                             unsigned int DiagID) {
+  SourceManager &SM = PP.getSourceManager();
+  const char *Start = SM.getCharacterData(Range.getBegin());
+  const char *End = SM.getCharacterData(Range.getEnd());
+  SmallString<64> Code(Start, End);
+  Code += *End;
+  // FIXME: shall we use a better, more specific diagnostic here?
+  Diag(Range.getBegin(), DiagID) 
+    << Range 
+    << FixItHint::CreateRemoval(Range) 
+    << FixItHint::CreateInsertion(InsertLocation, Code);
+}
+
 /// ParseClassSpecifier - Parse a C++ class-specifier [C++ class] or
 /// elaborated-type-specifier [C++ dcl.type.elab]; we can't tell which
 /// until we reach the start of a definition or see a token that
@@ -1107,6 +1127,10 @@
   // styles of attributes?
   MaybeParseCXX0XAttributes(attrs);
 
+  // Source location used by FIXIT to insert misplaced
+  // C++11 attributes
+  SourceLocation AttrLoc = Tok.getLocation();
+
   if (TagType == DeclSpec::TST_struct &&
       !Tok.is(tok::identifier) &&
       Tok.getIdentifierInfo() &&
@@ -1323,9 +1347,18 @@
 
   // Forbid misplaced attributes. In cases of a reference, we pass attributes
   // to caller to handle.
-  // FIXME: provide fix-it hints if we can.
-  if (TUK != Sema::TUK_Reference)
-    ProhibitAttributes(Attributes);
+  if (TUK != Sema::TUK_Reference) {
+    // If this is not a reference, then the only possible
+    // valid place for C++11 attributes to appear here
+    // is between class-key and class-name. If there are
+    // any attributes after class-name, we try a fixit to move
+    // them to right place.
+    if (Attributes.Range.isValid()) {
+      CutAndPasteCode(Attributes.Range, AttrLoc, 
+                      diag::err_attributes_not_allowed);
+      Attributes.clear();
+    }
+  }
 
   // If this is an elaborated type specifier, and we delayed
   // diagnostics before, just merge them into the current pool.
@@ -1509,7 +1542,7 @@
            (getLangOpts().CPlusPlus && Tok.is(tok::colon)) ||
            isCXX0XFinalKeyword());
     if (getLangOpts().CPlusPlus)
-      ParseCXXMemberSpecification(StartLoc, TagType, TagOrTempResult.get());
+      ParseCXXMemberSpecification(StartLoc, AttrLoc, TagType, TagOrTempResult.get());
     else
       ParseStructUnionBody(StartLoc, TagType, TagOrTempResult.get());
   }
@@ -2345,6 +2378,7 @@
 ///         access-specifier ':' member-specification[opt]
 ///
 void Parser::ParseCXXMemberSpecification(SourceLocation RecordLoc,
+                                         SourceLocation AttrLoc,
                                          unsigned TagType, Decl *TagDecl) {
   assert((TagType == DeclSpec::TST_struct ||
          TagType == DeclSpec::TST_interface ||
@@ -2413,10 +2447,18 @@
            diag::ext_override_control_keyword) << "final";
     }
 
-    // Forbid C++11 attributes that appear here.
+    // Parse any C++11 attributes after 'final'keyword
+    // These attributes are not allowed to appear here
+    // and the only possible place for them to appertain
+    // to the class would be between class-key and class-name
     ParsedAttributesWithRange Attrs(AttrFactory);
     MaybeParseCXX0XAttributes(Attrs);
-    ProhibitAttributes(Attrs);
+
+    if (Attrs.Range.isValid()) {
+      CutAndPasteCode(Attrs.Range, AttrLoc, 
+                      diag::err_attributes_not_allowed);
+      Attrs.clear();
+    }
   }
 
   if (Tok.is(tok::colon)) {
Index: test/Parser/cxx0x-attributes.cpp
===================================================================
--- test/Parser/cxx0x-attributes.cpp	(revision 169063)
+++ test/Parser/cxx0x-attributes.cpp	(working copy)
@@ -64,7 +64,6 @@
 union [[]] union_attr;
 
 // Checks attributes placed at wrong syntactic locations of class specifiers.
-// FIXME: provide fix-it hint.
 class [[]] [[]]
   attr_after_class_name_decl [[]] [[]]; // expected-error {{an attribute list cannot appear here}}
 
Index: test/FixIt/fixit-cxx0x.cpp
===================================================================
--- test/FixIt/fixit-cxx0x.cpp	(revision 169063)
+++ test/FixIt/fixit-cxx0x.cpp	(working copy)
@@ -120,3 +120,20 @@
     struct d // expected-error {{expected ';' after struct}}
   }
 }
+
+namespace Attributes {
+  class [[]] [[]]
+    attr_after_class_name_decl [[]] [[]]; // expected-error {{an attribute list cannot appear here}}
+
+  class [[]] [[]]
+   attr_after_class_name_definition [[]] [[]] [[]]{}; // expected-error {{an attribute list cannot appear here}}
+
+  class base {};
+  class [[]] [[]] final_class 
+    alignas(float) [[]] final // expected-error {{an attribute list cannot appear here}}
+    alignas(float) [[]] [[]] alignas(float): base{}; // expected-error {{an attribute list cannot appear here}}
+
+  class [[]] [[]] final_class_another 
+    [[]] [[]] alignas(16) final // expected-error {{an attribute list cannot appear here}}
+    [[]] [[]] alignas(16) [[]]{}; // expected-error {{an attribute list cannot appear here}}
+}
Index: include/clang/Parse/Parser.h
===================================================================
--- include/clang/Parse/Parser.h	(revision 169063)
+++ include/clang/Parse/Parser.h	(working copy)
@@ -1862,6 +1862,10 @@
   // for example, attributes appertain to decl specifiers.
   void ProhibitCXX11Attributes(ParsedAttributesWithRange &attrs);
 
+  void CutAndPasteCode(SourceRange Range, 
+                       SourceLocation InsertLocation,
+                       unsigned int DiagID);
+
   void MaybeParseGNUAttributes(Declarator &D,
                                LateParsedAttrList *LateAttrs = 0) {
     if (Tok.is(tok::kw___attribute)) {
@@ -2092,7 +2096,9 @@
                            AccessSpecifier AS, bool EnteringContext,
                            DeclSpecContext DSC, 
                            ParsedAttributesWithRange &Attributes);
-  void ParseCXXMemberSpecification(SourceLocation StartLoc, unsigned TagType,
+  void ParseCXXMemberSpecification(SourceLocation StartLoc, 
+                                   SourceLocation AttrLoc, 
+                                   unsigned TagType,
                                    Decl *TagDecl);
   ExprResult ParseCXXMemberInitializer(Decl *D, bool IsFunction,
                                        SourceLocation &EqualLoc);
