[cfe-dev] [clang-tidy] using isInTemplateInstantiation asserts

Alexander Kornienko via cfe-dev cfe-dev at lists.llvm.org
Thu Apr 14 19:42:04 PDT 2016


Sent out a fix: http://reviews.llvm.org/D19144

On Wed, Apr 13, 2016 at 1:47 PM, Alexander Kornienko <alexfh at google.com>
wrote:

> I was able to reproduce this. Looks like the bug depends on memory layout
> or something like this, since it appears and disappears from build to
> build. I'll try to run this with ASan and see whether it finds any issues.
>
>
> On Tue, Apr 12, 2016 at 9:04 PM, Piotr Padlewski <
> piotr.padlewski at gmail.com> wrote:
>
>> Ok I see what is the problem.
>> The code that I have sent doesn't trigger the problem. This one works:
>> http://pastebin.com/TkTv2wpC
>>
>> I have also rebuild clang-query in debug so I am 100% sure that te build
>> is ok.
>>
>> 2016-04-12 20:47 GMT+02:00 Piotr Padlewski <piotr.padlewski at gmail.com>:
>>
>>> Yes of course. I am rebuilding clang-query in empty build just to make
>>> sure it's not some weird cmake behaviour.
>>>
>>> 2016-04-12 20:44 GMT+02:00 Alexander Kornienko <alexfh at google.com>:
>>>
>>>> BTW, do you update all working copies (llvm, cfe and clang-tools-extra)?
>>>>
>>>> On Tue, Apr 12, 2016 at 8:43 PM, Alexander Kornienko <alexfh at google.com
>>>> > wrote:
>>>>
>>>>> Yes, LLVM_ENABLE_ASSERTIONS is ON in my configuration.
>>>>>
>>>>> On Tue, Apr 12, 2016 at 8:32 PM, Piotr Padlewski <
>>>>> piotr.padlewski at gmail.com> wrote:
>>>>>
>>>>>> yep, the same assert on most recent build. Are you sure your
>>>>>> assertions are enabled?
>>>>>>
>>>>>> 2016-04-12 20:26 GMT+02:00 Piotr Padlewski <piotr.padlewski at gmail.com
>>>>>> >:
>>>>>>
>>>>>>> I am building most recent debug build right now, but what I saw in
>>>>>>> the code, there was no chanes in ASTTypeTraits.* files since so I don't
>>>>>>> excpect it will make a difference.
>>>>>>>
>>>>>>> 2016-04-12 20:23 GMT+02:00 Alexander Kornienko <alexfh at google.com>:
>>>>>>>
>>>>>>>> I use an assertions-enabled build of clang-query built just a few
>>>>>>>> hours ago.
>>>>>>>>
>>>>>>>> On Tue, Apr 12, 2016 at 8:00 PM, Piotr Padlewski <
>>>>>>>> piotr.padlewski at gmail.com> wrote:
>>>>>>>>
>>>>>>>>> Are you using debug build?
>>>>>>>>> when I use the second matcher that you have send I got core dump.
>>>>>>>>>
>>>>>>>>> http://pastebin.com/Z6V3jC3X
>>>>>>>>>
>>>>>>>>> I am not using the most recent clang trunk, but someting about 2
>>>>>>>>> weeks old, but I don't think it is the case.
>>>>>>>>> BTW on other build it works perfectly, it doesn;t crash etc, but
>>>>>>>>> it has asserts disabled.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> 2016-04-12 19:50 GMT+02:00 Alexander Kornienko <alexfh at google.com>
>>>>>>>>> :
>>>>>>>>>
>>>>>>>>>> FWIW, a larger part of your matcher also works fine in
>>>>>>>>>> clang-query:
>>>>>>>>>> $ cat /tmp/q.cc
>>>>>>>>>> namespace boost {
>>>>>>>>>> template <typename T, typename C>
>>>>>>>>>> T lexical_cast(const C&) {
>>>>>>>>>>   return T();
>>>>>>>>>> }
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> namespace std {
>>>>>>>>>> template <typename T>
>>>>>>>>>> class basic_string {};
>>>>>>>>>> using string = basic_string<char>;
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> int g();
>>>>>>>>>> long long f(int p);
>>>>>>>>>> using namespace boost;
>>>>>>>>>>
>>>>>>>>>> template <typename T>
>>>>>>>>>> void string_as_T() {
>>>>>>>>>>   boost::lexical_cast<T>(42);
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> int main() {
>>>>>>>>>>   string_as_T<std::string>();
>>>>>>>>>>   boost::lexical_cast<std::string>(24);
>>>>>>>>>> }
>>>>>>>>>>
>>>>>>>>>> $ clang-query /tmp/q.cc -- -std=c++11
>>>>>>>>>> clang-query> m
>>>>>>>>>> callExpr(hasDeclaration(functionDecl(returns(hasDeclaration(classTemplateSpecializationDecl(hasName("std::basic_string"),hasTemplateArgument(0,templateArgument().bind("char_type"))))),hasName("boost::lexical_cast"),hasParameter(0,
>>>>>>>>>> hasType(qualType())))),argumentCountIs(1))
>>>>>>>>>>
>>>>>>>>>> Match #1:
>>>>>>>>>>
>>>>>>>>>> /tmp/q.cc:20:3: note: "root" binds here
>>>>>>>>>>   boost::lexical_cast<T>(42);
>>>>>>>>>>   ^~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>>>
>>>>>>>>>> Match #2:
>>>>>>>>>>
>>>>>>>>>> /tmp/q.cc:25:3: note: "root" binds here
>>>>>>>>>>   boost::lexical_cast<std::string>(24);
>>>>>>>>>>   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>>> 2 matches.
>>>>>>>>>> clang-query> m
>>>>>>>>>> callExpr(hasDeclaration(functionDecl(returns(hasDeclaration(classTemplateSpecializationDecl(hasName("std::basic_string"),hasTemplateArgument(0,templateArgument().bind("char_type"))))),hasName("boost::lexical_cast"),hasParameter(0,
>>>>>>>>>> hasType(qualType())))),argumentCountIs(1),unless(isInTemplateInstantiation()))
>>>>>>>>>>
>>>>>>>>>> Match #1:
>>>>>>>>>>
>>>>>>>>>> /tmp/q.cc:25:3: note: "root" binds here
>>>>>>>>>>   boost::lexical_cast<std::string>(24);
>>>>>>>>>>   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>>> 1 match.
>>>>>>>>>> clang-query> ^D
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> (the first matcher lacks the
>>>>>>>>>> `unless(isInTemplateInstantiation())` part, the second one has it, hence it
>>>>>>>>>> skips the match in a template instantiation).
>>>>>>>>>>
>>>>>>>>>> The only part of your matcher that is missing from this example
>>>>>>>>>> is `has(substTemplateTypeParmType(isStrictlyInteger()))` that needs a
>>>>>>>>>> locally-defined matcher `isStrictlyInteger()`.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Tue, Apr 12, 2016 at 7:44 PM, Piotr Padlewski <
>>>>>>>>>> piotr.padlewski at gmail.com> wrote:
>>>>>>>>>>
>>>>>>>>>>> It requires this patch:
>>>>>>>>>>> http://reviews.llvm.org/D18274
>>>>>>>>>>>
>>>>>>>>>>> I am trying to reproduce it right now with clang-query
>>>>>>>>>>>
>>>>>>>>>>> 2016-04-12 19:27 GMT+02:00 Alexander Kornienko <
>>>>>>>>>>> alexfh at google.com>:
>>>>>>>>>>>
>>>>>>>>>>>> I can't reproduce the issue (how I understand it) using
>>>>>>>>>>>> clang-query, and http://reviews.llvm.org/D18136 doesn't apply
>>>>>>>>>>>> cleanly, since it depends on some other patch.
>>>>>>>>>>>>
>>>>>>>>>>>> $ cat /tmp/q.cc
>>>>>>>>>>>> namespace boost {
>>>>>>>>>>>> template <typename T, typename C>
>>>>>>>>>>>> T lexical_cast(const C&) {
>>>>>>>>>>>>   return T();
>>>>>>>>>>>> }
>>>>>>>>>>>> }
>>>>>>>>>>>>
>>>>>>>>>>>> namespace std {
>>>>>>>>>>>> template <typename T>
>>>>>>>>>>>> class basic_string {};
>>>>>>>>>>>> using string = basic_string<char>;
>>>>>>>>>>>> }
>>>>>>>>>>>>
>>>>>>>>>>>> int g();
>>>>>>>>>>>> long long f(int p);
>>>>>>>>>>>> using namespace boost;
>>>>>>>>>>>>
>>>>>>>>>>>> template <typename T>
>>>>>>>>>>>> void string_as_T() {
>>>>>>>>>>>>   boost::lexical_cast<T>(42);
>>>>>>>>>>>> }
>>>>>>>>>>>>
>>>>>>>>>>>> int main() { string_as_T<std::string>(); }
>>>>>>>>>>>>
>>>>>>>>>>>> $ clang-query /tmp/q.cc -- -std=c++11
>>>>>>>>>>>> clang-query> m callExpr()
>>>>>>>>>>>>
>>>>>>>>>>>> Match #1:
>>>>>>>>>>>>
>>>>>>>>>>>> /tmp/q.cc:20:3: note: "root" binds here
>>>>>>>>>>>>   boost::lexical_cast<T>(42);
>>>>>>>>>>>>   ^~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>>>>>
>>>>>>>>>>>> Match #2:
>>>>>>>>>>>>
>>>>>>>>>>>> /tmp/q.cc:20:3: note: "root" binds here
>>>>>>>>>>>>   boost::lexical_cast<T>(42);
>>>>>>>>>>>>   ^~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>>>>>
>>>>>>>>>>>> Match #3:
>>>>>>>>>>>>
>>>>>>>>>>>> /tmp/q.cc:23:14: note: "root" binds here
>>>>>>>>>>>> int main() { string_as_T<std::string>(); }
>>>>>>>>>>>>              ^~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>>>>> 3 matches.
>>>>>>>>>>>> clang-query> m callExpr(unless(isInTemplateInstantiation()))
>>>>>>>>>>>>
>>>>>>>>>>>> Match #1:
>>>>>>>>>>>>
>>>>>>>>>>>> /tmp/q.cc:20:3: note: "root" binds here
>>>>>>>>>>>>   boost::lexical_cast<T>(42);
>>>>>>>>>>>>   ^~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>>>>>
>>>>>>>>>>>> Match #2:
>>>>>>>>>>>>
>>>>>>>>>>>> /tmp/q.cc:23:14: note: "root" binds here
>>>>>>>>>>>> int main() { string_as_T<std::string>(); }
>>>>>>>>>>>>              ^~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>>>>> 2 matches.
>>>>>>>>>>>> clang-query>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Thu, Apr 7, 2016 at 8:25 PM, Piotr Padlewski <
>>>>>>>>>>>> piotr.padlewski at gmail.com> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> This should be enough to break this matcher
>>>>>>>>>>>>> http://pastebin.com/CH7a3hur
>>>>>>>>>>>>>
>>>>>>>>>>>>> 2016-04-07 18:56 GMT+02:00 Alexander Kornienko <
>>>>>>>>>>>>> alexfh at google.com>:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Can you provide a minimal test for this?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> On Thu, Apr 7, 2016 at 4:04 PM, Piotr Padlewski <
>>>>>>>>>>>>>> piotr.padlewski at gmail.com> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> bump.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> 2016-04-04 20:48 GMT+02:00 Piotr Padlewski <
>>>>>>>>>>>>>>> piotr.padlewski at gmail.com>:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Hi guys,
>>>>>>>>>>>>>>>> I am having trobles with isInTemplateInstantiation matcher.
>>>>>>>>>>>>>>>> When I run my matcher (http://reviews.llvm.org/D18136), it
>>>>>>>>>>>>>>>> fails on the assert in ASTTypeTraits.h:299, when KindId is
>>>>>>>>>>>>>>>> NodeKindId::NKI_TemplateArgument.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> I think my matcher is fine, and there is bug somewhere. Can
>>>>>>>>>>>>>>>> someone please tell me if I am doing something wrong, and if not, why it
>>>>>>>>>>>>>>>> doesn't work and what I should fix?
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Here is my backtrace http://4programmers.net/Pastebin/5347
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Best
>>>>>>>>>>>>>>>> Piotr
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160415/fb9e91fa/attachment.html>


More information about the cfe-dev mailing list