Hi,
I would like to submit the attached patch for review. It adds remark
support to our '-verify' command. This missing feature which even lead
to a compiler crash was reported by Alp. The test that verifies the
implementation is a good use case for this feature, as we can
now easily verify the line information we report.
Thanks,
Tobias
>From ea08209ec9b37d06be57bd18040e6731ef08fbc4 Mon Sep 17 00:00:00 2001
From: Tobias Grosser <[email protected]>
Date: Mon, 28 Apr 2014 09:48:25 +0200
Subject: [PATCH] Support 'remark' in VerifyDiagnosticConsumer
After Diego added support for -Rpass=inliner we have now in-tree remarks which
we can use to properly test this feature.
---
include/clang/Frontend/TextDiagnosticBuffer.h | 5 ++++-
include/clang/Frontend/VerifyDiagnosticConsumer.h | 10 ++++++----
lib/Frontend/TextDiagnosticBuffer.cpp | 6 ++++++
lib/Frontend/VerifyDiagnosticConsumer.cpp | 6 ++++++
test/Frontend/optimization-remark.c | 7 +++----
5 files changed, 25 insertions(+), 9 deletions(-)
diff --git a/include/clang/Frontend/TextDiagnosticBuffer.h b/include/clang/Frontend/TextDiagnosticBuffer.h
index feff798..fe5aa3e 100644
--- a/include/clang/Frontend/TextDiagnosticBuffer.h
+++ b/include/clang/Frontend/TextDiagnosticBuffer.h
@@ -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(); }
diff --git a/include/clang/Frontend/VerifyDiagnosticConsumer.h b/include/clang/Frontend/VerifyDiagnosticConsumer.h
index fb026bb..084eb66 100644
--- a/include/clang/Frontend/VerifyDiagnosticConsumer.h
+++ b/include/clang/Frontend/VerifyDiagnosticConsumer.h
@@ -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);
}
diff --git a/lib/Frontend/TextDiagnosticBuffer.cpp b/lib/Frontend/TextDiagnosticBuffer.cpp
index b1c793a..9c6bebb 100644
--- a/lib/Frontend/TextDiagnosticBuffer.cpp
+++ b/lib/Frontend/TextDiagnosticBuffer.cpp
@@ -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;
diff --git a/lib/Frontend/VerifyDiagnosticConsumer.cpp b/lib/Frontend/VerifyDiagnosticConsumer.cpp
index d6d0115..9df3978 100644
--- a/lib/Frontend/VerifyDiagnosticConsumer.cpp
+++ b/lib/Frontend/VerifyDiagnosticConsumer.cpp
@@ -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());
diff --git a/test/Frontend/optimization-remark.c b/test/Frontend/optimization-remark.c
index 03bb8f8..3a62db0 100644
--- a/test/Frontend/optimization-remark.c
+++ b/test/Frontend/optimization-remark.c
@@ -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
--
1.8.3.2
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits