diff -U3 -dHrN lib/ARCMigrate/ARCMT.cpp lib/ARCMigrate/ARCMT.cpp
--- lib/ARCMigrate/ARCMT.cpp	2012-06-25 14:52:28.000000000 +0200
+++ lib/ARCMigrate/ARCMT.cpp	2012-06-25 16:36:53.000000000 +0200
@@ -89,13 +89,47 @@
 
 namespace {
 
-class CaptureDiagnosticConsumer : public DiagnosticConsumer {
+class CaptureDiagnosticConsumer : public DiagnosticConsumer,
+                                  public CommentHandler {
+  typedef std::vector<SourceRange> CommentList;
   DiagnosticsEngine &Diags;
   CapturedDiagList &CapturedDiags;
+  CommentList Comments;
+  Preprocessor *PP;
 public:
   CaptureDiagnosticConsumer(DiagnosticsEngine &diags,
                            CapturedDiagList &capturedDiags)
-    : Diags(diags), CapturedDiags(capturedDiags) { }
+    : Diags(diags), CapturedDiags(capturedDiags), PP(0) { }
+
+  void BeginSourceFile(const LangOptions &, const Preprocessor *PP) {
+    // FIXME: Better would be if we could make a copy of Preprocessor, rather
+    // than use const_cast; see also VerifyDiagnosticConsumer::BeginSourceFile.
+    if (PP) {
+      this->PP = const_cast<Preprocessor*>(PP);
+      this->PP->addCommentHandler(this);
+    }
+  }
+
+  void EndSourceFile() {
+    if (PP) PP->removeCommentHandler(this);
+  }
+
+  bool HandleComment(Preprocessor& PP, SourceRange Comment) {
+    assert(&PP == this->PP && "Preprocessor changed!");
+    Comments.push_back(Comment);
+    return false;
+  }
+
+  void ForwardComments(CommentHandler *Target) {
+    bool ret;
+    if (Target && PP) {
+      for (CommentList::iterator I = Comments.begin(), End = Comments.end();
+            I != End; ++I) {
+        ret = Target->HandleComment(*PP, *I);
+        assert(!ret && "CommentCapture cannot handle CommentHandlers that push tokens");
+      }
+    }
+  }
 
   virtual void HandleDiagnostic(DiagnosticsEngine::Level level,
                                 const Diagnostic &Info) {
@@ -276,6 +310,7 @@
   if (Diags->hasFatalErrorOccurred()) {
     Diags->Reset();
     DiagClient->BeginSourceFile(Ctx.getLangOpts(), &Unit->getPreprocessor());
+    errRec.ForwardComments(DiagClient->getCommentHandler());
     capturedDiags.reportDiagnostics(*Diags);
     DiagClient->EndSourceFile();
     return true;
@@ -299,6 +334,7 @@
   // diagnostics with source range information are emitted only in between
   // BeginSourceFile() and EndSourceFile().
   DiagClient->BeginSourceFile(Ctx.getLangOpts(), &Unit->getPreprocessor());
+  errRec.ForwardComments(DiagClient->getCommentHandler());
 
   // No macros will be added since we are just checking and we won't modify
   // source code.
@@ -584,6 +620,7 @@
   if (Diags->hasFatalErrorOccurred()) {
     Diags->Reset();
     DiagClient->BeginSourceFile(Ctx.getLangOpts(), &Unit->getPreprocessor());
+    errRec.ForwardComments(DiagClient->getCommentHandler());
     capturedDiags.reportDiagnostics(*Diags);
     DiagClient->EndSourceFile();
     return true;
@@ -595,6 +632,7 @@
   // diagnostics with source range information are emitted only in between
   // BeginSourceFile() and EndSourceFile().
   DiagClient->BeginSourceFile(Ctx.getLangOpts(), &Unit->getPreprocessor());
+  errRec.ForwardComments(DiagClient->getCommentHandler());
 
   Rewriter rewriter(Ctx.getSourceManager(), Ctx.getLangOpts());
   TransformActions TA(*Diags, capturedDiags, Ctx, Unit->getPreprocessor());
