[cfe-dev] Complex values handling in Clang
Hal Finkel
hfinkel at anl.gov
Fri Feb 1 07:56:18 PST 2013
----- Original Message -----
> From: "Stephen Canon" <scanon at apple.com>
> To: "rajesh viswabramana" <viswabramana.rajesh at gmail.com>
> Cc: cfe-dev at cs.uiuc.edu
> Sent: Friday, February 1, 2013 9:32:00 AM
> Subject: Re: [cfe-dev] Complex values handling in Clang
>
> _Complex integer types are a GCC extension (the standard specifies
> only float _Complex, double _Complex and long double _Complex.
> Apparently clang's support for this GCC extension doesn't perfectly
> match GCC. I suspect that clang and GCC differ in arithmetic
> promotion rank here; clang "promotes" the unsigned long long
> literals to int _Complex (which truncates them), whereas GCC
> promotes both to unsigned long long _Complex. I haven't actually
> dug into the issue at all, however.
Did Bill just fix this in r174181?
-Hal
>
> A couple of work-arounds seem to be available:
>
> unsigned long long int _Complex lli_val = (unsigned long long int
> _Complex){5668231682443686620ULL, 7618395480654047911ULL};
>
> unsigned long long int _Complex lli_val;
> __real__ lli_val = 5668231682443686620ULL;
> __imag__ lli_val = 7618395480654047911ULL;
>
> I believe that both of these will work with recent GCCs as well.
>
> - Steve
>
> On Feb 1, 2013, at 12:06 AM, rajesh viswabramana
> <viswabramana.rajesh at gmail.com> wrote:
>
> > Hi all,
> >
> > Could someone comment about it.
> >
> > Thanks,
> > Rajesh
> >
> > On Mon, Jan 28, 2013 at 7:16 PM, rajesh viswabramana
> > <viswabramana.rajesh at gmail.com> wrote:
> > Hi All,
> >
> > Complex values stored in variable value mismatches if program
> > compiled clang and gcc.
> >
> > Below is the sample program printing byte by byte stored "complex
> > long long int" value,
> > int main()
> > {
> > _Complex unsigned long long int lli_val= (5668231682443686620ULL +
> > 7618395480654047911ULL*__extension__ 1i);
> > // _Complex long double ld_val = (5668231682443686620ULL +
> > 7618395480654047911ULL*__extension__ 1i);
> > int size = sizeof(lli_val);
> > int index = 0;
> > printf("long long int val:\n");
> > while (size != index)
> > {
> > unsigned char cval = (unsigned char)*(((unsigned
> > char*)&lli_val) + index);
> > printf("%x", cval);
> > index++;
> > }
> > }
> > Outputs of clang compiled, gcc compiled values are:
> > For Clang,
> > long long int val:
> > dcb2ab00000a76ad35e0000
> > For GCC,
> > long long int val:
> > dcb2ab0af9aa94ea76ad35e53fab969
> > Similar behaviour observed for "_Complex float, _Complex double,
> > _Complex long double" types.
> >
> > Complex values in clang are not handled in similar to GCC, Could
> > someone comment about it.
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
More information about the cfe-dev
mailing list