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

Alexander Kornienko via cfe-dev cfe-dev at lists.llvm.org
Tue Apr 12 10:50:34 PDT 2016


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


More information about the cfe-dev mailing list