]> granicus.if.org Git - clang/commitdiff
Support 'remark' in VerifyDiagnosticConsumer
authorTobias Grosser <tobias@grosser.es>
Thu, 1 May 2014 14:06:01 +0000 (14:06 +0000)
committerTobias Grosser <tobias@grosser.es>
Thu, 1 May 2014 14:06:01 +0000 (14:06 +0000)
After Diego added support for -Rpass=inliner we have now in-tree remarks which
we can use to properly test this feature.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@207765 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Frontend/TextDiagnosticBuffer.h
include/clang/Frontend/VerifyDiagnosticConsumer.h
lib/Frontend/TextDiagnosticBuffer.cpp
lib/Frontend/VerifyDiagnosticConsumer.cpp
test/Frontend/optimization-remark.c

index feff798f623b1cae9480ed0a72d800b953022af6..fe5aa3e91d7f1370d8ee48e5a114ac82882a0919 100644 (file)
@@ -28,7 +28,7 @@ public:
   typedef DiagList::iterator iterator;
   typedef DiagList::const_iterator const_iterator;
 private:
-  DiagList Errors, Warnings, Notes;
+  DiagList Errors, Warnings, Remarks, Notes;
 public:
   const_iterator err_begin() const  { return Errors.begin(); }
   const_iterator err_end() const    { return Errors.end(); }
@@ -36,6 +36,9 @@ public:
   const_iterator warn_begin() const { return Warnings.begin(); }
   const_iterator warn_end() const   { return Warnings.end(); }
 
+  const_iterator remark_begin() const { return Remarks.begin(); }
+  const_iterator remark_end() const   { return Remarks.end(); }
+
   const_iterator note_begin() const { return Notes.begin(); }
   const_iterator note_end() const   { return Notes.end(); }
 
index fb026bbc2b0470044906a44c12eacc76b39889ac..084eb66d859ead6d27573f368b27e66ee9f8395d 100644 (file)
@@ -34,12 +34,12 @@ class FileEntry;
 /// comment on the line that has the diagnostic, use:
 ///
 /// \code
-///   expected-{error,warning,note}
+///   expected-{error,warning,remark,note}
 /// \endcode
 ///
-/// to tag if it's an expected error or warning, and place the expected text
-/// between {{ and }} markers. The full text doesn't have to be included, only
-/// enough to ensure that the correct diagnostic was emitted.
+/// to tag if it's an expected error, remark or warning, and place the expected
+/// text between {{ and }} markers. The full text doesn't have to be included,
+/// only enough to ensure that the correct diagnostic was emitted.
 ///
 /// Here's an example:
 ///
@@ -184,11 +184,13 @@ public:
   struct ExpectedData {
     DirectiveList Errors;
     DirectiveList Warnings;
+    DirectiveList Remarks;
     DirectiveList Notes;
 
     void Reset() {
       llvm::DeleteContainerPointers(Errors);
       llvm::DeleteContainerPointers(Warnings);
+      llvm::DeleteContainerPointers(Remarks);
       llvm::DeleteContainerPointers(Notes);
     }
 
index b1c793a9709e77a373a634a168e0d2fafd668156..9c6bebb07210fbdca1abb28c41c8ae29fb435fc5 100644 (file)
@@ -35,6 +35,9 @@ void TextDiagnosticBuffer::HandleDiagnostic(DiagnosticsEngine::Level Level,
   case DiagnosticsEngine::Warning:
     Warnings.push_back(std::make_pair(Info.getLocation(), Buf.str()));
     break;
+  case DiagnosticsEngine::Remark:
+    Remarks.push_back(std::make_pair(Info.getLocation(), Buf.str()));
+    break;
   case DiagnosticsEngine::Error:
   case DiagnosticsEngine::Fatal:
     Errors.push_back(std::make_pair(Info.getLocation(), Buf.str()));
@@ -50,6 +53,9 @@ void TextDiagnosticBuffer::FlushDiagnostics(DiagnosticsEngine &Diags) const {
   for (const_iterator it = warn_begin(), ie = warn_end(); it != ie; ++it)
     Diags.Report(Diags.getCustomDiagID(DiagnosticsEngine::Warning, "%0"))
         << it->second;
+  for (const_iterator it = remark_begin(), ie = remark_end(); it != ie; ++it)
+    Diags.Report(Diags.getCustomDiagID(DiagnosticsEngine::Remark, "%0"))
+        << it->second;
   for (const_iterator it = note_begin(), ie = note_end(); it != ie; ++it)
     Diags.Report(Diags.getCustomDiagID(DiagnosticsEngine::Note, "%0"))
         << it->second;
index d6d01156557ebf3977f75252e6c45f47502f3e60..9df39782abb6f0e10e95039334e221703715c46b 100644 (file)
@@ -330,6 +330,8 @@ static bool ParseDirective(StringRef S, ExpectedData *ED, SourceManager &SM,
       DL = ED ? &ED->Errors : NULL;
     else if (PH.Next("warning"))
       DL = ED ? &ED->Warnings : NULL;
+    else if (PH.Next("remark"))
+      DL = ED ? &ED->Remarks : NULL;
     else if (PH.Next("note"))
       DL = ED ? &ED->Notes : NULL;
     else if (PH.Next("no-diagnostics")) {
@@ -737,6 +739,10 @@ static unsigned CheckResults(DiagnosticsEngine &Diags, SourceManager &SourceMgr,
   NumProblems += CheckLists(Diags, SourceMgr, "warning", ED.Warnings,
                             Buffer.warn_begin(), Buffer.warn_end());
 
+  // See if there are remark mismatches.
+  NumProblems += CheckLists(Diags, SourceMgr, "remark", ED.Remarks,
+                            Buffer.remark_begin(), Buffer.remark_end());
+
   // See if there are note mismatches.
   NumProblems += CheckLists(Diags, SourceMgr, "note", ED.Notes,
                             Buffer.note_begin(), Buffer.note_end());
index 03bb8f875ac83739ec9582de6a86de89b9b8f0bc..3a62db0db02672f03a46558c16052c6f7d3f184d 100644 (file)
@@ -2,8 +2,7 @@
 // designed to always trigger the inliner, so it should be independent
 // of the optimization level.
 
-// RUN: %clang -c %s -Rpass=inline -O0 -gline-tables-only -S -o /dev/null 2> %t.err
-// RUN: FileCheck < %t.err %s --check-prefix=INLINE
+// RUN: %clang_cc1 %s -Rpass=inline -O0 -gline-tables-only -emit-obj -verify -S -o /dev/null 2> %t.err
 
 // RUN: %clang -c %s -Rpass=inline -O0 -S -o /dev/null 2> %t.err
 // RUN: FileCheck < %t.err %s --check-prefix=INLINE-NO-LOC
@@ -11,9 +10,9 @@
 int foo(int x, int y) __attribute__((always_inline));
 
 int foo(int x, int y) { return x + y; }
-int bar(int j) { return foo(j, j - 2); }
 
-// INLINE: remark: foo inlined into bar [-Rpass=inline]
+// expected-remark@+1 {{foo inlined into bar}}
+int bar(int j) { return foo(j, j - 2); }
 
 // INLINE-NO-LOC: {{^remark: foo inlined into bar}}
 // INLINE-NO-LOC: note: use -gline-tables-only -gcolumn-info to track