[cfe-dev] Further AST spelunking
Peter Stirling
peter at pjstirling.plus.com
Sat Oct 11 13:27:30 PDT 2014
Never-mind, CompilerInstance::getSema()
On 11/10/14 20:17, Peter Stirling wrote:
> 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) {
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20141011/1ee44364/attachment.html>
More information about the cfe-dev
mailing list