[cfe-commits] tgmath.h

Howard Hinnant hhinnant at apple.com
Tue Feb 17 14:29:51 PST 2009


On Feb 17, 2009, at 5:18 PM, Chris Lattner wrote:

> cc-ing cfe-commits
>
> On Feb 17, 2009, at 1:16 PM, Howard Hinnant wrote:
>
>> On Feb 17, 2009, at 1:44 PM, Chris Lattner wrote:
>>
>>> When you get the header done, just send it to me and I'll commit it.
>>
>> I've enclosed the header.  I've barely tested it, only with the  
>> preprocessor.  I looked for other header tests and couldn't find  
>> any.  And I couldn't figure out how to create an executable.  It  
>> "compiles" without warnings and the preprocess looks like what I  
>> think it should.
>
> Daniel can help you with this.
>
>> The current design "leaks" 3 macros:
>>
>> __tg_promote1
>> __tg_promote2
>> __tg_promote3
>>
>> If that's a problem I could expand those macros manually in each  
>> function.  I don't consider the leak a problem since these names  
>> are within our namespace.
>
> Yep, I think that is fine.
>
>> Although I don't know of any bugs, if they're in there, they are  
>> probably simple type-o's that will be obvious in how to fix (lots  
>> and lots of repetition).
>
> Ok!
>
> I tried my silly overload case.  Unfortunately, we get a pretty ugly  
> output now:
>
> t.c:3:30: error: no matching function for call to '__tg_promote'
> double test(int *X) { return acos(X); }
>                             ^~~~~~~
> /Users/sabre/llvm/Debug/Headers/tgmath.h:87:29: note: instantiated  
> from:
> #define acos(__x) __tg_acos(__tg_promote1((__x))(__x))
>                            ^
> /Users/sabre/llvm/Debug/Headers/tgmath.h:53:50: note: instantiated  
> from:
> #define __tg_promote1(__x)           (__typeof__(__tg_promote(__x)))
>                                                 ^
> In file included from t.c:1:
> /Users/sabre/llvm/Debug/Headers/tgmath.h:51:40: note: candidate  
> function
> static long double _Complex _TG_ATTRSp __tg_promote(long double  
> _Complex);
>                                       ^
> /Users/sabre/llvm/Debug/Headers/tgmath.h:50:40: note: candidate  
> function
> static double _Complex      _TG_ATTRSp __tg_promote(double _Complex);
>                                       ^
> /Users/sabre/llvm/Debug/Headers/tgmath.h:49:40: note: candidate  
> function
> static float _Complex       _TG_ATTRSp __tg_promote(float _Complex);
>                                       ^
> ... a bunch more __tg_promotes.
>
> t.c:3:30: error: type name requires a specifier or qualifier
> double test(int *X) { return acos(X); }
>                             ^
> /Users/sabre/llvm/Debug/Headers/tgmath.h:87:29: note: instantiated  
> from:
> #define acos(__x) __tg_acos(__tg_promote1((__x))(__x))
>                            ^
> /Users/sabre/llvm/Debug/Headers/tgmath.h:53:68: note: instantiated  
> from:
> #define __tg_promote1(__x)           (__typeof__(__tg_promote(__x)))
>                                                                   ^
> t.c:3:30: error: call to '__tg_acos' is ambiguous
> double test(int *X) { return acos(X); }
>                             ^~~~~~~
> /Users/sabre/llvm/Debug/Headers/tgmath.h:87:19: note: instantiated  
> from:
> #define acos(__x) __tg_acos(__tg_promote1((__x))(__x))
>                  ^
> In file included from t.c:1:
> /Users/sabre/llvm/Debug/Headers/tgmath.h:84:5: note: candidate  
> function
>    __tg_acos(long double _Complex __x) {return cacosl(__x);}
>    ^
> /Users/sabre/llvm/Debug/Headers/tgmath.h:80:5: note: candidate  
> function
>    __tg_acos(double _Complex __x) {return cacos(__x);}
>    ^
> /Users/sabre/llvm/Debug/Headers/tgmath.h:76:5: note: candidate  
> function
>    __tg_acos(float _Complex __x) {return cacosf(__x);}
>    ^
> /Users/sabre/llvm/Debug/Headers/tgmath.h:72:5: note: candidate  
> function
>    __tg_acos(long double __x) {return acosl(__x);}
>    ^
> /Users/sabre/llvm/Debug/Headers/tgmath.h:68:5: note: candidate  
> function
>    __tg_acos(double __x) {return acos(__x);}
>    ^
> /Users/sabre/llvm/Debug/Headers/tgmath.h:64:5: note: candidate  
> function
>    __tg_acos(float __x) {return acosf(__x);}
>    ^
> 21 diagnostics generated.
>
>
> Would it be possible to silence to tg_promote diagnostics by adding  
> a version that takes ...?

I know how to solve this neatly in C++. ;-)

Oh, well, I note that if I add:

static void                 _TG_ATTRSp __tg_promote(void);

the error message gets *a little* better.

test.c:7:8: error: no matching function for call to '__tg_promote'
    x = acos(x);
        ^~~~~~~
./tgmath.h:88:29: note: instantiated from:
#define acos(__x) __tg_acos(__tg_promote1((__x))(__x))


"..." doesn't work as I get:

./tgmath.h:40:53: error: ISO C requires a named argument before '...'
static void                 _TG_ATTRSp __tg_promote(...);


I'll keep looking for a better solution...

-Howard




More information about the cfe-commits mailing list