[cfe-dev] FunctionProtoType is changed during include expansion
Gábor Márton via cfe-dev
cfe-dev at lists.llvm.org
Tue Dec 3 08:48:19 PST 2019
This is a catch 22, because to get a smaller reproducer I should be able to
work on the preprocessed file (only that's what works considerably well
with creduce).
However, the AST piece in question is about this source code:
auto Convert = [](long nsec) {
using int_type = decltype(std::declval< ::timeval>().tv_usec);
auto dur = duration_cast<microseconds>(nanoseconds(nsec)).count();
return static_cast<int_type>(dur);
};
On Mon, Dec 2, 2019 at 6:57 PM David Blaikie <dblaikie at gmail.com> wrote:
> perhaps a smaller reproducer would be useful for this discussion? (so we
> could see the specific code, rather than a description of it or the entire
> libc++ test, etc)
>
> On Mon, Dec 2, 2019 at 12:27 PM Gábor Márton via cfe-dev <
> cfe-dev at lists.llvm.org> wrote:
>
>> Hi,
>>
>> I am puzzling with the following phenomenon:
>> When I compile a source file normally (i.e. -c) then a given lambda's
>> signature is `operator() 'int_type (long) const'` where int_type is a
>> TypeAlias. I.e. the return type is a TypedefType.
>> Now, when I compile the same source file with -E, then the signature is
>> changed to the canonical type: `operator() 'long (long) const'`. I.e. the
>> return type is no longer a TypedefType.
>> This happens also when I use `-E -frewrite-includes`.
>>
>> Do you guys have any insights on this? What happens during include
>> expansion so that the parser changes some internal state?
>>
>> Thanks,
>> Gabor
>>
>> ...
>>
>> Why this is a problem to me? Because I can't write tests that are
>> self-contained, the problematic AST with the TypedefType return type comes
>> up only when we include some files.
>>
>> For your interest, if you want to reproduce it, you can do that on
>> llvm-project/master:
>> 1) Enable libcxx, libcxxabi
>> 2) ninja cxx
>> 3) ninja -v
>> projects/libcxx/src/CMakeFiles/cxx_static.dir/filesystem/directory_iterator.cpp.o
>> - grab the output and attach -E (and -frewrite-includes)
>> 4) ./bin/clang-check -p . libcxx/src/filesystem/directory_iterator.cpp
>> -ast-dump -ast-dump-filter "posix_utimes" | ag "CXXMethodDecl.*int_type"
>> - gives -CXXMethodDecl 0x3007ec0 <col:30, line:400:3> line:396:18 used
>> operator() 'int_type (long) const' inline
>> 5) ./bin/clang -x c++ directory_iterator.cpp.E -fsyntax-only -Xclang
>> -ast-dump -Xclang -ast-dump-filter -Xclang posix_utimes | ag
>> "CXXMethodDecl.*operator"
>> 6) -CXXMethodDecl 0x31c6ad0 <col:30, line:400:3> line:396:18 used
>> operator() 'long (long) const' inline
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20191203/60096371/attachment.html>
More information about the cfe-dev
mailing list