[clang-tidy] Remove obsolete checker google-runtime-references

The rules which is the base of this checker is removed from the
//Google C++ Style Guide// in May:
[[ https://github.com/google/styleguide/pull/553 | Update C++ styleguide ]].
Now this checker became obsolete.

Differential Revision: https://reviews.llvm.org/D88831
This commit is contained in:
Adam Balogh 2020-10-06 09:25:58 +02:00
parent 315970de1d
commit d6c9dc3c17
7 changed files with 3 additions and 365 deletions

View File

@ -16,7 +16,6 @@ add_clang_library(clangTidyGoogleModule
GlobalVariableDeclarationCheck.cpp
GoogleTidyModule.cpp
IntegerTypesCheck.cpp
NonConstReferences.cpp
OverloadedUnaryAndCheck.cpp
TodoCommentCheck.cpp
UnnamedNamespaceInHeaderCheck.cpp

View File

@ -23,7 +23,6 @@
#include "GlobalNamesInHeadersCheck.h"
#include "GlobalVariableDeclarationCheck.h"
#include "IntegerTypesCheck.h"
#include "NonConstReferences.h"
#include "OverloadedUnaryAndCheck.h"
#include "TodoCommentCheck.h"
#include "UnnamedNamespaceInHeaderCheck.h"
@ -63,8 +62,6 @@ class GoogleModule : public ClangTidyModule {
"google-runtime-int");
CheckFactories.registerCheck<runtime::OverloadedUnaryAndCheck>(
"google-runtime-operator");
CheckFactories.registerCheck<runtime::NonConstReferences>(
"google-runtime-references");
CheckFactories
.registerCheck<readability::AvoidUnderscoreInGoogletestNameCheck>(
"google-readability-avoid-underscore-in-googletest-name");

View File

@ -1,148 +0,0 @@
//===--- NonConstReferences.cpp - clang-tidy --------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "NonConstReferences.h"
#include "../utils/OptionsUtils.h"
#include "clang/AST/DeclBase.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/ASTMatchers/ASTMatchers.h"
using namespace clang::ast_matchers;
namespace clang {
namespace tidy {
namespace google {
namespace runtime {
NonConstReferences::NonConstReferences(StringRef Name,
ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
IncludedTypes(
utils::options::parseStringList(Options.get("IncludedTypes", ""))) {}
void NonConstReferences::storeOptions(ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "IncludedTypes",
utils::options::serializeStringList(IncludedTypes));
}
void NonConstReferences::registerMatchers(MatchFinder *Finder) {
Finder->addMatcher(
parmVarDecl(
unless(isInstantiated()),
hasType(references(
qualType(unless(isConstQualified())).bind("referenced_type"))),
unless(hasType(rValueReferenceType())))
.bind("param"),
this);
}
void NonConstReferences::check(const MatchFinder::MatchResult &Result) {
const auto *Parameter = Result.Nodes.getNodeAs<ParmVarDecl>("param");
const auto *Function =
dyn_cast_or_null<FunctionDecl>(Parameter->getParentFunctionOrMethod());
if (Function == nullptr || Function->isImplicit())
return;
if (Function->getLocation().isMacroID())
return;
if (!Function->isCanonicalDecl())
return;
if (const auto *Method = dyn_cast<CXXMethodDecl>(Function)) {
// Don't warn on implementations of an interface using references.
if (Method->begin_overridden_methods() != Method->end_overridden_methods())
return;
// Don't warn on lambdas, as they frequently have to conform to the
// interface defined elsewhere.
if (Method->getParent()->isLambda())
return;
}
auto ReferencedType = *Result.Nodes.getNodeAs<QualType>("referenced_type");
if (std::find_if(IncludedTypes.begin(), IncludedTypes.end(),
[&](llvm::StringRef ExplicitType) {
return ReferencedType.getCanonicalType().getAsString(
Result.Context->getPrintingPolicy()) ==
ExplicitType;
}) != IncludedTypes.end())
return;
// Don't warn on function references, they shouldn't be constant.
if (ReferencedType->isFunctionProtoType())
return;
// Don't warn on dependent types in templates.
if (ReferencedType->isDependentType())
return;
if (Function->isOverloadedOperator()) {
switch (Function->getOverloadedOperator()) {
case clang::OO_LessLess:
case clang::OO_PlusPlus:
case clang::OO_MinusMinus:
case clang::OO_PlusEqual:
case clang::OO_MinusEqual:
case clang::OO_StarEqual:
case clang::OO_SlashEqual:
case clang::OO_PercentEqual:
case clang::OO_LessLessEqual:
case clang::OO_GreaterGreaterEqual:
case clang::OO_PipeEqual:
case clang::OO_CaretEqual:
case clang::OO_AmpEqual:
// Don't warn on the first parameter of operator<<(Stream&, ...),
// operator++, operator-- and operation+assignment operators.
if (Function->getParamDecl(0) == Parameter)
return;
break;
case clang::OO_GreaterGreater: {
auto isNonConstRef = [](clang::QualType T) {
return T->isReferenceType() &&
!T.getNonReferenceType().isConstQualified();
};
// Don't warn on parameters of stream extractors:
// Stream& operator>>(Stream&, Value&);
// Both parameters should be non-const references by convention.
if (isNonConstRef(Function->getParamDecl(0)->getType()) &&
(Function->getNumParams() < 2 || // E.g. member operator>>.
isNonConstRef(Function->getParamDecl(1)->getType())) &&
isNonConstRef(Function->getReturnType()))
return;
break;
}
default:
break;
}
}
// Some functions use references to comply with established standards.
if (Function->getDeclName().isIdentifier() && Function->getName() == "swap")
return;
// iostream parameters are typically passed by non-const reference.
if (StringRef(ReferencedType.getAsString()).endswith("stream"))
return;
if (Parameter->getName().empty()) {
diag(Parameter->getLocation(), "non-const reference parameter at index %0, "
"make it const or use a pointer")
<< Parameter->getFunctionScopeIndex();
} else {
diag(Parameter->getLocation(),
"non-const reference parameter %0, make it const or use a pointer")
<< Parameter;
}
}
} // namespace runtime
} // namespace google
} // namespace tidy
} // namespace clang

View File

@ -1,41 +0,0 @@
//===--- NonConstReferences.h - clang-tidy ----------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_GOOGLE_NON_CONST_REFERENCES_H
#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_GOOGLE_NON_CONST_REFERENCES_H
#include "../ClangTidyCheck.h"
namespace clang {
namespace tidy {
namespace google {
namespace runtime {
/// Checks the usage of non-constant references in function parameters.
///
/// https://google.github.io/styleguide/cppguide.html#Reference_Arguments
class NonConstReferences : public ClangTidyCheck {
public:
NonConstReferences(StringRef Name, ClangTidyContext *Context);
bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
return LangOpts.CPlusPlus;
}
void registerMatchers(ast_matchers::MatchFinder *Finder) override;
void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
private:
const std::vector<std::string> IncludedTypes;
};
} // namespace runtime
} // namespace google
} // namespace tidy
} // namespace clang
#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_GOOGLE_NON_CONST_REFERENCES_H

View File

@ -120,6 +120,9 @@ Changes in existing checks
Added an option `GetConfigPerFile` to support including files which use
different naming styles.
- Removed `google-runtime-references` check because the rule it checks does
not exist in the Google Style Guide anymore.
Improvements to include-fixer
-----------------------------

View File

@ -1,17 +0,0 @@
.. title:: clang-tidy - google-runtime-references
google-runtime-references
=========================
Checks the usage of non-constant references in function parameters.
The corresponding style guide rule:
https://google.github.io/styleguide/cppguide.html#Reference_Arguments
Options
-------
.. option:: IncludedTypes
A semicolon-separated list of names of types to explicitly include. Default is empty.

View File

@ -1,155 +0,0 @@
// RUN: %check_clang_tidy %s google-runtime-references %t -- \
// RUN: -config="{CheckOptions: \
// RUN: [{key: google-runtime-references.IncludedTypes, \
// RUN: value: 'included::A; included::B'}]}"
int a;
int &b = a;
int *c;
void f1(int a);
void f2(int *b);
void f3(const int &c);
void f4(int const &d);
// Don't warn on implicit operator= in c++11 mode.
class A {
virtual void f() {}
};
// Don't warn on rvalue-references.
struct A2 {
A2(A2&&) = default;
void f(A2&&) {}
};
// Don't warn on iostream parameters.
namespace xxx {
class istream { };
class ostringstream { };
}
void g1(xxx::istream &istr);
void g1(xxx::ostringstream &istr);
void g1(int &a);
// CHECK-MESSAGES: [[@LINE-1]]:14: warning: non-const reference parameter 'a', make it const or use a pointer [google-runtime-references]
struct s {};
void g2(int a, int b, s c, s &d);
// CHECK-MESSAGES: [[@LINE-1]]:31: warning: non-const reference parameter 'd', {{.*}}
typedef int &ref;
void g3(ref a);
// CHECK-MESSAGES: [[@LINE-1]]:13: warning: non-const reference {{.*}}
void g4(int &a, int &b, int &);
// CHECK-MESSAGES: [[@LINE-1]]:14: warning: non-const reference parameter 'a', {{.*}}
// CHECK-MESSAGES: [[@LINE-2]]:22: warning: non-const reference parameter 'b', {{.*}}
// CHECK-MESSAGES: [[@LINE-3]]:30: warning: non-const reference parameter at index 2, {{.*}}
class B {
B(B& a) {}
// CHECK-MESSAGES: [[@LINE-1]]:8: warning: non-const reference {{.*}}
virtual void f(int &a) {}
// CHECK-MESSAGES: [[@LINE-1]]:23: warning: non-const reference {{.*}}
void g(int &b);
// CHECK-MESSAGES: [[@LINE-1]]:15: warning: non-const reference {{.*}}
// Don't warn on the parameter of stream extractors defined as members.
B& operator>>(int& val) { return *this; }
};
// Only warn on the first declaration of each function to reduce duplicate
// warnings.
void B::g(int &b) {}
// Don't warn on the first parameter of stream inserters.
A& operator<<(A& s, int&) { return s; }
// CHECK-MESSAGES: [[@LINE-1]]:25: warning: non-const reference parameter at index 1, {{.*}}
// Don't warn on either parameter of stream extractors. Both need to be
// non-const references by convention.
A& operator>>(A& input, int& val) { return input; }
// Don't warn on lambdas.
auto lambda = [] (int&) {};
// Don't warn on typedefs, as we'll warn on the function itself.
typedef int (*fp)(int &);
// Don't warn on function references.
typedef void F();
void g5(const F& func) {}
void g6(F& func) {}
template<typename T>
void g7(const T& t) {}
template<typename T>
void g8(T t) {}
void f5() {
g5(f5);
g6(f5);
g7(f5);
g7<F&>(f5);
g8(f5);
g8<F&>(f5);
}
// Don't warn on dependent types.
template<typename T>
void g9(T& t) {}
template<typename T>
void g10(T t) {}
void f6() {
int i;
float f;
g9<int>(i);
g9<const int>(i);
g9<int&>(i);
g10<int&>(i);
g10<float&>(f);
}
// Warn only on the overridden methods from the base class, as the child class
// only implements the interface.
class C : public B {
C();
virtual void f(int &a) {}
};
// Don't warn on operator<< with streams-like interface.
A& operator<<(A& s, int) { return s; }
// Don't warn on swap().
void swap(C& c1, C& c2) {}
// Don't warn on standalone operator++, operator--, operator+=, operator-=,
// operator*=, etc. that all need non-const references to be functional.
A& operator++(A& a) { return a; }
A operator++(A& a, int) { return a; }
A& operator--(A& a) { return a; }
A operator--(A& a, int) { return a; }
A& operator+=(A& a, const A& b) { return a; }
A& operator-=(A& a, const A& b) { return a; }
A& operator*=(A& a, const A& b) { return a; }
A& operator/=(A& a, const A& b) { return a; }
A& operator%=(A& a, const A& b) { return a; }
A& operator<<=(A& a, const A& b) { return a; }
A& operator>>=(A& a, const A& b) { return a; }
A& operator|=(A& a, const A& b) { return a; }
A& operator^=(A& a, const A& b) { return a; }
A& operator&=(A& a, const A& b) { return a; }
namespace included {
class A {};
class B {};
void f7(A &);
void f8(B &);
}
void f9(included::A &);
void f10(included::B &);
#define DEFINE_F(name) void name(int& a)
DEFINE_F(func) {}