Backed out changeset 02e6a50741a9 (bug 1153348) to hopefully fix the static bustage CLOSED TREE

This commit is contained in:
Wes Kocher 2015-04-21 15:47:40 -07:00
parent 10b0765a42
commit 638b28b8e0
15 changed files with 27 additions and 116 deletions

View File

@ -84,11 +84,6 @@ private:
virtual void run(const MatchFinder::MatchResult &Result);
};
class ExplicitOperatorBoolChecker : public MatchFinder::MatchCallback {
public:
virtual void run(const MatchFinder::MatchResult &Result);
};
ScopeChecker stackClassChecker;
ScopeChecker globalClassChecker;
NonHeapClassChecker nonheapClassChecker;
@ -97,17 +92,16 @@ private:
NaNExprChecker nanExprChecker;
NoAddRefReleaseOnReturnChecker noAddRefReleaseOnReturnChecker;
RefCountedInsideLambdaChecker refCountedInsideLambdaChecker;
ExplicitOperatorBoolChecker explicitOperatorBoolChecker;
MatchFinder astMatcher;
};
namespace {
std::string getDeclarationNamespace(const Decl *decl) {
bool isInIgnoredNamespace(const Decl *decl) {
const DeclContext *DC = decl->getDeclContext()->getEnclosingNamespaceContext();
const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(DC);
if (!ND) {
return "";
return false;
}
while (const DeclContext *ParentDC = ND->getParent()) {
@ -118,15 +112,8 @@ std::string getDeclarationNamespace(const Decl *decl) {
}
const auto& name = ND->getName();
return name;
}
bool isInIgnoredNamespaceForImplicitCtor(const Decl *decl) {
std::string name = getDeclarationNamespace(decl);
if (name == "") {
return false;
}
// namespace std and icu are ignored for now
return name == "std" || // standard C++ lib
name == "__gnu_cxx" || // gnu C++ lib
name == "boost" || // boost
@ -142,19 +129,7 @@ bool isInIgnoredNamespaceForImplicitCtor(const Decl *decl) {
name == "testing"; // gtest
}
bool isInIgnoredNamespaceForImplicitConversion(const Decl *decl) {
std::string name = getDeclarationNamespace(decl);
if (name == "") {
return false;
}
return name == "std" || // standard C++ lib
name == "__gnu_cxx" || // gnu C++ lib
name == "google_breakpad" || // breakpad
name == "testing"; // gtest
}
bool isIgnoredPathForImplicitCtor(const Decl *decl) {
bool isIgnoredPath(const Decl *decl) {
decl = decl->getCanonicalDecl();
SourceLocation Loc = decl->getLocation();
const SourceManager &SM = decl->getASTContext().getSourceManager();
@ -175,30 +150,9 @@ bool isIgnoredPathForImplicitCtor(const Decl *decl) {
return false;
}
bool isIgnoredPathForImplicitConversion(const Decl *decl) {
decl = decl->getCanonicalDecl();
SourceLocation Loc = decl->getLocation();
const SourceManager &SM = decl->getASTContext().getSourceManager();
SmallString<1024> FileName = SM.getFilename(Loc);
llvm::sys::fs::make_absolute(FileName);
llvm::sys::path::reverse_iterator begin = llvm::sys::path::rbegin(FileName),
end = llvm::sys::path::rend(FileName);
for (; begin != end; ++begin) {
if (begin->compare_lower(StringRef("graphite2")) == 0) {
return true;
}
}
return false;
}
bool isInterestingDeclForImplicitCtor(const Decl *decl) {
return !isInIgnoredNamespaceForImplicitCtor(decl) &&
!isIgnoredPathForImplicitCtor(decl);
}
bool isInterestingDeclForImplicitConversion(const Decl *decl) {
return !isInIgnoredNamespaceForImplicitConversion(decl) &&
!isIgnoredPathForImplicitConversion(decl);
bool isInterestingDecl(const Decl *decl) {
return !isInIgnoredNamespace(decl) &&
!isIgnoredPath(decl);
}
}
@ -278,7 +232,7 @@ public:
}
}
if (!d->isAbstract() && isInterestingDeclForImplicitCtor(d)) {
if (!d->isAbstract() && isInterestingDecl(d)) {
for (CXXRecordDecl::ctor_iterator ctor = d->ctor_begin(),
e = d->ctor_end(); ctor != e; ++ctor) {
// Ignore non-converting ctors
@ -462,16 +416,6 @@ bool isClassRefCounted(QualType T) {
return clazz ? isClassRefCounted(clazz) : RegularClass;
}
template<class T>
bool IsInSystemHeader(const ASTContext &AC, const T &D) {
auto &SourceManager = AC.getSourceManager();
auto ExpansionLoc = SourceManager.getExpansionLoc(D.getLocStart());
if (ExpansionLoc.isInvalid()) {
return false;
}
return SourceManager.isInSystemHeader(ExpansionLoc);
}
}
namespace clang {
@ -571,7 +515,12 @@ AST_MATCHER(QualType, isFloat) {
/// isExpansionInSystemHeader in newer clangs, but modified in order to work
/// with old clangs that we use on infra.
AST_MATCHER(BinaryOperator, isInSystemHeader) {
return IsInSystemHeader(Finder->getASTContext(), Node);
auto &SourceManager = Finder->getASTContext().getSourceManager();
auto ExpansionLoc = SourceManager.getExpansionLoc(Node.getLocStart());
if (ExpansionLoc.isInvalid()) {
return false;
}
return SourceManager.isInSystemHeader(ExpansionLoc);
}
/// This matcher will match locations in SkScalar.h. This header contains a
@ -700,13 +649,6 @@ DiagnosticsMatcher::DiagnosticsMatcher()
hasDescendant(declRefExpr(hasType(pointerType(pointee(isRefCounted())))).bind("node"))
),
&refCountedInsideLambdaChecker);
// Older clang versions such as the ones used on the infra recognize these
// conversions as 'operator _Bool', but newer clang versions recognize these
// as 'operator bool'.
astMatcher.addMatcher(methodDecl(anyOf(hasName("operator bool"),
hasName("operator _Bool"))).bind("node"),
&explicitOperatorBoolChecker);
}
void DiagnosticsMatcher::ScopeChecker::run(
@ -919,25 +861,6 @@ void DiagnosticsMatcher::RefCountedInsideLambdaChecker::run(
Diag.Report(node->getLocStart(), noteID);
}
void DiagnosticsMatcher::ExplicitOperatorBoolChecker::run(
const MatchFinder::MatchResult &Result) {
DiagnosticsEngine &Diag = Result.Context->getDiagnostics();
unsigned errorID = Diag.getDiagnosticIDs()->getCustomDiagID(
DiagnosticIDs::Error, "bad implicit conversion operator for %0");
unsigned noteID = Diag.getDiagnosticIDs()->getCustomDiagID(
DiagnosticIDs::Note, "consider adding the explicit keyword to %0");
const CXXConversionDecl *method = Result.Nodes.getNodeAs<CXXConversionDecl>("node");
const CXXRecordDecl *clazz = method->getParent();
if (!method->isExplicitSpecified() &&
!MozChecker::hasCustomAnnotation(method, "moz_implicit") &&
!IsInSystemHeader(method->getASTContext(), *method) &&
isInterestingDeclForImplicitConversion(method)) {
Diag.Report(method->getLocStart(), errorID) << clazz;
Diag.Report(method->getLocStart(), noteID) << "'operator bool'";
}
}
class MozCheckAction : public PluginASTAction {
public:
ASTConsumerPtr CreateASTConsumer(CompilerInstance &CI, StringRef fileName) override {

View File

@ -1,11 +0,0 @@
#define MOZ_IMPLICIT __attribute__((annotate("moz_implicit")))
struct Bad {
operator bool(); // expected-error {{bad implicit conversion operator for 'Bad'}} expected-note {{consider adding the explicit keyword to 'operator bool'}}
};
struct Good {
explicit operator bool();
};
struct Okay {
MOZ_IMPLICIT operator bool();
};

View File

@ -7,7 +7,6 @@
SOURCES += [
'TestBadImplicitConversionCtor.cpp',
'TestCustomHeap.cpp',
'TestExplicitOperatorBool.cpp',
'TestGlobalClass.cpp',
'TestMustOverride.cpp',
'TestNANTestingExpr.cpp',

View File

@ -305,7 +305,7 @@ public:
}
// Boolean conversion operator so people can use this in boolean tests
explicit operator bool() const
operator bool() const
{
return GetISupports();
}

View File

@ -660,7 +660,7 @@ protected:
void SetOuter(HTMLMediaElement* outer) { mOuter = outer; }
void SetCanPlay(bool aCanPlay);
MOZ_IMPLICIT operator bool() const { return mValue; }
operator bool() const { return mValue; }
WakeLockBoolWrapper& operator=(bool val);

View File

@ -35,7 +35,7 @@ public:
}
}
MOZ_IMPLICIT operator bool() const { return mHeld; }
operator bool() const { return mHeld; }
SelfReference(const SelfReference& aOther) = delete;
void operator=(const SelfReference& aOther) = delete;

View File

@ -1167,7 +1167,7 @@ public:
if (plugin)
mLibrary = plugin->GetLibrary();
}
explicit operator bool() { return !!mLibrary; }
operator bool() { return !!mLibrary; }
PluginLibrary* operator->() { return mLibrary; }
private:

View File

@ -277,7 +277,7 @@ public:
return mActor;
}
explicit operator bool()
operator bool()
{
return !!mActor;
}

View File

@ -63,7 +63,7 @@ class udev_lib {
}
}
explicit operator bool() {
operator bool() {
return udev;
}

View File

@ -176,7 +176,7 @@ public:
}
/* Returns whether the buffer is empty. */
explicit operator bool() { return mLength; }
operator bool() { return mLength; }
/* Returns the memory location of the buffer. */
const char* get() { return mBuf; }

View File

@ -742,7 +742,7 @@ public:
explicit MOZ_CONSTEXPR Atomic(bool aInit) : Base(aInit) {}
// We provide boolean wrappers for the underlying AtomicBase methods.
MOZ_IMPLICIT operator bool() const
operator bool() const
{
return Base::Intrinsics::load(Base::mValue);
}

View File

@ -23,7 +23,7 @@ public:
Close();
}
explicit operator bool() const
operator bool() const
{
return mPtr;
}

View File

@ -242,7 +242,7 @@ public:
return mLength;
}
explicit operator bool() { return !!mBuf; }
operator bool() { return !!mBuf; }
private:
template <size_t Size2>
friend class Buffer;

View File

@ -90,9 +90,9 @@ public:
* or not.
*/
#if defined(MOZILLA_XPCOMRT_API)
explicit operator bool() const { return mBaseFile; }
operator bool() const { return mBaseFile; }
#else
explicit operator bool() const { return mBaseFile || mBaseZip; }
operator bool() const { return mBaseFile || mBaseZip; }
#endif // defined(MOZILLA_XPCOMRT_API)
/**

View File

@ -112,7 +112,7 @@ struct nsTArrayFallibleResult
// Note: allows implicit conversions from and to bool
MOZ_IMPLICIT nsTArrayFallibleResult(bool aResult) : mResult(aResult) {}
MOZ_IMPLICIT operator bool() { return mResult; }
operator bool() { return mResult; }
private:
bool mResult;