[cfe-dev] [clang-tidy] problem finding AST matcher for nested implicit const-cast

Don Hinton via cfe-dev cfe-dev at lists.llvm.org
Fri May 10 21:08:31 PDT 2019


I think you might be able to safely remove this `if else`, or at least
limit it.

Consider the following:

// this is your test case. it's legal, but currently ignored
std::vector<int> v;
for(std::vector<int>::const_iterator i = v.begin(); i != v.end(); ++i) {}

// these aren't illegal, and therefore never even considered by the checker
-- they cause a compiler error
for(std::vector<int>::iterator i = v.cbegin(); i != v.cend(); ++i) {}
const std::vector<int> cv;
for(std::vector<int>::iterator i = cv.begin(); i != cv.end(); ++i) {}




On Fri, May 10, 2019 at 4:45 PM Don Hinton <hintonda at gmail.com> wrote:

> Hi Torbjörn:
>
> This behavior appears to be intentional, though it would be friendly to
> emit a warning.  I believe this is the case your are hitting:
>
>    794      } else if (!Context->hasSameType(CanonicalInitVarType,
>    795                                       CanonicalBeginType)) {
>    796        // Check for qualified types to avoid conversions from
> non-const to const
>    797        // iterator types.
>    798        return false;
>    799      }
>
> hth...
> don
>
> On Tue, May 7, 2019 at 1:06 PM Torbjörn Klatt via cfe-dev <
> cfe-dev at lists.llvm.org> wrote:
>
>> Hi all,
>>
>> I'm trying to fix the clang-tidy bug 35082 [1] as a starter for getting
>> into LLVM development and contribution.
>>
>> I think, I've tracked down the issue to
>>
>> clang-tidy/modernize/LoopConvertCheck.cpp:123ff:
>> clang::tidy::modernize::makeIteratorLoopMatcher()
>> ```
>>   DeclarationMatcher InitDeclMatcher =
>>
>> varDecl(hasInitializer(anyOf(ignoringParenImpCasts(BeginCallMatcher),
>>                                    materializeTemporaryExpr(
>>
>>  ignoringParenImpCasts(BeginCallMatcher)),
>>                                    hasDescendant(BeginCallMatcher))))
>>           .bind(InitVarName);
>> ```
>> The definition of `InitDeclMatcher` seems to not match  the AST tree
>> ```
>>   |-ForStmt
>>   | |-DeclStmt
>>   | | `-VarDecl
>>   | |   `-ExprWithCleanups
>>   | |     `-ImplicitCastExpr
>>   | |       `-CXXConstructExpr
>>   | |         `-MaterializeTemporaryExpr
>>   | |           `-ImplicitCastExpr
>>   | |             `-CXXMemberCallExpr
>>   | |               `-MemberExpr
>>   | |                 `-DeclRefExpr
>> ```
>> of
>> ```
>> std::vector<int> vec{1, 2, 3, 4, 5};
>> for(std::vector<int>::const_iterator i = vec.begin(); i != vec.end();
>> ++i) { ... }
>> ```
>>
>> In my naivety, I tried to include the following into the `anyOf`:
>> ```
>>                                    exprWithCleanups(
>>                                        ignoringParenImpCasts(
>>                                            cxxConstructExpr(
>>                                                materializeTemporaryExpr(
>>                                                    ignoringParenImpCasts(
>>
>>  BeginCallMatcher))))),
>> ```
>> mimicking the specific AST tree. Without luck.
>>
>> I browsed through include/clang/ASTMatchers.h for better suited matchers,
>> but couldn't find any.
>>
>> What important detail am I missing?
>>
>> Best
>> Torbjörn
>>
>> [1]: https://bugs.llvm.org/show_bug.cgi?id=35082
>>
>>
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20190510/0dd82aa7/attachment.html>


More information about the cfe-dev mailing list