diff mbox

[v2] Fix compilation of check-qint.c by using a long long integer constant

Message ID 1252084198-15375-1-git-send-email-Pierre.Riteau@irisa.fr
State Superseded
Headers show

Commit Message

Pierre Riteau Sept. 4, 2009, 5:09 p.m. UTC
Error was:
check-qint.c:46: error: integer constant is too large for 'long' type
---
 check-qint.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

Comments

Reimar Döffinger Sept. 4, 2009, 5:29 p.m. UTC | #1
On Fri, Sep 04, 2009 at 07:09:58PM +0200, Pierre Riteau wrote:
> Error was:
> check-qint.c:46: error: integer constant is too large for 'long' type
> ---
>  check-qint.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/check-qint.c b/check-qint.c
> index ae5d22f..f5c054e 100644
> --- a/check-qint.c
> +++ b/check-qint.c
> @@ -43,7 +43,7 @@ END_TEST
>  START_TEST(qint_from_int64_test)
>  {
>      QInt *qi;
> -    const int64_t value = 0xffffffffffffffff;
> +    const int64_t value = 0xffffffffffffffffLL;

Hm, well it does not really fit in a signed long long either (so from that
aspect it should be ULL).
Should it not be simply -1 (does qemu assume all architectures
use two's complement?)?
Luiz Capitulino Sept. 4, 2009, 5:38 p.m. UTC | #2
On Fri,  4 Sep 2009 19:09:58 +0200
Pierre Riteau <Pierre.Riteau@irisa.fr> wrote:

> Error was:
> check-qint.c:46: error: integer constant is too large for 'long' type

 You forgot the Signed-off-by line, otherwise:

 Acked-by: Luiz Capitulino <lcapitulino@redhat.com>

 I've built the series on i386, but forgot to enable the test-suite.
malc Sept. 4, 2009, 5:49 p.m. UTC | #3
On Fri, 4 Sep 2009, Reimar D?ffinger wrote:

> On Fri, Sep 04, 2009 at 07:09:58PM +0200, Pierre Riteau wrote:
> > Error was:
> > check-qint.c:46: error: integer constant is too large for 'long' type
> > ---
> >  check-qint.c |    2 +-
> >  1 files changed, 1 insertions(+), 1 deletions(-)
> > 
> > diff --git a/check-qint.c b/check-qint.c
> > index ae5d22f..f5c054e 100644
> > --- a/check-qint.c
> > +++ b/check-qint.c
> > @@ -43,7 +43,7 @@ END_TEST
> >  START_TEST(qint_from_int64_test)
> >  {
> >      QInt *qi;
> > -    const int64_t value = 0xffffffffffffffff;
> > +    const int64_t value = 0xffffffffffffffffLL;
> 
> Hm, well it does not really fit in a signed long long either (so from that
> aspect it should be ULL).
> Should it not be simply -1 (does qemu assume all architectures
> use two's complement?)?

Yes.
Pierre Riteau Sept. 4, 2009, 5:56 p.m. UTC | #4
On 4 sept. 09, at 19:29, Reimar Döffinger wrote:

> On Fri, Sep 04, 2009 at 07:09:58PM +0200, Pierre Riteau wrote:
>> Error was:
>> check-qint.c:46: error: integer constant is too large for 'long' type
>> ---
>> check-qint.c |    2 +-
>> 1 files changed, 1 insertions(+), 1 deletions(-)
>>
>> diff --git a/check-qint.c b/check-qint.c
>> index ae5d22f..f5c054e 100644
>> --- a/check-qint.c
>> +++ b/check-qint.c
>> @@ -43,7 +43,7 @@ END_TEST
>> START_TEST(qint_from_int64_test)
>> {
>>     QInt *qi;
>> -    const int64_t value = 0xffffffffffffffff;
>> +    const int64_t value = 0xffffffffffffffffLL;
>
> Hm, well it does not really fit in a signed long long either (so  
> from that
> aspect it should be ULL).
> Should it not be simply -1 (does qemu assume all architectures
> use two's complement?)?


How about INT64_MIN?
Luiz Capitulino Sept. 4, 2009, 6:25 p.m. UTC | #5
On Fri, 4 Sep 2009 19:56:30 +0200
Pierre Riteau <Pierre.Riteau@irisa.fr> wrote:

> 
> On 4 sept. 09, at 19:29, Reimar Döffinger wrote:
> 
> > On Fri, Sep 04, 2009 at 07:09:58PM +0200, Pierre Riteau wrote:
> >> Error was:
> >> check-qint.c:46: error: integer constant is too large for 'long' type
> >> ---
> >> check-qint.c |    2 +-
> >> 1 files changed, 1 insertions(+), 1 deletions(-)
> >>
> >> diff --git a/check-qint.c b/check-qint.c
> >> index ae5d22f..f5c054e 100644
> >> --- a/check-qint.c
> >> +++ b/check-qint.c
> >> @@ -43,7 +43,7 @@ END_TEST
> >> START_TEST(qint_from_int64_test)
> >> {
> >>     QInt *qi;
> >> -    const int64_t value = 0xffffffffffffffff;
> >> +    const int64_t value = 0xffffffffffffffffLL;
> >
> > Hm, well it does not really fit in a signed long long either (so  
> > from that
> > aspect it should be ULL).
> > Should it not be simply -1 (does qemu assume all architectures
> > use two's complement?)?
> 
> 
> How about INT64_MIN?

 The test is there to assure that QInt can handle
integers > 32-bits, so it's not an issue if we have
fewer bits.
Jamie Lokier Sept. 5, 2009, 1:58 a.m. UTC | #6
malc wrote:
> > > -    const int64_t value = 0xffffffffffffffff;
> > > +    const int64_t value = 0xffffffffffffffffLL;
> > 
> > Hm, well it does not really fit in a signed long long either (so from that
> > aspect it should be ULL).
> > Should it not be simply -1 (does qemu assume all architectures
> > use two's complement?)?
> 
> Yes.

Yes, but be aware that GCC nowadays does some optimisations which
assume calculations do not wraparound when using signed types.  See
-fwrapv and -fno-strict-overflow.  They tripped up the Linux kernel
recently, causing some range tests to be optimised away.  Those
optimisations warrant caution when thinking in two's complement while
using signed types.

For unsigned types, the ANSI C language uses arithmetic (mod 2^bits)
for unsigned types.  You can always write 0ULL-1, even theoretically
on non-two's complement machines: that's well-defined in C to have all
one bits set.

-- Jamie
Reimar Döffinger Sept. 5, 2009, 8:07 a.m. UTC | #7
On Fri, Sep 04, 2009 at 03:25:20PM -0300, Luiz Capitulino wrote:
> On Fri, 4 Sep 2009 19:56:30 +0200
> Pierre Riteau <Pierre.Riteau@irisa.fr> wrote:
> 
> > 
> > On 4 sept. 09, at 19:29, Reimar Döffinger wrote:
> > 
> > > On Fri, Sep 04, 2009 at 07:09:58PM +0200, Pierre Riteau wrote:
> > >> Error was:
> > >> check-qint.c:46: error: integer constant is too large for 'long' type
> > >> ---
> > >> check-qint.c |    2 +-
> > >> 1 files changed, 1 insertions(+), 1 deletions(-)
> > >>
> > >> diff --git a/check-qint.c b/check-qint.c
> > >> index ae5d22f..f5c054e 100644
> > >> --- a/check-qint.c
> > >> +++ b/check-qint.c
> > >> @@ -43,7 +43,7 @@ END_TEST
> > >> START_TEST(qint_from_int64_test)
> > >> {
> > >>     QInt *qi;
> > >> -    const int64_t value = 0xffffffffffffffff;
> > >> +    const int64_t value = 0xffffffffffffffffLL;
> > >
> > > Hm, well it does not really fit in a signed long long either (so  
> > > from that
> > > aspect it should be ULL).
> > > Should it not be simply -1 (does qemu assume all architectures
> > > use two's complement?)?
> > 
> > 
> > How about INT64_MIN?
> 
>  The test is there to assure that QInt can handle
> integers > 32-bits, so it's not an issue if we have
> fewer bits.

For that this value is nonsense, this test could succeed even with a 32
bit QInt and sign expansion.
Not to mention that also a conversion to float and back would keep the
value unchanged, although it would lose information in the general case.
If it's supposed to test that it will really store 64 bit it should be
some random number with variation in both upper and lower bits.
Pierre Riteau Sept. 8, 2009, 9:54 a.m. UTC | #8
On 5 sept. 2009, at 10:07, Reimar Döffinger wrote:

> On Fri, Sep 04, 2009 at 03:25:20PM -0300, Luiz Capitulino wrote:
>> On Fri, 4 Sep 2009 19:56:30 +0200
>> Pierre Riteau <Pierre.Riteau@irisa.fr> wrote:
>>
>>>
>>> On 4 sept. 09, at 19:29, Reimar Döffinger wrote:
>>>
>>>> On Fri, Sep 04, 2009 at 07:09:58PM +0200, Pierre Riteau wrote:
>>>>> Error was:
>>>>> check-qint.c:46: error: integer constant is too large for 'long'  
>>>>> type
>>>>> ---
>>>>> check-qint.c |    2 +-
>>>>> 1 files changed, 1 insertions(+), 1 deletions(-)
>>>>>
>>>>> diff --git a/check-qint.c b/check-qint.c
>>>>> index ae5d22f..f5c054e 100644
>>>>> --- a/check-qint.c
>>>>> +++ b/check-qint.c
>>>>> @@ -43,7 +43,7 @@ END_TEST
>>>>> START_TEST(qint_from_int64_test)
>>>>> {
>>>>>    QInt *qi;
>>>>> -    const int64_t value = 0xffffffffffffffff;
>>>>> +    const int64_t value = 0xffffffffffffffffLL;
>>>>
>>>> Hm, well it does not really fit in a signed long long either (so
>>>> from that
>>>> aspect it should be ULL).
>>>> Should it not be simply -1 (does qemu assume all architectures
>>>> use two's complement?)?
>>>
>>>
>>> How about INT64_MIN?
>>
>> The test is there to assure that QInt can handle
>> integers > 32-bits, so it's not an issue if we have
>> fewer bits.
>
> For that this value is nonsense, this test could succeed even with a  
> 32
> bit QInt and sign expansion.
> Not to mention that also a conversion to float and back would keep the
> value unchanged, although it would lose information in the general  
> case.
> If it's supposed to test that it will really store 64 bit it should be
> some random number with variation in both upper and lower bits.
>
>


Very good point.
I sent a new patch to the list.
diff mbox

Patch

diff --git a/check-qint.c b/check-qint.c
index ae5d22f..f5c054e 100644
--- a/check-qint.c
+++ b/check-qint.c
@@ -43,7 +43,7 @@  END_TEST
 START_TEST(qint_from_int64_test)
 {
     QInt *qi;
-    const int64_t value = 0xffffffffffffffff;
+    const int64_t value = 0xffffffffffffffffLL;
 
     qi = qint_from_int(value);
     fail_unless(qi->value == value);