| /* Basic test for the TEST_COMPARE macro. |
| Copyright (C) 2017-2018 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| |
| The GNU C Library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public |
| License as published by the Free Software Foundation; either |
| version 2.1 of the License, or (at your option) any later version. |
| |
| The GNU C Library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with the GNU C Library; if not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| #include <string.h> |
| #include <support/check.h> |
| #include <support/capture_subprocess.h> |
| |
| static void |
| subprocess (void *closure) |
| { |
| char ch = 1; |
| /* These tests should fail. */ |
| TEST_COMPARE (ch, -1); /* Line 28. */ |
| TEST_COMPARE (2LL, -2LL); /* Line 29. */ |
| TEST_COMPARE (3LL, (short) -3); /* Line 30. */ |
| } |
| |
| struct bitfield |
| { |
| int i2 : 2; |
| int i3 : 3; |
| unsigned int u2 : 2; |
| unsigned int u3 : 3; |
| int i31 : 31; |
| unsigned int u31 : 31 ; |
| long long int i63 : 63; |
| unsigned long long int u63 : 63; |
| }; |
| |
| /* Functions which return signed sizes are common, so test that these |
| results can readily checked using TEST_COMPARE. */ |
| |
| static int |
| return_ssize_t (void) |
| { |
| return 4; |
| } |
| |
| static int |
| return_int (void) |
| { |
| return 4; |
| } |
| |
| |
| static int |
| do_test (void) |
| { |
| /* This should succeed. */ |
| TEST_COMPARE (1, 1); |
| TEST_COMPARE (2LL, 2U); |
| { |
| char i8 = 3; |
| unsigned short u16 = 3; |
| TEST_COMPARE (i8, u16); |
| } |
| TEST_COMPARE (return_ssize_t (), sizeof (char[4])); |
| TEST_COMPARE (return_int (), sizeof (char[4])); |
| |
| struct bitfield bitfield = { 0 }; |
| TEST_COMPARE (bitfield.i2, bitfield.i3); |
| TEST_COMPARE (bitfield.u2, bitfield.u3); |
| TEST_COMPARE (bitfield.u2, bitfield.i3); |
| TEST_COMPARE (bitfield.u3, bitfield.i3); |
| TEST_COMPARE (bitfield.i2, bitfield.u3); |
| TEST_COMPARE (bitfield.i3, bitfield.u2); |
| TEST_COMPARE (bitfield.i63, bitfield.i63); |
| TEST_COMPARE (bitfield.u63, bitfield.u63); |
| TEST_COMPARE (bitfield.i31, bitfield.i63); |
| TEST_COMPARE (bitfield.i63, bitfield.i31); |
| |
| struct support_capture_subprocess proc = support_capture_subprocess |
| (&subprocess, NULL); |
| |
| /* Discard the reported error. */ |
| support_record_failure_reset (); |
| |
| puts ("info: *** subprocess output starts ***"); |
| fputs (proc.out.buffer, stdout); |
| puts ("info: *** subprocess output ends ***"); |
| |
| TEST_VERIFY |
| (strcmp (proc.out.buffer, |
| "tst-test_compare.c:28: numeric comparison failure\n" |
| " left: 1 (0x1); from: ch\n" |
| " right: -1 (0xffffffff); from: -1\n" |
| "tst-test_compare.c:29: numeric comparison failure\n" |
| " left: 2 (0x2); from: 2LL\n" |
| " right: -2 (0xfffffffffffffffe); from: -2LL\n" |
| "tst-test_compare.c:30: numeric comparison failure" |
| " (widths 64 and 32)\n" |
| " left: 3 (0x3); from: 3LL\n" |
| " right: -3 (0xfffffffd); from: (short) -3\n") == 0); |
| |
| /* Check that there is no output on standard error. */ |
| support_capture_subprocess_check (&proc, "TEST_COMPARE", 0, sc_allow_stdout); |
| |
| return 0; |
| } |
| |
| #include <support/test-driver.c> |