[cfe-dev] Complex values handling in Clang

Stephen Canon scanon at apple.com
Fri Feb 1 07:32:00 PST 2013


_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.

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.



More information about the cfe-dev mailing list