Selaa lähdekoodia

Log C++ file/line number in CHECK and FATAL (#862)

Geoff Romer 4 vuotta sitten
vanhempi
sitoutus
c37521fdc3
2 muutettua tiedostoa jossa 18 lisäystä ja 9 poistoa
  1. 9 5
      common/check.h
  2. 9 4
      common/check_test.cpp

+ 9 - 5
common/check.h

@@ -67,17 +67,21 @@ class ExitingStream {
 //
 // For example:
 //   CHECK(is_valid) << "Data is not valid!";
-#define CHECK(condition)                                                      \
-  (!(condition)) && (Carbon::ExitingStream() << "CHECK failure: " #condition) \
-                        .AddSeparator()                                       \
-                        .TreatAsBug()
+#define CHECK(condition)                                                 \
+  (!(condition)) &&                                                      \
+      (Carbon::ExitingStream() << "CHECK failure at " << __FILE__ << ":" \
+                               << __LINE__ << ": " #condition)           \
+          .AddSeparator()                                                \
+          .TreatAsBug()
 
 // This is similar to CHECK, but is unconditional. Writing FATAL() is clearer
 // than CHECK(false) because it avoids confusion about control flow.
 //
 // For example:
 //   FATAL() << "Unreachable!";
-#define FATAL() Carbon::ExitingStream().TreatAsBug() << "FATAL: "
+#define FATAL()                        \
+  Carbon::ExitingStream().TreatAsBug() \
+      << "FATAL failure at " << __FILE__ << ":" << __LINE__ << ": "
 
 }  // namespace Carbon
 

+ 9 - 4
common/check_test.cpp

@@ -11,7 +11,9 @@ namespace Carbon {
 TEST(CheckTest, CheckTrue) { CHECK(true); }
 
 TEST(CheckTest, CheckFalse) {
-  ASSERT_DEATH({ CHECK(false); }, "CHECK failure: false\n");
+  // TODO: figure out why we can't use \\d+ instead of .+ in these patterns.
+  ASSERT_DEATH({ CHECK(false); },
+               "CHECK failure at common/check_test.cpp:.+: false\n");
 }
 
 TEST(CheckTest, CheckTrueCallbackNotUsed) {
@@ -25,7 +27,8 @@ TEST(CheckTest, CheckTrueCallbackNotUsed) {
 }
 
 TEST(CheckTest, CheckFalseMessage) {
-  ASSERT_DEATH({ CHECK(false) << "msg"; }, "CHECK failure: false: msg\n");
+  ASSERT_DEATH({ CHECK(false) << "msg"; },
+               "CHECK failure at common/check_test.cpp:.+: false: msg\n");
 }
 
 TEST(CheckTest, CheckOutputForms) {
@@ -36,13 +39,15 @@ TEST(CheckTest, CheckOutputForms) {
 }
 
 TEST(CheckTest, Fatal) {
-  ASSERT_DEATH({ FATAL() << "msg"; }, "FATAL: msg\n");
+  ASSERT_DEATH({ FATAL() << "msg"; },
+               "FATAL failure at common/check_test.cpp:.+: msg\n");
 }
 
 auto FatalNoReturnRequired() -> int { FATAL() << "msg"; }
 
 TEST(ErrorTest, FatalNoReturnRequired) {
-  ASSERT_DEATH({ FatalNoReturnRequired(); }, "FATAL: msg\n");
+  ASSERT_DEATH({ FatalNoReturnRequired(); },
+               "FATAL failure at common/check_test.cpp:.+: msg\n");
 }
 
 }  // namespace Carbon