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

Alexander Kornienko via cfe-dev cfe-dev at lists.llvm.org
Tue Apr 12 11:44:20 PDT 2016


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/20160412/05658941/attachment.html>


More information about the cfe-dev mailing list