xref: /dflybsd-src/contrib/gcc-8.0/gcc/selftest.h (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
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