Improve Assert output
authorPeter Eisentraut <peter@eisentraut.org>
Sat, 17 Aug 2019 10:36:30 +0000 (12:36 +0200)
committerPeter Eisentraut <peter@eisentraut.org>
Sat, 17 Aug 2019 10:50:50 +0000 (12:50 +0200)
If an assertion expression contained a macro, the failed assertion
message would print the expanded macro, which is usually unhelpful and
confusing.  Restructure the Assert macros to not expand any macros
when constructing the failure message.

This also fixes that the existing output for Assert et al. shows
the *inverted* condition, which is also confusing and not how
assertions usually work.

Discussion: https://www.postgresql.org/message-id/flat/6c68efe3-117a-dcc1-73d4-18ba1ec532e2%402ndquadrant.com

src/include/c.h

index 2a082afab11c941f8304f62e4ae2cfdb90941d95..f461628a24ef2a1be46511da06bedbc73143bc77 100644 (file)
@@ -755,7 +755,7 @@ typedef NameData *Name;
 #define Trap(condition, errorType) \
    do { \
        if (condition) \
-           ExceptionalCondition(CppAsString(condition), (errorType), \
+           ExceptionalCondition(#condition, (errorType), \
                                 __FILE__, __LINE__); \
    } while (0)
 
@@ -768,20 +768,34 @@ typedef NameData *Name;
  */
 #define TrapMacro(condition, errorType) \
    ((bool) (! (condition) || \
-            (ExceptionalCondition(CppAsString(condition), (errorType), \
+            (ExceptionalCondition(#condition, (errorType), \
                                   __FILE__, __LINE__), 0)))
 
 #define Assert(condition) \
-       Trap(!(condition), "FailedAssertion")
+   do { \
+       if (!(condition)) \
+           ExceptionalCondition(#condition, "FailedAssertion", \
+                                __FILE__, __LINE__); \
+   } while (0)
 
 #define AssertMacro(condition) \
-       ((void) TrapMacro(!(condition), "FailedAssertion"))
+   ((void) ((condition) || \
+            (ExceptionalCondition(#condition, "FailedAssertion", \
+                                  __FILE__, __LINE__), 0)))
 
 #define AssertArg(condition) \
-       Trap(!(condition), "BadArgument")
+   do { \
+       if (!(condition)) \
+           ExceptionalCondition(#condition, "BadArgument", \
+                                __FILE__, __LINE__); \
+   } while (0)
 
 #define AssertState(condition) \
-       Trap(!(condition), "BadState")
+   do { \
+       if (!(condition)) \
+           ExceptionalCondition(#condition, "BadState", \
+                                __FILE__, __LINE__); \
+   } while (0)
 
 /*
  * Check that `ptr' is `bndr' aligned.