LCOV - code coverage report
Current view: top level - gcc - selftest.h Coverage Total Hit
Test: gcc.info Lines: 100.0 % 4 4
Test Date: 2026-02-28 14:20:25 Functions: - 0 0
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* A self-testing framework, for use by -fself-test.
       2              :    Copyright (C) 2015-2026 Free Software Foundation, Inc.
       3              : 
       4              : This file is part of GCC.
       5              : 
       6              : GCC is free software; you can redistribute it and/or modify it under
       7              : the terms of the GNU General Public License as published by the Free
       8              : Software Foundation; either version 3, or (at your option) any later
       9              : version.
      10              : 
      11              : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      12              : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13              : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14              : for more details.
      15              : 
      16              : You should have received a copy of the GNU General Public License
      17              : along with GCC; see the file COPYING3.  If not see
      18              : <http://www.gnu.org/licenses/>.  */
      19              : 
      20              : #ifndef GCC_SELFTEST_H
      21              : #define GCC_SELFTEST_H
      22              : 
      23              : /* The selftest code should entirely disappear in a production
      24              :    configuration, hence we guard all of it with #if CHECKING_P.  */
      25              : 
      26              : #if CHECKING_P
      27              : 
      28              : namespace diagnostics { class file_cache; }
      29              : 
      30              : namespace selftest {
      31              : 
      32              : /* A struct describing the source-location of a selftest, to make it
      33              :    easier to track down failing tests.  */
      34              : 
      35              : class location
      36              : {
      37              : public:
      38     30557083 :   location (const char *file, int line, const char *function)
      39     30544263 :     : m_file (file), m_line (line), m_function (function) {}
      40              : 
      41              :   const char *m_file;
      42              :   int m_line;
      43              :   const char *m_function;
      44              : };
      45              : 
      46              : /* A macro for use in selftests and by the ASSERT_ macros below,
      47              :    constructing a selftest::location for the current source location.  */
      48              : 
      49              : #define SELFTEST_LOCATION \
      50              :   (::selftest::location (__FILE__, __LINE__, __FUNCTION__))
      51              : 
      52              : /* The entrypoint for running all tests.  */
      53              : 
      54              : extern void run_tests ();
      55              : 
      56              : /* Record the successful outcome of some aspect of the test.  */
      57              : 
      58              : extern void pass (const location &loc, const char *msg);
      59              : 
      60              : /* Report the failed outcome of some aspect of the test and abort.  */
      61              : 
      62              : extern void fail (const location &loc, const char *msg)
      63              :   ATTRIBUTE_NORETURN;
      64              : 
      65              : /* As "fail", but using printf-style formatted output.  */
      66              : 
      67              : extern void fail_formatted (const location &loc, const char *fmt, ...)
      68              :   ATTRIBUTE_PRINTF_2 ATTRIBUTE_NORETURN;
      69              : 
      70              : /* Implementation detail of ASSERT_STREQ.  */
      71              : 
      72              : extern void assert_streq (const location &loc,
      73              :                           const char *desc_val1, const char *desc_val2,
      74              :                           const char *val1, const char *val2);
      75              : 
      76              : /* Implementation detail of ASSERT_STR_CONTAINS.  */
      77              : 
      78              : extern void assert_str_contains (const location &loc,
      79              :                                  const char *desc_haystack,
      80              :                                  const char *desc_needle,
      81              :                                  const char *val_haystack,
      82              :                                  const char *val_needle);
      83              : 
      84              : /* Implementation detail of ASSERT_STR_STARTSWITH.  */
      85              : 
      86              : extern void assert_str_startswith (const location &loc,
      87              :                                    const char *desc_str,
      88              :                                    const char *desc_prefix,
      89              :                                    const char *val_str,
      90              :                                    const char *val_prefix);
      91              : 
      92              : 
      93              : /* A named temporary file for use in selftests.
      94              :    Usable for writing out files, and as the base class for
      95              :    temp_source_file.
      96              :    The file is unlinked in the destructor.
      97              :    If the file_cache is non-null, the filename is evicted from
      98              :    the file_cache when the named_temp_file is destroyed.  */
      99              : 
     100              : class named_temp_file
     101              : {
     102              :  public:
     103              :   named_temp_file (const char *suffix, diagnostics::file_cache *fc = nullptr);
     104              :   ~named_temp_file ();
     105        33128 :   const char *get_filename () const { return m_filename; }
     106              : 
     107              :  private:
     108              :   char *m_filename;
     109              :   diagnostics::file_cache *m_file_cache;
     110              : };
     111              : 
     112              : /* A class for writing out a temporary sourcefile for use in selftests
     113              :    of input handling.  */
     114              : 
     115         5516 : class temp_source_file : public named_temp_file
     116              : {
     117              :  public:
     118              :   temp_source_file (const location &loc, const char *suffix,
     119              :                     const char *content, diagnostics::file_cache *fc = nullptr);
     120              :   temp_source_file (const location &loc, const char *suffix,
     121              :                     const char *content, size_t sz);
     122              : };
     123              : 
     124              : /* RAII-style class for avoiding introducing locale-specific differences
     125              :    in strings containing localized quote marks, by temporarily overriding
     126              :    the "open_quote" and "close_quote" globals to something hardcoded.
     127              : 
     128              :    Specifically, the C locale's values are used:
     129              :    - open_quote becomes "`"
     130              :    - close_quote becomes "'"
     131              :    for the lifetime of the object.  */
     132              : 
     133              : class auto_fix_quotes
     134              : {
     135              :  public:
     136              :   auto_fix_quotes ();
     137              :   ~auto_fix_quotes ();
     138              : 
     139              :  private:
     140              :   const char *m_saved_open_quote;
     141              :   const char *m_saved_close_quote;
     142              : };
     143              : 
     144              : /* Various selftests involving location-handling require constructing a
     145              :    line table and one or more line maps within it.
     146              : 
     147              :    For maximum test coverage we want to run these tests with a variety
     148              :    of situations:
     149              :    - line_table->default_range_bits: some frontends use a non-zero value
     150              :    and others use zero
     151              :    - the fallback modes within line-map.cc: there are various threshold
     152              :    values for location_t beyond line-map.cc changes
     153              :    behavior (disabling of the range-packing optimization, disabling
     154              :    of column-tracking).  We can exercise these by starting the line_table
     155              :    at interesting values at or near these thresholds.
     156              : 
     157              :    The following struct describes a particular case within our test
     158              :    matrix.  */
     159              : 
     160              : class line_table_case;
     161              : 
     162              : /* A class for overriding the global "line_table" within a selftest,
     163              :    restoring its value afterwards.  At most one instance of this
     164              :    class can exist at once, due to the need to keep the old value
     165              :    of line_table as a GC root.  */
     166              : 
     167              : class line_table_test
     168              : {
     169              :  public:
     170              :   /* Default constructor.  Override "line_table", using sane defaults
     171              :      for the temporary line_table.  */
     172              :   line_table_test ();
     173              : 
     174              :   /* Constructor.  Override "line_table", using the case described by C.  */
     175              :   line_table_test (const line_table_case &c);
     176              : 
     177              :   /* Destructor.  Restore the saved line_table.  */
     178              :   ~line_table_test ();
     179              : };
     180              : 
     181              : /* Run TESTCASE multiple times, once for each case in our test matrix.  */
     182              : 
     183              : extern void
     184              : for_each_line_table_case (void (*testcase) (const line_table_case &));
     185              : 
     186              : /* Read the contents of PATH into memory, returning a 0-terminated buffer
     187              :    that must be freed by the caller.
     188              :    Fail (and abort) if there are any problems, with LOC as the reported
     189              :    location of the failure.  */
     190              : 
     191              : extern char *read_file (const location &loc, const char *path);
     192              : 
     193              : /* Convert a path relative to SRCDIR/gcc/testsuite/selftests
     194              :    to a real path (either absolute, or relative to pwd).
     195              :    The result should be freed by the caller.  */
     196              : 
     197              : extern char *locate_file (const char *path);
     198              : 
     199              : /* The path of SRCDIR/testsuite/selftests.  */
     200              : 
     201              : extern const char *path_to_selftest_files;
     202              : 
     203              : /* selftest::test_runner is an implementation detail of selftest::run_tests,
     204              :    exposed here to allow plugins to run their own suites of tests.  */
     205              : 
     206              : class test_runner
     207              : {
     208              :  public:
     209              :   test_runner (const char *name);
     210              :   ~test_runner ();
     211              : 
     212              :  private:
     213              :   const char *m_name;
     214              :   long m_start_time;
     215              : };
     216              : 
     217              : /* Declarations for specific families of tests (by source file), in
     218              :    alphabetical order.  */
     219              : extern void attribs_cc_tests ();
     220              : extern void bitmap_cc_tests ();
     221              : extern void cgraph_cc_tests ();
     222              : extern void convert_cc_tests ();
     223              : extern void dbgcnt_cc_tests ();
     224              : extern void digraph_cc_tests ();
     225              : extern void dumpfile_cc_tests ();
     226              : extern void et_forest_cc_tests ();
     227              : extern void fibonacci_heap_cc_tests ();
     228              : extern void fold_const_cc_tests ();
     229              : extern void function_tests_cc_tests ();
     230              : extern void gcc_attribute_urlifier_cc_tests ();
     231              : extern void gcc_urlifier_cc_tests ();
     232              : extern void ggc_tests_cc_tests ();
     233              : extern void gimple_cc_tests ();
     234              : extern void gimple_range_tests ();
     235              : extern void graphviz_cc_tests ();
     236              : extern void hash_map_tests_cc_tests ();
     237              : extern void hash_set_tests_cc_tests ();
     238              : extern void input_cc_tests ();
     239              : extern void ipa_modref_tree_cc_tests ();
     240              : extern void json_cc_tests ();
     241              : extern void json_parser_cc_tests ();
     242              : extern void opt_suggestions_cc_tests ();
     243              : extern void optinfo_emit_json_cc_tests ();
     244              : extern void opts_cc_tests ();
     245              : extern void ordered_hash_map_tests_cc_tests ();
     246              : extern void path_coverage_cc_tests ();
     247              : extern void predict_cc_tests ();
     248              : extern void pretty_print_cc_tests ();
     249              : extern void pub_sub_cc_tests ();
     250              : extern void range_op_tests ();
     251              : extern void range_tests ();
     252              : extern void read_rtl_function_cc_tests ();
     253              : extern void relation_tests ();
     254              : extern void rtl_tests_cc_tests ();
     255              : extern void sbitmap_cc_tests ();
     256              : extern void selftest_cc_tests ();
     257              : extern void simple_diagnostic_path_cc_tests ();
     258              : extern void simplify_rtx_cc_tests ();
     259              : extern void spellcheck_cc_tests ();
     260              : extern void spellcheck_tree_cc_tests ();
     261              : extern void splay_tree_cc_tests ();
     262              : extern void sreal_cc_tests ();
     263              : extern void store_merging_cc_tests ();
     264              : extern void tree_cc_tests ();
     265              : extern void tree_cfg_cc_tests ();
     266              : extern void tristate_cc_tests ();
     267              : extern void typed_splay_tree_cc_tests ();
     268              : extern void vec_cc_tests ();
     269              : extern void vec_perm_indices_cc_tests ();
     270              : extern void wide_int_cc_tests ();
     271              : extern void xml_cc_tests ();
     272              : 
     273              : extern int num_passes;
     274              : 
     275              : } /* end of namespace selftest.  */
     276              : 
     277              : /* Macros for writing tests.  */
     278              : 
     279              : /* Evaluate EXPR and coerce to bool, calling
     280              :    ::selftest::pass if it is true,
     281              :    ::selftest::fail if it false.  */
     282              : 
     283              : #define ASSERT_TRUE(EXPR)                               \
     284              :   ASSERT_TRUE_AT (SELFTEST_LOCATION, (EXPR))
     285              : 
     286              : /* Like ASSERT_TRUE, but treat LOC as the effective location of the
     287              :    selftest.  */
     288              : 
     289              : #define ASSERT_TRUE_AT(LOC, EXPR)                       \
     290              :   SELFTEST_BEGIN_STMT                                   \
     291              :   const char *desc_ = "ASSERT_TRUE (" #EXPR ")";    \
     292              :   bool actual_ = (EXPR);                                \
     293              :   if (actual_)                                          \
     294              :     ::selftest::pass ((LOC), desc_);                    \
     295              :   else                                                  \
     296              :     ::selftest::fail ((LOC), desc_);                    \
     297              :   SELFTEST_END_STMT
     298              : 
     299              : /* Evaluate EXPR and coerce to bool, calling
     300              :    ::selftest::pass if it is false,
     301              :    ::selftest::fail if it true.  */
     302              : 
     303              : #define ASSERT_FALSE(EXPR)                                      \
     304              :   ASSERT_FALSE_AT (SELFTEST_LOCATION, (EXPR))
     305              : 
     306              : /* Like ASSERT_FALSE, but treat LOC as the effective location of the
     307              :    selftest.  */
     308              : 
     309              : #define ASSERT_FALSE_AT(LOC, EXPR)                              \
     310              :   SELFTEST_BEGIN_STMT                                           \
     311              :   const char *desc_ = "ASSERT_FALSE (" #EXPR ")";           \
     312              :   bool actual_ = (EXPR);                                        \
     313              :   if (actual_)                                                  \
     314              :     ::selftest::fail ((LOC), desc_);                            \
     315              :   else                                                          \
     316              :     ::selftest::pass ((LOC), desc_);                            \
     317              :   SELFTEST_END_STMT
     318              : 
     319              : /* Evaluate VAL1 and VAL2 and compare them with ==, calling
     320              :    ::selftest::pass if they are equal,
     321              :    ::selftest::fail if they are non-equal.  */
     322              : 
     323              : #define ASSERT_EQ(VAL1, VAL2) \
     324              :   ASSERT_EQ_AT ((SELFTEST_LOCATION), (VAL1), (VAL2))
     325              : 
     326              : /* Like ASSERT_EQ, but treat LOC as the effective location of the
     327              :    selftest.  */
     328              : 
     329              : #define ASSERT_EQ_AT(LOC, VAL1, VAL2)                  \
     330              :   SELFTEST_BEGIN_STMT                                          \
     331              :   const char *desc_ = "ASSERT_EQ (" #VAL1 ", " #VAL2 ")"; \
     332              :   if ((VAL1) == (VAL2))                                \
     333              :     ::selftest::pass ((LOC), desc_);                           \
     334              :   else                                                         \
     335              :     ::selftest::fail ((LOC), desc_);                           \
     336              :   SELFTEST_END_STMT
     337              : 
     338              : /* Evaluate VAL1 and VAL2 and compare them, calling
     339              :    ::selftest::pass if they are within ABS_ERROR of each other,
     340              :    ::selftest::fail if they are not.  */
     341              : 
     342              : #define ASSERT_NEAR(VAL1, VAL2, ABS_ERROR)      \
     343              :   ASSERT_NEAR_AT ((SELFTEST_LOCATION), (VAL1), (VAL2), (ABS_ERROR))
     344              : 
     345              : /* Like ASSERT_NEAR, but treat LOC as the effective location of the
     346              :    selftest.  */
     347              : 
     348              : #define ASSERT_NEAR_AT(LOC, VAL1, VAL2, ABS_ERROR)             \
     349              :   SELFTEST_BEGIN_STMT                                          \
     350              :   const char *desc_ = "ASSERT_NEAR (" #VAL1 ", " #VAL2 ", " #ABS_ERROR ")"; \
     351              :   double error = fabs ((VAL1) - (VAL2));                                \
     352              :   if (error < (ABS_ERROR))                                           \
     353              :     ::selftest::pass ((LOC), desc_);                                    \
     354              :   else                                                                  \
     355              :     ::selftest::fail ((LOC), desc_);                                    \
     356              :   SELFTEST_END_STMT
     357              : 
     358              : /* Evaluate VAL1 and VAL2 and compare them with known_eq, calling
     359              :    ::selftest::pass if they are always equal,
     360              :    ::selftest::fail if they might be non-equal.  */
     361              : 
     362              : #define ASSERT_KNOWN_EQ(VAL1, VAL2) \
     363              :   ASSERT_KNOWN_EQ_AT ((SELFTEST_LOCATION), (VAL1), (VAL2))
     364              : 
     365              : /* Like ASSERT_KNOWN_EQ, but treat LOC as the effective location of the
     366              :    selftest.  */
     367              : 
     368              : #define ASSERT_KNOWN_EQ_AT(LOC, VAL1, VAL2)                     \
     369              :   SELFTEST_BEGIN_STMT                                                   \
     370              :   const char *desc = "ASSERT_KNOWN_EQ (" #VAL1 ", " #VAL2 ")";    \
     371              :   if (known_eq (VAL1, VAL2))                                    \
     372              :     ::selftest::pass ((LOC), desc);                                     \
     373              :   else                                                                  \
     374              :     ::selftest::fail ((LOC), desc);                                     \
     375              :   SELFTEST_END_STMT
     376              : 
     377              : /* Evaluate VAL1 and VAL2 and compare them with !=, calling
     378              :    ::selftest::pass if they are non-equal,
     379              :    ::selftest::fail if they are equal.  */
     380              : 
     381              : #define ASSERT_NE(VAL1, VAL2)                          \
     382              :   SELFTEST_BEGIN_STMT                                          \
     383              :   const char *desc_ = "ASSERT_NE (" #VAL1 ", " #VAL2 ")"; \
     384              :   if ((VAL1) != (VAL2))                                \
     385              :     ::selftest::pass (SELFTEST_LOCATION, desc_);               \
     386              :   else                                                         \
     387              :     ::selftest::fail (SELFTEST_LOCATION, desc_);               \
     388              :   SELFTEST_END_STMT
     389              : 
     390              : /* Like ASSERT_NE, but treat LOC as the effective location of the
     391              :    selftest.  */
     392              : 
     393              : #define ASSERT_NE_AT(LOC, VAL1, VAL2)                  \
     394              :   SELFTEST_BEGIN_STMT                                          \
     395              :   const char *desc_ = "ASSERT_NE (" #VAL1 ", " #VAL2 ")"; \
     396              :   if ((VAL1) != (VAL2))                                \
     397              :     ::selftest::pass ((LOC), desc_);                           \
     398              :   else                                                         \
     399              :     ::selftest::fail ((LOC), desc_);                           \
     400              :   SELFTEST_END_STMT
     401              : 
     402              : /* Evaluate VAL1 and VAL2 and compare them with maybe_ne, calling
     403              :    ::selftest::pass if they might be non-equal,
     404              :    ::selftest::fail if they are known to be equal.  */
     405              : 
     406              : #define ASSERT_MAYBE_NE(VAL1, VAL2) \
     407              :   ASSERT_MAYBE_NE_AT ((SELFTEST_LOCATION), (VAL1), (VAL2))
     408              : 
     409              : /* Like ASSERT_MAYBE_NE, but treat LOC as the effective location of the
     410              :    selftest.  */
     411              : 
     412              : #define ASSERT_MAYBE_NE_AT(LOC, VAL1, VAL2)                     \
     413              :   SELFTEST_BEGIN_STMT                                                   \
     414              :   const char *desc = "ASSERT_MAYBE_NE (" #VAL1 ", " #VAL2 ")";    \
     415              :   if (maybe_ne (VAL1, VAL2))                                    \
     416              :     ::selftest::pass ((LOC), desc);                                     \
     417              :   else                                                                  \
     418              :     ::selftest::fail ((LOC), desc);                                     \
     419              :   SELFTEST_END_STMT
     420              : 
     421              : /* Evaluate LHS and RHS and compare them with >, calling
     422              :    ::selftest::pass if LHS > RHS,
     423              :    ::selftest::fail otherwise.  */
     424              : 
     425              : #define ASSERT_GT(LHS, RHS)                             \
     426              :   ASSERT_GT_AT ((SELFTEST_LOCATION), (LHS), (RHS))
     427              : 
     428              : /* Like ASSERT_GT, but treat LOC as the effective location of the
     429              :    selftest.  */
     430              : 
     431              : #define ASSERT_GT_AT(LOC, LHS, RHS)                    \
     432              :   SELFTEST_BEGIN_STMT                                          \
     433              :   const char *desc_ = "ASSERT_GT (" #LHS ", " #RHS ")";          \
     434              :   if ((LHS) > (RHS))                                        \
     435              :     ::selftest::pass ((LOC), desc_);                           \
     436              :   else                                                         \
     437              :     ::selftest::fail ((LOC), desc_);                           \
     438              :   SELFTEST_END_STMT
     439              : 
     440              : /* Evaluate LHS and RHS and compare them with <, calling
     441              :    ::selftest::pass if LHS < RHS,
     442              :    ::selftest::fail otherwise.  */
     443              : 
     444              : #define ASSERT_LT(LHS, RHS)                             \
     445              :   ASSERT_LT_AT ((SELFTEST_LOCATION), (LHS), (RHS))
     446              : 
     447              : /* Like ASSERT_LT, but treat LOC as the effective location of the
     448              :    selftest.  */
     449              : 
     450              : #define ASSERT_LT_AT(LOC, LHS, RHS)                    \
     451              :   SELFTEST_BEGIN_STMT                                          \
     452              :   const char *desc_ = "ASSERT_LT (" #LHS ", " #RHS ")";          \
     453              :   if ((LHS) < (RHS))                                        \
     454              :     ::selftest::pass ((LOC), desc_);                           \
     455              :   else                                                         \
     456              :     ::selftest::fail ((LOC), desc_);                           \
     457              :   SELFTEST_END_STMT
     458              : 
     459              : /* Evaluate VAL1 and VAL2 and compare them with strcmp, calling
     460              :    ::selftest::pass if they are equal (and both are non-NULL),
     461              :    ::selftest::fail if they are non-equal, or are both NULL.  */
     462              : 
     463              : #define ASSERT_STREQ(VAL1, VAL2)                                    \
     464              :   SELFTEST_BEGIN_STMT                                               \
     465              :   ::selftest::assert_streq (SELFTEST_LOCATION, #VAL1, #VAL2, \
     466              :                             (VAL1), (VAL2));                \
     467              :   SELFTEST_END_STMT
     468              : 
     469              : /* Like ASSERT_STREQ, but treat LOC as the effective location of the
     470              :    selftest.  */
     471              : 
     472              : #define ASSERT_STREQ_AT(LOC, VAL1, VAL2)                            \
     473              :   SELFTEST_BEGIN_STMT                                               \
     474              :   ::selftest::assert_streq ((LOC), #VAL1, #VAL2,                    \
     475              :                             (VAL1), (VAL2));                \
     476              :   SELFTEST_END_STMT
     477              : 
     478              : /* Evaluate HAYSTACK and NEEDLE and use strstr to determine if NEEDLE
     479              :    is within HAYSTACK.
     480              :    ::selftest::pass if NEEDLE is found.
     481              :    ::selftest::fail if it is not found.  */
     482              : 
     483              : #define ASSERT_STR_CONTAINS(HAYSTACK, NEEDLE)                           \
     484              :   SELFTEST_BEGIN_STMT                                                   \
     485              :   ::selftest::assert_str_contains (SELFTEST_LOCATION, #HAYSTACK, #NEEDLE, \
     486              :                                    (HAYSTACK), (NEEDLE));               \
     487              :   SELFTEST_END_STMT
     488              : 
     489              : /* Like ASSERT_STR_CONTAINS, but treat LOC as the effective location of the
     490              :    selftest.  */
     491              : 
     492              : #define ASSERT_STR_CONTAINS_AT(LOC, HAYSTACK, NEEDLE)                   \
     493              :   SELFTEST_BEGIN_STMT                                                   \
     494              :   ::selftest::assert_str_contains (LOC, #HAYSTACK, #NEEDLE,             \
     495              :                                    (HAYSTACK), (NEEDLE));               \
     496              :   SELFTEST_END_STMT
     497              : 
     498              : /* Evaluate STR and PREFIX and determine if STR starts with PREFIX.
     499              :      ::selftest::pass if STR does start with PREFIX.
     500              :      ::selftest::fail if does not, or either is NULL.  */
     501              : 
     502              : #define ASSERT_STR_STARTSWITH(STR, PREFIX)                                  \
     503              :   SELFTEST_BEGIN_STMT                                                       \
     504              :   ::selftest::assert_str_startswith (SELFTEST_LOCATION, #STR, #PREFIX,      \
     505              :                                      (STR), (PREFIX));                      \
     506              :   SELFTEST_END_STMT
     507              : 
     508              : /* Evaluate PRED1 (VAL1), calling ::selftest::pass if it is true,
     509              :    ::selftest::fail if it is false.  */
     510              : 
     511              : #define ASSERT_PRED1(PRED1, VAL1)                               \
     512              :   SELFTEST_BEGIN_STMT                                           \
     513              :   const char *desc_ = "ASSERT_PRED1 (" #PRED1 ", " #VAL1 ")";     \
     514              :   bool actual_ = (PRED1) (VAL1);                                \
     515              :   if (actual_)                                                  \
     516              :     ::selftest::pass (SELFTEST_LOCATION, desc_);                \
     517              :   else                                                          \
     518              :     ::selftest::fail (SELFTEST_LOCATION, desc_);                \
     519              :   SELFTEST_END_STMT
     520              : 
     521              : #define SELFTEST_BEGIN_STMT do {
     522              : #define SELFTEST_END_STMT   } while (0)
     523              : 
     524              : #endif /* #if CHECKING_P */
     525              : 
     526              : #endif /* GCC_SELFTEST_H */
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.