summaryrefslogtreecommitdiff
path: root/support/regression/tests/bug-2805.c
blob: 3a2c62b15e33569ff991dfa67cfd5f99400ff003 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/* bug-2822.c
   A division optimization evaluated operands to double precision only, thus losing information on long long variables.
 */

#include <testfwk.h>

#include <limits.h>

unsigned long long f(void)
{
    unsigned long long left = (ULLONG_MAX - 2);
    return(left / (ULLONG_MAX - 3));
}

unsigned long long g(void)
{
    unsigned long long left = (ULLONG_MAX - 2);
    return(left % (ULLONG_MAX - 3));
}

unsigned long long fs(void)
{
    unsigned long long left = (LLONG_MAX - 2);
    return(left / (LLONG_MAX - 3));
}

unsigned long long gs(void)
{
    unsigned long long left = (LLONG_MAX - 2);
    return(left % (LLONG_MAX - 3));
}

void testBug(void)
{
    ASSERT (f() == (ULLONG_MAX - 2) / (ULLONG_MAX - 3));
    ASSERT (g() == (ULLONG_MAX - 2) % (ULLONG_MAX - 3));
    ASSERT (fs() == (LLONG_MAX - 2) / (LLONG_MAX - 3));
    ASSERT (gs() == (LLONG_MAX - 2) % (LLONG_MAX - 3));
}