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-05-11 19:44:49 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     30557287 :   location (const char *file, int line, const char *function)
      39     30544339 :     : 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 json_pointer_parsing_cc_tests ();
     243              : extern void opt_suggestions_cc_tests ();
     244              : extern void optinfo_emit_json_cc_tests ();
     245              : extern void opts_cc_tests ();
     246              : extern void ordered_hash_map_tests_cc_tests ();
     247              : extern void path_coverage_cc_tests ();
     248              : extern void predict_cc_tests ();
     249              : extern void pretty_print_cc_tests ();
     250              : extern void pretty_print_token_buffer_cc_tests ();
     251              : extern void pub_sub_cc_tests ();
     252              : extern void range_op_tests ();
     253              : extern void range_tests ();
     254              : extern void read_rtl_function_cc_tests ();
     255              : extern void relation_tests ();
     256              : extern void rtl_tests_cc_tests ();
     257              : extern void sbitmap_cc_tests ();
     258              : extern void selftest_cc_tests ();
     259              : extern void simple_diagnostic_path_cc_tests ();
     260              : extern void simplify_rtx_cc_tests ();
     261              : extern void spellcheck_cc_tests ();
     262              : extern void spellcheck_tree_cc_tests ();
     263              : extern void splay_tree_cc_tests ();
     264              : extern void sreal_cc_tests ();
     265              : extern void store_merging_cc_tests ();
     266              : extern void tree_cc_tests ();
     267              : extern void tree_cfg_cc_tests ();
     268              : extern void tristate_cc_tests ();
     269              : extern void typed_splay_tree_cc_tests ();
     270              : extern void vec_cc_tests ();
     271              : extern void vec_perm_indices_cc_tests ();
     272              : extern void wide_int_cc_tests ();
     273              : extern void xml_cc_tests ();
     274              : 
     275              : extern int num_passes;
     276              : 
     277              : } /* end of namespace selftest.  */
     278              : 
     279              : /* Macros for writing tests.  */
     280              : 
     281              : /* Evaluate EXPR and coerce to bool, calling
     282              :    ::selftest::pass if it is true,
     283              :    ::selftest::fail if it false.  */
     284              : 
     285              : #define ASSERT_TRUE(EXPR)                               \
     286              :   ASSERT_TRUE_AT (SELFTEST_LOCATION, (EXPR))
     287              : 
     288              : /* Like ASSERT_TRUE, but treat LOC as the effective location of the
     289              :    selftest.  */
     290              : 
     291              : #define ASSERT_TRUE_AT(LOC, EXPR)                       \
     292              :   SELFTEST_BEGIN_STMT                                   \
     293              :   const char *desc_ = "ASSERT_TRUE (" #EXPR ")";    \
     294              :   bool actual_ = (EXPR);                                \
     295              :   if (actual_)                                          \
     296              :     ::selftest::pass ((LOC), desc_);                    \
     297              :   else                                                  \
     298              :     ::selftest::fail ((LOC), desc_);                    \
     299              :   SELFTEST_END_STMT
     300              : 
     301              : /* Evaluate EXPR and coerce to bool, calling
     302              :    ::selftest::pass if it is false,
     303              :    ::selftest::fail if it true.  */
     304              : 
     305              : #define ASSERT_FALSE(EXPR)                                      \
     306              :   ASSERT_FALSE_AT (SELFTEST_LOCATION, (EXPR))
     307              : 
     308              : /* Like ASSERT_FALSE, but treat LOC as the effective location of the
     309              :    selftest.  */
     310              : 
     311              : #define ASSERT_FALSE_AT(LOC, EXPR)                              \
     312              :   SELFTEST_BEGIN_STMT                                           \
     313              :   const char *desc_ = "ASSERT_FALSE (" #EXPR ")";           \
     314              :   bool actual_ = (EXPR);                                        \
     315              :   if (actual_)                                                  \
     316              :     ::selftest::fail ((LOC), desc_);                            \
     317              :   else                                                          \
     318              :     ::selftest::pass ((LOC), desc_);                            \
     319              :   SELFTEST_END_STMT
     320              : 
     321              : /* Evaluate VAL1 and VAL2 and compare them with ==, calling
     322              :    ::selftest::pass if they are equal,
     323              :    ::selftest::fail if they are non-equal.  */
     324              : 
     325              : #define ASSERT_EQ(VAL1, VAL2) \
     326              :   ASSERT_EQ_AT ((SELFTEST_LOCATION), (VAL1), (VAL2))
     327              : 
     328              : /* Like ASSERT_EQ, but treat LOC as the effective location of the
     329              :    selftest.  */
     330              : 
     331              : #define ASSERT_EQ_AT(LOC, VAL1, VAL2)                  \
     332              :   SELFTEST_BEGIN_STMT                                          \
     333              :   const char *desc_ = "ASSERT_EQ (" #VAL1 ", " #VAL2 ")"; \
     334              :   if ((VAL1) == (VAL2))                                \
     335              :     ::selftest::pass ((LOC), desc_);                           \
     336              :   else                                                         \
     337              :     ::selftest::fail ((LOC), desc_);                           \
     338              :   SELFTEST_END_STMT
     339              : 
     340              : /* Evaluate VAL1 and VAL2 and compare them, calling
     341              :    ::selftest::pass if they are within ABS_ERROR of each other,
     342              :    ::selftest::fail if they are not.  */
     343              : 
     344              : #define ASSERT_NEAR(VAL1, VAL2, ABS_ERROR)      \
     345              :   ASSERT_NEAR_AT ((SELFTEST_LOCATION), (VAL1), (VAL2), (ABS_ERROR))
     346              : 
     347              : /* Like ASSERT_NEAR, but treat LOC as the effective location of the
     348              :    selftest.  */
     349              : 
     350              : #define ASSERT_NEAR_AT(LOC, VAL1, VAL2, ABS_ERROR)             \
     351              :   SELFTEST_BEGIN_STMT                                          \
     352              :   const char *desc_ = "ASSERT_NEAR (" #VAL1 ", " #VAL2 ", " #ABS_ERROR ")"; \
     353              :   double error = fabs ((VAL1) - (VAL2));                                \
     354              :   if (error < (ABS_ERROR))                                           \
     355              :     ::selftest::pass ((LOC), desc_);                                    \
     356              :   else                                                                  \
     357              :     ::selftest::fail ((LOC), desc_);                                    \
     358              :   SELFTEST_END_STMT
     359              : 
     360              : /* Evaluate VAL1 and VAL2 and compare them with known_eq, calling
     361              :    ::selftest::pass if they are always equal,
     362              :    ::selftest::fail if they might be non-equal.  */
     363              : 
     364              : #define ASSERT_KNOWN_EQ(VAL1, VAL2) \
     365              :   ASSERT_KNOWN_EQ_AT ((SELFTEST_LOCATION), (VAL1), (VAL2))
     366              : 
     367              : /* Like ASSERT_KNOWN_EQ, but treat LOC as the effective location of the
     368              :    selftest.  */
     369              : 
     370              : #define ASSERT_KNOWN_EQ_AT(LOC, VAL1, VAL2)                     \
     371              :   SELFTEST_BEGIN_STMT                                                   \
     372              :   const char *desc = "ASSERT_KNOWN_EQ (" #VAL1 ", " #VAL2 ")";    \
     373              :   if (known_eq (VAL1, VAL2))                                    \
     374              :     ::selftest::pass ((LOC), desc);                                     \
     375              :   else                                                                  \
     376              :     ::selftest::fail ((LOC), desc);                                     \
     377              :   SELFTEST_END_STMT
     378              : 
     379              : /* Evaluate VAL1 and VAL2 and compare them with !=, calling
     380              :    ::selftest::pass if they are non-equal,
     381              :    ::selftest::fail if they are equal.  */
     382              : 
     383              : #define ASSERT_NE(VAL1, VAL2)                          \
     384              :   SELFTEST_BEGIN_STMT                                          \
     385              :   const char *desc_ = "ASSERT_NE (" #VAL1 ", " #VAL2 ")"; \
     386              :   if ((VAL1) != (VAL2))                                \
     387              :     ::selftest::pass (SELFTEST_LOCATION, desc_);               \
     388              :   else                                                         \
     389              :     ::selftest::fail (SELFTEST_LOCATION, desc_);               \
     390              :   SELFTEST_END_STMT
     391              : 
     392              : /* Like ASSERT_NE, but treat LOC as the effective location of the
     393              :    selftest.  */
     394              : 
     395              : #define ASSERT_NE_AT(LOC, VAL1, VAL2)                  \
     396              :   SELFTEST_BEGIN_STMT                                          \
     397              :   const char *desc_ = "ASSERT_NE (" #VAL1 ", " #VAL2 ")"; \
     398              :   if ((VAL1) != (VAL2))                                \
     399              :     ::selftest::pass ((LOC), desc_);                           \
     400              :   else                                                         \
     401              :     ::selftest::fail ((LOC), desc_);                           \
     402              :   SELFTEST_END_STMT
     403              : 
     404              : /* Evaluate VAL1 and VAL2 and compare them with maybe_ne, calling
     405              :    ::selftest::pass if they might be non-equal,
     406              :    ::selftest::fail if they are known to be equal.  */
     407              : 
     408              : #define ASSERT_MAYBE_NE(VAL1, VAL2) \
     409              :   ASSERT_MAYBE_NE_AT ((SELFTEST_LOCATION), (VAL1), (VAL2))
     410              : 
     411              : /* Like ASSERT_MAYBE_NE, but treat LOC as the effective location of the
     412              :    selftest.  */
     413              : 
     414              : #define ASSERT_MAYBE_NE_AT(LOC, VAL1, VAL2)                     \
     415              :   SELFTEST_BEGIN_STMT                                                   \
     416              :   const char *desc = "ASSERT_MAYBE_NE (" #VAL1 ", " #VAL2 ")";    \
     417              :   if (maybe_ne (VAL1, VAL2))                                    \
     418              :     ::selftest::pass ((LOC), desc);                                     \
     419              :   else                                                                  \
     420              :     ::selftest::fail ((LOC), desc);                                     \
     421              :   SELFTEST_END_STMT
     422              : 
     423              : /* Evaluate LHS and RHS and compare them with >, calling
     424              :    ::selftest::pass if LHS > RHS,
     425              :    ::selftest::fail otherwise.  */
     426              : 
     427              : #define ASSERT_GT(LHS, RHS)                             \
     428              :   ASSERT_GT_AT ((SELFTEST_LOCATION), (LHS), (RHS))
     429              : 
     430              : /* Like ASSERT_GT, but treat LOC as the effective location of the
     431              :    selftest.  */
     432              : 
     433              : #define ASSERT_GT_AT(LOC, LHS, RHS)                    \
     434              :   SELFTEST_BEGIN_STMT                                          \
     435              :   const char *desc_ = "ASSERT_GT (" #LHS ", " #RHS ")";          \
     436              :   if ((LHS) > (RHS))                                        \
     437              :     ::selftest::pass ((LOC), desc_);                           \
     438              :   else                                                         \
     439              :     ::selftest::fail ((LOC), desc_);                           \
     440              :   SELFTEST_END_STMT
     441              : 
     442              : /* Evaluate LHS and RHS and compare them with <, calling
     443              :    ::selftest::pass if LHS < RHS,
     444              :    ::selftest::fail otherwise.  */
     445              : 
     446              : #define ASSERT_LT(LHS, RHS)                             \
     447              :   ASSERT_LT_AT ((SELFTEST_LOCATION), (LHS), (RHS))
     448              : 
     449              : /* Like ASSERT_LT, but treat LOC as the effective location of the
     450              :    selftest.  */
     451              : 
     452              : #define ASSERT_LT_AT(LOC, LHS, RHS)                    \
     453              :   SELFTEST_BEGIN_STMT                                          \
     454              :   const char *desc_ = "ASSERT_LT (" #LHS ", " #RHS ")";          \
     455              :   if ((LHS) < (RHS))                                        \
     456              :     ::selftest::pass ((LOC), desc_);                           \
     457              :   else                                                         \
     458              :     ::selftest::fail ((LOC), desc_);                           \
     459              :   SELFTEST_END_STMT
     460              : 
     461              : /* Evaluate VAL1 and VAL2 and compare them with strcmp, calling
     462              :    ::selftest::pass if they are equal (and both are non-NULL),
     463              :    ::selftest::fail if they are non-equal, or are both NULL.  */
     464              : 
     465              : #define ASSERT_STREQ(VAL1, VAL2)                                    \
     466              :   SELFTEST_BEGIN_STMT                                               \
     467              :   ::selftest::assert_streq (SELFTEST_LOCATION, #VAL1, #VAL2, \
     468              :                             (VAL1), (VAL2));                \
     469              :   SELFTEST_END_STMT
     470              : 
     471              : /* Like ASSERT_STREQ, but treat LOC as the effective location of the
     472              :    selftest.  */
     473              : 
     474              : #define ASSERT_STREQ_AT(LOC, VAL1, VAL2)                            \
     475              :   SELFTEST_BEGIN_STMT                                               \
     476              :   ::selftest::assert_streq ((LOC), #VAL1, #VAL2,                    \
     477              :                             (VAL1), (VAL2));                \
     478              :   SELFTEST_END_STMT
     479              : 
     480              : /* Evaluate HAYSTACK and NEEDLE and use strstr to determine if NEEDLE
     481              :    is within HAYSTACK.
     482              :    ::selftest::pass if NEEDLE is found.
     483              :    ::selftest::fail if it is not found.  */
     484              : 
     485              : #define ASSERT_STR_CONTAINS(HAYSTACK, NEEDLE)                           \
     486              :   SELFTEST_BEGIN_STMT                                                   \
     487              :   ::selftest::assert_str_contains (SELFTEST_LOCATION, #HAYSTACK, #NEEDLE, \
     488              :                                    (HAYSTACK), (NEEDLE));               \
     489              :   SELFTEST_END_STMT
     490              : 
     491              : /* Like ASSERT_STR_CONTAINS, but treat LOC as the effective location of the
     492              :    selftest.  */
     493              : 
     494              : #define ASSERT_STR_CONTAINS_AT(LOC, HAYSTACK, NEEDLE)                   \
     495              :   SELFTEST_BEGIN_STMT                                                   \
     496              :   ::selftest::assert_str_contains (LOC, #HAYSTACK, #NEEDLE,             \
     497              :                                    (HAYSTACK), (NEEDLE));               \
     498              :   SELFTEST_END_STMT
     499              : 
     500              : /* Evaluate STR and PREFIX and determine if STR starts with PREFIX.
     501              :      ::selftest::pass if STR does start with PREFIX.
     502              :      ::selftest::fail if does not, or either is NULL.  */
     503              : 
     504              : #define ASSERT_STR_STARTSWITH(STR, PREFIX)                                  \
     505              :   SELFTEST_BEGIN_STMT                                                       \
     506              :   ::selftest::assert_str_startswith (SELFTEST_LOCATION, #STR, #PREFIX,      \
     507              :                                      (STR), (PREFIX));                      \
     508              :   SELFTEST_END_STMT
     509              : 
     510              : /* Evaluate PRED1 (VAL1), calling ::selftest::pass if it is true,
     511              :    ::selftest::fail if it is false.  */
     512              : 
     513              : #define ASSERT_PRED1(PRED1, VAL1)                               \
     514              :   SELFTEST_BEGIN_STMT                                           \
     515              :   const char *desc_ = "ASSERT_PRED1 (" #PRED1 ", " #VAL1 ")";     \
     516              :   bool actual_ = (PRED1) (VAL1);                                \
     517              :   if (actual_)                                                  \
     518              :     ::selftest::pass (SELFTEST_LOCATION, desc_);                \
     519              :   else                                                          \
     520              :     ::selftest::fail (SELFTEST_LOCATION, desc_);                \
     521              :   SELFTEST_END_STMT
     522              : 
     523              : #define SELFTEST_BEGIN_STMT do {
     524              : #define SELFTEST_END_STMT   } while (0)
     525              : 
     526              : #endif /* #if CHECKING_P */
     527              : 
     528              : #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.