[cfe-dev] Further AST spelunking
Peter Stirling
peter at pjstirling.plus.com
Sat Oct 11 12:17:05 PDT 2014
How do I get access to Sema, from a FrontendAction/ASTConsumer?
On 09/10/14 21:40, Reid Kleckner wrote:
> On Thu, Oct 9, 2014 at 1:25 PM, Peter Stirling
> <peter at pjstirling.plus.com <mailto:peter at pjstirling.plus.com>> wrote:
>
>> I think you can compute this more directly with
>> inType->isIncompleteType().
>
> Thanks for the suggestion, I hadn't seen that either.
> Unfortunately it doesn't work, for the same cases as
> getDefinition(), these are (from my test data):
>
> std::fpos<__mbstate_t >
>
> ... snip ...
>
> std::initializer_list<TagLib::String >
>
>
> I think these are just uninstantiated templates. We don't instantiate
> templates when you declare a function that takes a template
> specialization by value, for example, this code compiles:
> template <typename T> struct MyVec;
> void f(MyVec<int> v);
>
> ... but if you add a call to f, it will fail because it cannot
> complete MyVec<int> by instantiation:
> void g(MyVec<int> &x) { f(x); }
>
> For your use case, you probably need to call RequireCompleteType at
> the appropriate point. You may need to wait until the end of the TU if
> there are some circular dependencies.
>
>> I've also discovered that parsing code that calls a builtin
>> function causes a no-argument, returns-int declaration to be
>> inserted. It's been a while, but as I remember, in C this
>> kind of declaration actually means that the function takes an
>> unspecified number of arguments, but each one passed should
>> be promoted to the size of an int (did they update this since
>> pointers became much larger than ints?). In C++ it means
>> something rather different. It seems a bit odd to me that
>> builtin functions don't have the correct declaration
>> inserted, since the compiler must have them on hand somewhere.
>>
>>
>> Yes, in C, this is a no-prototype, implicit int return function.
>> I'm not sure what kind of builtin function you're referring to.
>> If the name starts with __builtin_, then the compiler knows the
>> prototype. If it's a libc function like "fprintf()", then you
>> will probably get a warning and the implicit declaration you
>> describe. In C++, you shouldn't get these implicit declarations,
>> it's just an error.
>
> The functions that I've hit in my test data are:
> __atomic_fetch_add();
> __builtin_isfinite();
> __builtin_isinf();
> __builtin_isnan();
> __builtin_isnormal();
> __builtin_isgreater();
> __builtin_isgreaterequal();
> __builtin_isless();
> __builtin_islessequal();
> __builtin_islessgreater();
>
> For all of the above FunctionDecl::getBuiltinID() returns non-zero.
>
>
> These are actually supposed to be variadic, according to the builtins
> table:
> BUILTIN(__builtin_isunordered , "i.", "nc")
>
> They have custom type checking:
> /// SemaBuiltinUnorderedCompare - Handle functions like
> __builtin_isgreater and
> /// friends. This is declared to take (...), so we have to check
> everything.
> bool Sema::SemaBuiltinUnorderedCompare(CallExpr *TheCall) {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20141011/f1828b76/attachment.html>
More information about the cfe-dev
mailing list