1*38fd1498Szrj /* A self-testing framework, for use by -fself-test. 2*38fd1498Szrj Copyright (C) 2015-2018 Free Software Foundation, Inc. 3*38fd1498Szrj 4*38fd1498Szrj This file is part of GCC. 5*38fd1498Szrj 6*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under 7*38fd1498Szrj the terms of the GNU General Public License as published by the Free 8*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later 9*38fd1498Szrj version. 10*38fd1498Szrj 11*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or 13*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14*38fd1498Szrj for more details. 15*38fd1498Szrj 16*38fd1498Szrj You should have received a copy of the GNU General Public License 17*38fd1498Szrj along with GCC; see the file COPYING3. If not see 18*38fd1498Szrj <http://www.gnu.org/licenses/>. */ 19*38fd1498Szrj 20*38fd1498Szrj #ifndef GCC_SELFTEST_H 21*38fd1498Szrj #define GCC_SELFTEST_H 22*38fd1498Szrj 23*38fd1498Szrj /* The selftest code should entirely disappear in a production 24*38fd1498Szrj configuration, hence we guard all of it with #if CHECKING_P. */ 25*38fd1498Szrj 26*38fd1498Szrj #if CHECKING_P 27*38fd1498Szrj 28*38fd1498Szrj namespace selftest { 29*38fd1498Szrj 30*38fd1498Szrj /* A struct describing the source-location of a selftest, to make it 31*38fd1498Szrj easier to track down failing tests. */ 32*38fd1498Szrj 33*38fd1498Szrj struct location 34*38fd1498Szrj { locationlocation35*38fd1498Szrj location (const char *file, int line, const char *function) 36*38fd1498Szrj : m_file (file), m_line (line), m_function (function) {} 37*38fd1498Szrj 38*38fd1498Szrj const char *m_file; 39*38fd1498Szrj int m_line; 40*38fd1498Szrj const char *m_function; 41*38fd1498Szrj }; 42*38fd1498Szrj 43*38fd1498Szrj /* A macro for use in selftests and by the ASSERT_ macros below, 44*38fd1498Szrj constructing a selftest::location for the current source location. */ 45*38fd1498Szrj 46*38fd1498Szrj #define SELFTEST_LOCATION \ 47*38fd1498Szrj (::selftest::location (__FILE__, __LINE__, __FUNCTION__)) 48*38fd1498Szrj 49*38fd1498Szrj /* The entrypoint for running all tests. */ 50*38fd1498Szrj 51*38fd1498Szrj extern void run_tests (); 52*38fd1498Szrj 53*38fd1498Szrj /* Record the successful outcome of some aspect of the test. */ 54*38fd1498Szrj 55*38fd1498Szrj extern void pass (const location &loc, const char *msg); 56*38fd1498Szrj 57*38fd1498Szrj /* Report the failed outcome of some aspect of the test and abort. */ 58*38fd1498Szrj 59*38fd1498Szrj extern void fail (const location &loc, const char *msg) 60*38fd1498Szrj ATTRIBUTE_NORETURN; 61*38fd1498Szrj 62*38fd1498Szrj /* As "fail", but using printf-style formatted output. */ 63*38fd1498Szrj 64*38fd1498Szrj extern void fail_formatted (const location &loc, const char *fmt, ...) 65*38fd1498Szrj ATTRIBUTE_PRINTF_2 ATTRIBUTE_NORETURN; 66*38fd1498Szrj 67*38fd1498Szrj /* Implementation detail of ASSERT_STREQ. */ 68*38fd1498Szrj 69*38fd1498Szrj extern void assert_streq (const location &loc, 70*38fd1498Szrj const char *desc_expected, const char *desc_actual, 71*38fd1498Szrj const char *val_expected, const char *val_actual); 72*38fd1498Szrj 73*38fd1498Szrj /* Implementation detail of ASSERT_STR_CONTAINS. */ 74*38fd1498Szrj 75*38fd1498Szrj extern void assert_str_contains (const location &loc, 76*38fd1498Szrj const char *desc_haystack, 77*38fd1498Szrj const char *desc_needle, 78*38fd1498Szrj const char *val_haystack, 79*38fd1498Szrj const char *val_needle); 80*38fd1498Szrj 81*38fd1498Szrj /* A named temporary file for use in selftests. 82*38fd1498Szrj Usable for writing out files, and as the base class for 83*38fd1498Szrj temp_source_file. 84*38fd1498Szrj The file is unlinked in the destructor. */ 85*38fd1498Szrj 86*38fd1498Szrj class named_temp_file 87*38fd1498Szrj { 88*38fd1498Szrj public: 89*38fd1498Szrj named_temp_file (const char *suffix); 90*38fd1498Szrj ~named_temp_file (); get_filename()91*38fd1498Szrj const char *get_filename () const { return m_filename; } 92*38fd1498Szrj 93*38fd1498Szrj private: 94*38fd1498Szrj char *m_filename; 95*38fd1498Szrj }; 96*38fd1498Szrj 97*38fd1498Szrj /* A class for writing out a temporary sourcefile for use in selftests 98*38fd1498Szrj of input handling. */ 99*38fd1498Szrj 100*38fd1498Szrj class temp_source_file : public named_temp_file 101*38fd1498Szrj { 102*38fd1498Szrj public: 103*38fd1498Szrj temp_source_file (const location &loc, const char *suffix, 104*38fd1498Szrj const char *content); 105*38fd1498Szrj }; 106*38fd1498Szrj 107*38fd1498Szrj /* Various selftests involving location-handling require constructing a 108*38fd1498Szrj line table and one or more line maps within it. 109*38fd1498Szrj 110*38fd1498Szrj For maximum test coverage we want to run these tests with a variety 111*38fd1498Szrj of situations: 112*38fd1498Szrj - line_table->default_range_bits: some frontends use a non-zero value 113*38fd1498Szrj and others use zero 114*38fd1498Szrj - the fallback modes within line-map.c: there are various threshold 115*38fd1498Szrj values for source_location/location_t beyond line-map.c changes 116*38fd1498Szrj behavior (disabling of the range-packing optimization, disabling 117*38fd1498Szrj of column-tracking). We can exercise these by starting the line_table 118*38fd1498Szrj at interesting values at or near these thresholds. 119*38fd1498Szrj 120*38fd1498Szrj The following struct describes a particular case within our test 121*38fd1498Szrj matrix. */ 122*38fd1498Szrj 123*38fd1498Szrj struct line_table_case; 124*38fd1498Szrj 125*38fd1498Szrj /* A class for overriding the global "line_table" within a selftest, 126*38fd1498Szrj restoring its value afterwards. At most one instance of this 127*38fd1498Szrj class can exist at once, due to the need to keep the old value 128*38fd1498Szrj of line_table as a GC root. */ 129*38fd1498Szrj 130*38fd1498Szrj class line_table_test 131*38fd1498Szrj { 132*38fd1498Szrj public: 133*38fd1498Szrj /* Default constructor. Override "line_table", using sane defaults 134*38fd1498Szrj for the temporary line_table. */ 135*38fd1498Szrj line_table_test (); 136*38fd1498Szrj 137*38fd1498Szrj /* Constructor. Override "line_table", using the case described by C. */ 138*38fd1498Szrj line_table_test (const line_table_case &c); 139*38fd1498Szrj 140*38fd1498Szrj /* Destructor. Restore the saved line_table. */ 141*38fd1498Szrj ~line_table_test (); 142*38fd1498Szrj }; 143*38fd1498Szrj 144*38fd1498Szrj /* Run TESTCASE multiple times, once for each case in our test matrix. */ 145*38fd1498Szrj 146*38fd1498Szrj extern void 147*38fd1498Szrj for_each_line_table_case (void (*testcase) (const line_table_case &)); 148*38fd1498Szrj 149*38fd1498Szrj /* Read the contents of PATH into memory, returning a 0-terminated buffer 150*38fd1498Szrj that must be freed by the caller. 151*38fd1498Szrj Fail (and abort) if there are any problems, with LOC as the reported 152*38fd1498Szrj location of the failure. */ 153*38fd1498Szrj 154*38fd1498Szrj extern char *read_file (const location &loc, const char *path); 155*38fd1498Szrj 156*38fd1498Szrj /* A helper function for writing tests that interact with the 157*38fd1498Szrj garbage collector. */ 158*38fd1498Szrj 159*38fd1498Szrj extern void forcibly_ggc_collect (); 160*38fd1498Szrj 161*38fd1498Szrj /* Convert a path relative to SRCDIR/gcc/testsuite/selftests 162*38fd1498Szrj to a real path (either absolute, or relative to pwd). 163*38fd1498Szrj The result should be freed by the caller. */ 164*38fd1498Szrj 165*38fd1498Szrj extern char *locate_file (const char *path); 166*38fd1498Szrj 167*38fd1498Szrj /* The path of SRCDIR/testsuite/selftests. */ 168*38fd1498Szrj 169*38fd1498Szrj extern const char *path_to_selftest_files; 170*38fd1498Szrj 171*38fd1498Szrj /* selftest::test_runner is an implementation detail of selftest::run_tests, 172*38fd1498Szrj exposed here to allow plugins to run their own suites of tests. */ 173*38fd1498Szrj 174*38fd1498Szrj class test_runner 175*38fd1498Szrj { 176*38fd1498Szrj public: 177*38fd1498Szrj test_runner (const char *name); 178*38fd1498Szrj ~test_runner (); 179*38fd1498Szrj 180*38fd1498Szrj private: 181*38fd1498Szrj const char *m_name; 182*38fd1498Szrj long m_start_time; 183*38fd1498Szrj }; 184*38fd1498Szrj 185*38fd1498Szrj /* Declarations for specific families of tests (by source file), in 186*38fd1498Szrj alphabetical order. */ 187*38fd1498Szrj extern void attribute_c_tests (); 188*38fd1498Szrj extern void bitmap_c_tests (); 189*38fd1498Szrj extern void sbitmap_c_tests (); 190*38fd1498Szrj extern void diagnostic_c_tests (); 191*38fd1498Szrj extern void diagnostic_show_locus_c_tests (); 192*38fd1498Szrj extern void edit_context_c_tests (); 193*38fd1498Szrj extern void et_forest_c_tests (); 194*38fd1498Szrj extern void fold_const_c_tests (); 195*38fd1498Szrj extern void fibonacci_heap_c_tests (); 196*38fd1498Szrj extern void function_tests_c_tests (); 197*38fd1498Szrj extern void gimple_c_tests (); 198*38fd1498Szrj extern void ggc_tests_c_tests (); 199*38fd1498Szrj extern void hash_map_tests_c_tests (); 200*38fd1498Szrj extern void hash_set_tests_c_tests (); 201*38fd1498Szrj extern void input_c_tests (); 202*38fd1498Szrj extern void pretty_print_c_tests (); 203*38fd1498Szrj extern void read_rtl_function_c_tests (); 204*38fd1498Szrj extern void rtl_tests_c_tests (); 205*38fd1498Szrj extern void selftest_c_tests (); 206*38fd1498Szrj extern void spellcheck_c_tests (); 207*38fd1498Szrj extern void spellcheck_tree_c_tests (); 208*38fd1498Szrj extern void sreal_c_tests (); 209*38fd1498Szrj extern void store_merging_c_tests (); 210*38fd1498Szrj extern void typed_splay_tree_c_tests (); 211*38fd1498Szrj extern void tree_c_tests (); 212*38fd1498Szrj extern void tree_cfg_c_tests (); 213*38fd1498Szrj extern void unique_ptr_tests_cc_tests (); 214*38fd1498Szrj extern void vec_c_tests (); 215*38fd1498Szrj extern void wide_int_cc_tests (); 216*38fd1498Szrj extern void predict_c_tests (); 217*38fd1498Szrj extern void simplify_rtx_c_tests (); 218*38fd1498Szrj extern void vec_perm_indices_c_tests (); 219*38fd1498Szrj 220*38fd1498Szrj extern int num_passes; 221*38fd1498Szrj 222*38fd1498Szrj } /* end of namespace selftest. */ 223*38fd1498Szrj 224*38fd1498Szrj /* Macros for writing tests. */ 225*38fd1498Szrj 226*38fd1498Szrj /* Evaluate EXPR and coerce to bool, calling 227*38fd1498Szrj ::selftest::pass if it is true, 228*38fd1498Szrj ::selftest::fail if it false. */ 229*38fd1498Szrj 230*38fd1498Szrj #define ASSERT_TRUE(EXPR) \ 231*38fd1498Szrj ASSERT_TRUE_AT (SELFTEST_LOCATION, (EXPR)) 232*38fd1498Szrj 233*38fd1498Szrj /* Like ASSERT_TRUE, but treat LOC as the effective location of the 234*38fd1498Szrj selftest. */ 235*38fd1498Szrj 236*38fd1498Szrj #define ASSERT_TRUE_AT(LOC, EXPR) \ 237*38fd1498Szrj SELFTEST_BEGIN_STMT \ 238*38fd1498Szrj const char *desc_ = "ASSERT_TRUE (" #EXPR ")"; \ 239*38fd1498Szrj bool actual_ = (EXPR); \ 240*38fd1498Szrj if (actual_) \ 241*38fd1498Szrj ::selftest::pass ((LOC), desc_); \ 242*38fd1498Szrj else \ 243*38fd1498Szrj ::selftest::fail ((LOC), desc_); \ 244*38fd1498Szrj SELFTEST_END_STMT 245*38fd1498Szrj 246*38fd1498Szrj /* Evaluate EXPR and coerce to bool, calling 247*38fd1498Szrj ::selftest::pass if it is false, 248*38fd1498Szrj ::selftest::fail if it true. */ 249*38fd1498Szrj 250*38fd1498Szrj #define ASSERT_FALSE(EXPR) \ 251*38fd1498Szrj ASSERT_FALSE_AT (SELFTEST_LOCATION, (EXPR)) 252*38fd1498Szrj 253*38fd1498Szrj /* Like ASSERT_FALSE, but treat LOC as the effective location of the 254*38fd1498Szrj selftest. */ 255*38fd1498Szrj 256*38fd1498Szrj #define ASSERT_FALSE_AT(LOC, EXPR) \ 257*38fd1498Szrj SELFTEST_BEGIN_STMT \ 258*38fd1498Szrj const char *desc_ = "ASSERT_FALSE (" #EXPR ")"; \ 259*38fd1498Szrj bool actual_ = (EXPR); \ 260*38fd1498Szrj if (actual_) \ 261*38fd1498Szrj ::selftest::fail ((LOC), desc_); \ 262*38fd1498Szrj else \ 263*38fd1498Szrj ::selftest::pass ((LOC), desc_); \ 264*38fd1498Szrj SELFTEST_END_STMT 265*38fd1498Szrj 266*38fd1498Szrj /* Evaluate EXPECTED and ACTUAL and compare them with ==, calling 267*38fd1498Szrj ::selftest::pass if they are equal, 268*38fd1498Szrj ::selftest::fail if they are non-equal. */ 269*38fd1498Szrj 270*38fd1498Szrj #define ASSERT_EQ(EXPECTED, ACTUAL) \ 271*38fd1498Szrj ASSERT_EQ_AT ((SELFTEST_LOCATION), (EXPECTED), (ACTUAL)) 272*38fd1498Szrj 273*38fd1498Szrj /* Like ASSERT_EQ, but treat LOC as the effective location of the 274*38fd1498Szrj selftest. */ 275*38fd1498Szrj 276*38fd1498Szrj #define ASSERT_EQ_AT(LOC, EXPECTED, ACTUAL) \ 277*38fd1498Szrj SELFTEST_BEGIN_STMT \ 278*38fd1498Szrj const char *desc_ = "ASSERT_EQ (" #EXPECTED ", " #ACTUAL ")"; \ 279*38fd1498Szrj if ((EXPECTED) == (ACTUAL)) \ 280*38fd1498Szrj ::selftest::pass ((LOC), desc_); \ 281*38fd1498Szrj else \ 282*38fd1498Szrj ::selftest::fail ((LOC), desc_); \ 283*38fd1498Szrj SELFTEST_END_STMT 284*38fd1498Szrj 285*38fd1498Szrj /* Evaluate EXPECTED and ACTUAL and compare them with known_eq, calling 286*38fd1498Szrj ::selftest::pass if they are always equal, 287*38fd1498Szrj ::selftest::fail if they might be non-equal. */ 288*38fd1498Szrj 289*38fd1498Szrj #define ASSERT_KNOWN_EQ(EXPECTED, ACTUAL) \ 290*38fd1498Szrj ASSERT_KNOWN_EQ_AT ((SELFTEST_LOCATION), (EXPECTED), (ACTUAL)) 291*38fd1498Szrj 292*38fd1498Szrj /* Like ASSERT_KNOWN_EQ, but treat LOC as the effective location of the 293*38fd1498Szrj selftest. */ 294*38fd1498Szrj 295*38fd1498Szrj #define ASSERT_KNOWN_EQ_AT(LOC, EXPECTED, ACTUAL) \ 296*38fd1498Szrj SELFTEST_BEGIN_STMT \ 297*38fd1498Szrj const char *desc = "ASSERT_KNOWN_EQ (" #EXPECTED ", " #ACTUAL ")"; \ 298*38fd1498Szrj if (known_eq (EXPECTED, ACTUAL)) \ 299*38fd1498Szrj ::selftest::pass ((LOC), desc); \ 300*38fd1498Szrj else \ 301*38fd1498Szrj ::selftest::fail ((LOC), desc); \ 302*38fd1498Szrj SELFTEST_END_STMT 303*38fd1498Szrj 304*38fd1498Szrj /* Evaluate EXPECTED and ACTUAL and compare them with !=, calling 305*38fd1498Szrj ::selftest::pass if they are non-equal, 306*38fd1498Szrj ::selftest::fail if they are equal. */ 307*38fd1498Szrj 308*38fd1498Szrj #define ASSERT_NE(EXPECTED, ACTUAL) \ 309*38fd1498Szrj SELFTEST_BEGIN_STMT \ 310*38fd1498Szrj const char *desc_ = "ASSERT_NE (" #EXPECTED ", " #ACTUAL ")"; \ 311*38fd1498Szrj if ((EXPECTED) != (ACTUAL)) \ 312*38fd1498Szrj ::selftest::pass (SELFTEST_LOCATION, desc_); \ 313*38fd1498Szrj else \ 314*38fd1498Szrj ::selftest::fail (SELFTEST_LOCATION, desc_); \ 315*38fd1498Szrj SELFTEST_END_STMT 316*38fd1498Szrj 317*38fd1498Szrj /* Evaluate EXPECTED and ACTUAL and compare them with maybe_ne, calling 318*38fd1498Szrj ::selftest::pass if they might be non-equal, 319*38fd1498Szrj ::selftest::fail if they are known to be equal. */ 320*38fd1498Szrj 321*38fd1498Szrj #define ASSERT_MAYBE_NE(EXPECTED, ACTUAL) \ 322*38fd1498Szrj ASSERT_MAYBE_NE_AT ((SELFTEST_LOCATION), (EXPECTED), (ACTUAL)) 323*38fd1498Szrj 324*38fd1498Szrj /* Like ASSERT_MAYBE_NE, but treat LOC as the effective location of the 325*38fd1498Szrj selftest. */ 326*38fd1498Szrj 327*38fd1498Szrj #define ASSERT_MAYBE_NE_AT(LOC, EXPECTED, ACTUAL) \ 328*38fd1498Szrj SELFTEST_BEGIN_STMT \ 329*38fd1498Szrj const char *desc = "ASSERT_MAYBE_NE (" #EXPECTED ", " #ACTUAL ")"; \ 330*38fd1498Szrj if (maybe_ne (EXPECTED, ACTUAL)) \ 331*38fd1498Szrj ::selftest::pass ((LOC), desc); \ 332*38fd1498Szrj else \ 333*38fd1498Szrj ::selftest::fail ((LOC), desc); \ 334*38fd1498Szrj SELFTEST_END_STMT 335*38fd1498Szrj 336*38fd1498Szrj /* Evaluate LHS and RHS and compare them with >, calling 337*38fd1498Szrj ::selftest::pass if LHS > RHS, 338*38fd1498Szrj ::selftest::fail otherwise. */ 339*38fd1498Szrj 340*38fd1498Szrj #define ASSERT_GT(LHS, RHS) \ 341*38fd1498Szrj ASSERT_GT_AT ((SELFTEST_LOCATION), (LHS), (RHS)) 342*38fd1498Szrj 343*38fd1498Szrj /* Like ASSERT_GT, but treat LOC as the effective location of the 344*38fd1498Szrj selftest. */ 345*38fd1498Szrj 346*38fd1498Szrj #define ASSERT_GT_AT(LOC, LHS, RHS) \ 347*38fd1498Szrj SELFTEST_BEGIN_STMT \ 348*38fd1498Szrj const char *desc_ = "ASSERT_GT (" #LHS ", " #RHS ")"; \ 349*38fd1498Szrj if ((LHS) > (RHS)) \ 350*38fd1498Szrj ::selftest::pass ((LOC), desc_); \ 351*38fd1498Szrj else \ 352*38fd1498Szrj ::selftest::fail ((LOC), desc_); \ 353*38fd1498Szrj SELFTEST_END_STMT 354*38fd1498Szrj 355*38fd1498Szrj /* Evaluate LHS and RHS and compare them with <, calling 356*38fd1498Szrj ::selftest::pass if LHS < RHS, 357*38fd1498Szrj ::selftest::fail otherwise. */ 358*38fd1498Szrj 359*38fd1498Szrj #define ASSERT_LT(LHS, RHS) \ 360*38fd1498Szrj ASSERT_LT_AT ((SELFTEST_LOCATION), (LHS), (RHS)) 361*38fd1498Szrj 362*38fd1498Szrj /* Like ASSERT_LT, but treat LOC as the effective location of the 363*38fd1498Szrj selftest. */ 364*38fd1498Szrj 365*38fd1498Szrj #define ASSERT_LT_AT(LOC, LHS, RHS) \ 366*38fd1498Szrj SELFTEST_BEGIN_STMT \ 367*38fd1498Szrj const char *desc_ = "ASSERT_LT (" #LHS ", " #RHS ")"; \ 368*38fd1498Szrj if ((LHS) < (RHS)) \ 369*38fd1498Szrj ::selftest::pass ((LOC), desc_); \ 370*38fd1498Szrj else \ 371*38fd1498Szrj ::selftest::fail ((LOC), desc_); \ 372*38fd1498Szrj SELFTEST_END_STMT 373*38fd1498Szrj 374*38fd1498Szrj /* Evaluate EXPECTED and ACTUAL and compare them with strcmp, calling 375*38fd1498Szrj ::selftest::pass if they are equal, 376*38fd1498Szrj ::selftest::fail if they are non-equal. */ 377*38fd1498Szrj 378*38fd1498Szrj #define ASSERT_STREQ(EXPECTED, ACTUAL) \ 379*38fd1498Szrj SELFTEST_BEGIN_STMT \ 380*38fd1498Szrj ::selftest::assert_streq (SELFTEST_LOCATION, #EXPECTED, #ACTUAL, \ 381*38fd1498Szrj (EXPECTED), (ACTUAL)); \ 382*38fd1498Szrj SELFTEST_END_STMT 383*38fd1498Szrj 384*38fd1498Szrj /* Like ASSERT_STREQ, but treat LOC as the effective location of the 385*38fd1498Szrj selftest. */ 386*38fd1498Szrj 387*38fd1498Szrj #define ASSERT_STREQ_AT(LOC, EXPECTED, ACTUAL) \ 388*38fd1498Szrj SELFTEST_BEGIN_STMT \ 389*38fd1498Szrj ::selftest::assert_streq ((LOC), #EXPECTED, #ACTUAL, \ 390*38fd1498Szrj (EXPECTED), (ACTUAL)); \ 391*38fd1498Szrj SELFTEST_END_STMT 392*38fd1498Szrj 393*38fd1498Szrj /* Evaluate HAYSTACK and NEEDLE and use strstr to determine if NEEDLE 394*38fd1498Szrj is within HAYSTACK. 395*38fd1498Szrj ::selftest::pass if NEEDLE is found. 396*38fd1498Szrj ::selftest::fail if it is not found. */ 397*38fd1498Szrj 398*38fd1498Szrj #define ASSERT_STR_CONTAINS(HAYSTACK, NEEDLE) \ 399*38fd1498Szrj SELFTEST_BEGIN_STMT \ 400*38fd1498Szrj ::selftest::assert_str_contains (SELFTEST_LOCATION, #HAYSTACK, #NEEDLE, \ 401*38fd1498Szrj (HAYSTACK), (NEEDLE)); \ 402*38fd1498Szrj SELFTEST_END_STMT 403*38fd1498Szrj 404*38fd1498Szrj /* Evaluate PRED1 (VAL1), calling ::selftest::pass if it is true, 405*38fd1498Szrj ::selftest::fail if it is false. */ 406*38fd1498Szrj 407*38fd1498Szrj #define ASSERT_PRED1(PRED1, VAL1) \ 408*38fd1498Szrj SELFTEST_BEGIN_STMT \ 409*38fd1498Szrj const char *desc_ = "ASSERT_PRED1 (" #PRED1 ", " #VAL1 ")"; \ 410*38fd1498Szrj bool actual_ = (PRED1) (VAL1); \ 411*38fd1498Szrj if (actual_) \ 412*38fd1498Szrj ::selftest::pass (SELFTEST_LOCATION, desc_); \ 413*38fd1498Szrj else \ 414*38fd1498Szrj ::selftest::fail (SELFTEST_LOCATION, desc_); \ 415*38fd1498Szrj SELFTEST_END_STMT 416*38fd1498Szrj 417*38fd1498Szrj #define SELFTEST_BEGIN_STMT do { 418*38fd1498Szrj #define SELFTEST_END_STMT } while (0) 419*38fd1498Szrj 420*38fd1498Szrj #endif /* #if CHECKING_P */ 421*38fd1498Szrj 422*38fd1498Szrj #endif /* GCC_SELFTEST_H */ 423