Fix the location of "missing ';'" suggestions after annotation tokens.

We were incorrectly setting PrevTokLocation to the first token in the
annotation token instead of the last when consuming it. To fix this without
adding a complex switch to the hot path through ConsumeToken, we now have a
ConsumeAnnotationToken function for consuming annotation tokens in addition
to the other Consume*Token special case functions.

llvm-svn: 303372
diff --git a/clang/test/Parser/cxx0x-decl.cpp b/clang/test/Parser/cxx0x-decl.cpp
index d912e19..ba322a5 100644
--- a/clang/test/Parser/cxx0x-decl.cpp
+++ b/clang/test/Parser/cxx0x-decl.cpp
@@ -123,6 +123,22 @@
   ::decltype(S())::T invalid; // expected-error {{expected unqualified-id}}
 }
 
+namespace AliasDeclEndLocation {
+  template<typename T> struct A {};
+  // Ensure that we correctly determine the end of this declaration to be the
+  // end of the annotation token, not the beginning.
+  using B = AliasDeclEndLocation::A<int
+    > // expected-error {{expected ';' after alias declaration}}
+    +;
+  // FIXME: After splitting this >> into two > tokens, we incorrectly determine
+  // the end of the template-id to be after the *second* '>'.
+  // Perhaps we could synthesize an expansion FileID containing '> >' to fix this?
+  using C = AliasDeclEndLocation::A<int
+    >\
+> // expected-error {{expected ';' after alias declaration}}
+    ;
+}
+
 struct Base { virtual void f() = 0; virtual void g() = 0; virtual void h() = 0; };
 struct MemberComponentOrder : Base {
   void f() override __asm__("foobar") __attribute__(( )) {}