diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/AvoidConstOrRefDataMembersCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/AvoidConstOrRefDataMembersCheck.cpp --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/AvoidConstOrRefDataMembersCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/AvoidConstOrRefDataMembersCheck.cpp @@ -15,12 +15,23 @@ namespace clang { namespace tidy { namespace cppcoreguidelines { +namespace { + +AST_MATCHER(FieldDecl, isMemberOfLambda) { + return Node.getParent()->isLambda(); +} + +} // namespace void AvoidConstOrRefDataMembersCheck::registerMatchers(MatchFinder *Finder) { - Finder->addMatcher( - fieldDecl(hasType(hasCanonicalType(referenceType()))).bind("ref"), this); - Finder->addMatcher( - fieldDecl(hasType(qualType(isConstQualified()))).bind("const"), this); + Finder->addMatcher(fieldDecl(unless(isMemberOfLambda()), + hasType(hasCanonicalType(referenceType()))) + .bind("ref"), + this); + Finder->addMatcher(fieldDecl(unless(isMemberOfLambda()), + hasType(qualType(isConstQualified()))) + .bind("const"), + this); } void AvoidConstOrRefDataMembersCheck::check( diff --git a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/avoid-const-or-ref-data-members.cpp b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/avoid-const-or-ref-data-members.cpp --- a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/avoid-const-or-ref-data-members.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/avoid-const-or-ref-data-members.cpp @@ -167,3 +167,22 @@ TemplatedConstRef t3{123}; TemplatedRefRef t4{123}; TemplatedRef t5{t1.t}; + +// Lambdas capturing const or ref members should not trigger warnings +void lambdas() +{ + int x1{123}; + auto y1 = [x1]{}; + + const int x2{123}; + auto y2 = [x2]{}; + + const int& x3{123}; + auto y3 = [x3]{}; + + int&& x4{123}; + auto y4 = [x4]{}; + + int& x5{x1}; + auto y5 = [x5]{}; +}