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

Alexander Kornienko via cfe-dev cfe-dev at lists.llvm.org
Wed Apr 13 04:47:58 PDT 2016


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/20160413/ebf7dafa/attachment.html>


More information about the cfe-dev mailing list