[cfe-dev] [analyzer] Enhancement for modernize-make-unique check
Aliaksandr Zaitsau via cfe-dev
cfe-dev at lists.llvm.org
Thu Jan 3 04:49:41 PST 2019
I did write simple matcher, which match case from example. But my
matcher is different and looks like this:
hasType(pointsTo(cxxRecordDecl(isDerivedFrom(hasName("Base"))))))
And this matches my example. Also I tried to write check like
hasType(pointsTo(cxxRecordDecl(isDerivedFrom(hasType(type(
equalsBoundNode(PointerType))))))))
But this code has compilation errors (I have no access to the logs right
now, but it's something with incorrect work with polymorphic types).
1/3/2019 3:07 PM, Jonas Toth пишет:
> Hi Alexander,
>
> from reading the matcher I can not find an issue right now, but did you
> try `clang-query` and a minimal matcher that will just match you code?
> From there it is easier to integrate it into the already existing matcher.
>
> Best Regards
> Jonas
>
> Am 03.01.19 um 01:06 schrieb Alexander Zaitsev via cfe-dev:
>> Hello.
>>
>> Recently I found one interesting piece of code which isn't handled by
>> clang-tidy with -modernize-make_unique check:
>>
>>
>> #include <memory>
>>
>> struct Base{
>> virtual ~Base() = default;
>> virtual void onTest() = 0;
>> };
>>
>> struct Derived : Base {
>> void onTest() override {
>>
>> }
>> };
>>
>> class A {
>> std::unique_ptr<Base> base_;
>> public:
>> A() {
>> base_ = std::unique_ptr<Base>(new Derived); // this line
>> }
>> };
>>
>> void foo()
>> {
>> A a;
>> }
>>
>>
>> As you see we can rewrite the marked line with std::make_unique.
>>
>> I decided to fix it but met one problem with Clang AST matchers.
>>
>> I tried to modify existent matcher in MakeSmartPtrCheck.cpp (I have
>> added lines with IsDerivedFrom):
>>
>> Finder->addMatcher(
>> cxxBindTemporaryExpr(has(ignoringParenImpCasts(
>> cxxConstructExpr(
>> hasType(getSmartPointerTypeMatcher()), argumentCountIs(1),
>> hasArgument(0,
>> cxxNewExpr(anyOf(hasType(pointsTo(qualType(hasCanonicalType(
>> equalsBoundNode(PointerType))))),
>> hasType(pointsTo(cxxRecordDecl(isDerivedFrom(
>> equalsBoundNode(PointerType)))))),
>> CanCallCtor)
>> .bind(NewExpression)),
>> unless(isInTemplateInstantiation()))
>> .bind(ConstructorCall)))),
>> this);
>>
>>
>> Unfortunately it doesn't work (but compilation is successful) - modified
>> matcher doesn't match provided above example.
>>
>> What I am doing wrong here? Thank you.
>>
More information about the cfe-dev
mailing list