Index: lib/Parse/ParseStmt.cpp
===================================================================
--- lib/Parse/ParseStmt.cpp	(revision 169737)
+++ lib/Parse/ParseStmt.cpp	(working copy)
@@ -1288,10 +1288,8 @@
   BalancedDelimiterTracker T(*this, tok::l_paren);
   T.consumeOpen();
 
-  // FIXME: Do not just parse the attribute contents and throw them away
-  ParsedAttributesWithRange attrs(AttrFactory);
-  MaybeParseCXX0XAttributes(attrs);
-  ProhibitAttributes(attrs);
+  // C++11 attributes are not allowed here.
+  SkipCXX11Attributes();
 
   ExprResult Cond = ParseExpression();
   T.consumeClose();
@@ -2155,10 +2153,10 @@
   }
   else {
     StmtVector Handlers;
-    ParsedAttributesWithRange attrs(AttrFactory);
-    MaybeParseCXX0XAttributes(attrs);
-    ProhibitAttributes(attrs);
 
+    // C++11 attributes are not allowed here.
+    SkipCXX11Attributes();
+
     if (Tok.isNot(tok::kw_catch))
       return StmtError(Diag(Tok, diag::err_expected_catch));
     while (Tok.is(tok::kw_catch)) {
Index: lib/Parse/ParseDeclCXX.cpp
===================================================================
--- lib/Parse/ParseDeclCXX.cpp	(revision 169737)
+++ lib/Parse/ParseDeclCXX.cpp	(working copy)
@@ -453,11 +453,7 @@
   bool IsTypeName;
   ParsedAttributesWithRange attrs(AttrFactory);
 
-  // FIXME: Simply skip the attributes and diagnose, don't bother parsing them.
-  MaybeParseCXX0XAttributes(attrs);
-  ProhibitAttributes(attrs);
-  attrs.clear();
-  attrs.Range = SourceRange();
+  SkipCXX11Attributes();
 
   // Ignore optional 'typename'.
   // FIXME: This is wrong; we should parse this as a typename-specifier.
@@ -2412,10 +2408,8 @@
            diag::ext_override_control_keyword) << "final";
     }
 
-    // Forbid C++11 attributes that appear here.
-    ParsedAttributesWithRange Attrs(AttrFactory);
-    MaybeParseCXX0XAttributes(Attrs);
-    ProhibitAttributes(Attrs);
+    // C++11 attributes are not allowed here.
+    SkipCXX11Attributes();
   }
 
   if (Tok.is(tok::colon)) {
@@ -3146,6 +3140,61 @@
   attrs.Range = SourceRange(StartLoc, *endLoc);
 }
 
+void Parser::SkipCXX11Attributes() {
+  if (!isCXX11AttributeSpecifier())
+    return;
+
+  // Start and end location of an attribute or an attribute list.
+  SourceLocation StartLoc = Tok.getLocation();
+  SourceLocation EndLoc;
+  bool ParsingError = false;
+
+  while (true) {
+    if (Tok.is(tok::l_square) && NextToken().is(tok::l_square)) {
+      BalancedDelimiterTracker T(*this, tok::l_square);
+      T.consumeOpen();
+      T.consumeOpen();
+
+      if (!SkipUntil(tok::r_square, true, true)) {
+        // missing ']]'
+        ParsingError = true;
+        T.consumeClose();
+        break;
+      }
+
+      T.consumeClose();
+      if (Tok.isNot(tok::r_square)) {
+        // missing ']'
+        ParsingError = true;
+        T.consumeClose();
+        break;
+      }
+      T.consumeClose();
+      EndLoc = T.getCloseLocation();
+    } else if ((Tok.is(tok::kw_alignas) || Tok.is(tok::kw__Alignas)) && 
+               NextToken().is(tok::l_paren)) {
+      ConsumeToken();
+      BalancedDelimiterTracker T(*this, tok::l_paren);
+      T.consumeOpen();
+      if (!SkipUntil(tok::r_paren, true, true)) {
+        ParsingError = true;
+        T.consumeClose();
+        break;
+      }
+      T.consumeClose();
+      EndLoc = T.getCloseLocation();
+    } else {
+      break;
+    }
+  }
+
+  if (EndLoc.isValid() && !ParsingError) {
+    SourceRange Range(StartLoc, EndLoc);
+    Diag(StartLoc, diag::err_attributes_not_allowed)
+      << Range;
+  }
+}
+
 /// ParseMicrosoftAttributes - Parse a Microsoft attribute [Attr]
 ///
 /// [MS] ms-attribute:
Index: test/Parser/cxx0x-attributes.cpp
===================================================================
--- test/Parser/cxx0x-attributes.cpp	(revision 169737)
+++ test/Parser/cxx0x-attributes.cpp	(working copy)
@@ -119,7 +119,18 @@
 using T [[]] = int; // ok
 template<typename T> using U [[]] = T;
 using ns::i [[]]; // expected-error {{an attribute list cannot appear here}}
-using [[]] ns::i; // expected-error {{an attribute list cannot appear here}}
+using [[]] alignas(4) [[]] ns::i; // expected-error {{an attribute list cannot appear here}}
+using [[ ns::i; // expected-error {{expected ']'}} \
+        // expected-note {{to match this '['}} \
+        // expected-error {{expected unqualified-id}}
+using [[a]b ns::i; // expected-error {{expected ']'}} \
+        // expected-note {{to match this '['}} \
+        // expected-error {{expected unqualified-id}}
+using [[ab]ab] ns::i; // expected-error {{expected ']'}} \
+        // expected-note {{to match this '['}}
+using alignas(4 ns::i; // expected-error {{expected ')'}} \
+              // expected-note {{to match this '('}} \
+              // expected-error {{expected unqualified-id}}
 
 auto trailing() -> [[]] const int; // expected-error {{an attribute list cannot appear here}}
 auto trailing() -> const [[]] int; // expected-error {{an attribute list cannot appear here}}
Index: include/clang/Parse/Parser.h
===================================================================
--- include/clang/Parse/Parser.h	(revision 169737)
+++ include/clang/Parse/Parser.h	(working copy)
@@ -1862,6 +1862,10 @@
   // for example, attributes appertain to decl specifiers.
   void ProhibitCXX11Attributes(ParsedAttributesWithRange &attrs);
 
+  // \brief Skip C++11 attributes appear on certain syntactic locations
+  // where attributes are not allowed per standard, and diagnose.
+  void SkipCXX11Attributes();
+
   void MaybeParseGNUAttributes(Declarator &D,
                                LateParsedAttrList *LateAttrs = 0) {
     if (Tok.is(tok::kw___attribute)) {
