| Index: tools/clang/plugins/ChromeClassTester.cpp
 | 
| diff --git a/tools/clang/plugins/ChromeClassTester.cpp b/tools/clang/plugins/ChromeClassTester.cpp
 | 
| index 48d6a735f272c3db2331e7f21703fedaa265e0a2..931da02f3ff54e352a1cbec4337433abb38e449f 100644
 | 
| --- a/tools/clang/plugins/ChromeClassTester.cpp
 | 
| +++ b/tools/clang/plugins/ChromeClassTester.cpp
 | 
| @@ -7,26 +7,20 @@
 | 
|  
 | 
|  #include "ChromeClassTester.h"
 | 
|  
 | 
| -#include <sys/param.h>
 | 
| +#include <algorithm>
 | 
|  
 | 
|  #include "clang/AST/AST.h"
 | 
|  #include "clang/Basic/FileManager.h"
 | 
|  #include "clang/Basic/SourceManager.h"
 | 
|  
 | 
| +#ifdef LLVM_ON_UNIX
 | 
| +#include <sys/param.h>
 | 
| +#endif
 | 
| +
 | 
|  using namespace clang;
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
| -bool starts_with(const std::string& one, const std::string& two) {
 | 
| -  return one.compare(0, two.size(), two) == 0;
 | 
| -}
 | 
| -
 | 
| -std::string lstrip(const std::string& one, const std::string& two) {
 | 
| -  if (starts_with(one, two))
 | 
| -    return one.substr(two.size());
 | 
| -  return one;
 | 
| -}
 | 
| -
 | 
|  bool ends_with(const std::string& one, const std::string& two) {
 | 
|    if (two.size() > one.size())
 | 
|      return false;
 | 
| @@ -101,14 +95,67 @@ void ChromeClassTester::emitWarning(SourceLocation loc,
 | 
|    std::string err;
 | 
|    err = "[chromium-style] ";
 | 
|    err += raw_error;
 | 
| +  // TODO(dcheng): Re-enable -Werror for these diagnostics on Windows once all
 | 
| +  // the pre-existing warnings are cleaned up. https://crbug.com/467287
 | 
|    DiagnosticIDs::Level level =
 | 
| +#if !defined(LLVM_ON_WIN32)
 | 
|        diagnostic().getWarningsAsErrors() ?
 | 
|        DiagnosticIDs::Error :
 | 
| +#endif
 | 
|        DiagnosticIDs::Warning;
 | 
|    unsigned id = diagnostic().getDiagnosticIDs()->getCustomDiagID(level, err);
 | 
|    DiagnosticBuilder builder = diagnostic().Report(full, id);
 | 
|  }
 | 
|  
 | 
| +bool ChromeClassTester::InBannedDirectory(SourceLocation loc) {
 | 
| +  if (instance().getSourceManager().isInSystemHeader(loc))
 | 
| +    return true;
 | 
| +
 | 
| +  std::string filename;
 | 
| +  if (!GetFilename(loc, &filename)) {
 | 
| +    // If the filename cannot be determined, simply treat this as a banned
 | 
| +    // location, instead of going through the full lookup process.
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +  // We need to special case scratch space; which is where clang does its
 | 
| +  // macro expansion. We explicitly want to allow people to do otherwise bad
 | 
| +  // things through macros that were defined due to third party libraries.
 | 
| +  if (filename == "<scratch space>")
 | 
| +    return true;
 | 
| +
 | 
| +  // Don't complain about autogenerated protobuf files.
 | 
| +  if (ends_with(filename, ".pb.h")) {
 | 
| +    return true;
 | 
| +  }
 | 
| +
 | 
| +#if defined(LLVM_ON_UNIX)
 | 
| +  // We need to munge the paths so that they are relative to the repository
 | 
| +  // srcroot. We first resolve the symlinktastic relative path and then
 | 
| +  // remove our known srcroot from it if needed.
 | 
| +  char resolvedPath[MAXPATHLEN];
 | 
| +  if (realpath(filename.c_str(), resolvedPath)) {
 | 
| +    filename = resolvedPath;
 | 
| +  }
 | 
| +#endif
 | 
| +
 | 
| +#if defined(LLVM_ON_WIN32)
 | 
| +  std::replace(filename.begin(), filename.end(), '\\', '/');
 | 
| +#endif
 | 
| +
 | 
| +  for (const std::string& banned_dir : banned_directories_) {
 | 
| +    // If any of the banned directories occur as a component in filename,
 | 
| +    // this file is rejected.
 | 
| +    assert(banned_dir.front() == '/' && "Banned dir must start with '/'");
 | 
| +    assert(banned_dir.back() == '/' && "Banned dir must end with '/'");
 | 
| +
 | 
| +    if (filename.find(banned_dir) != std::string::npos)
 | 
| +      return true;
 | 
| +  }
 | 
| +
 | 
| +  return false;
 | 
| +}
 | 
| +
 | 
|  bool ChromeClassTester::InBannedNamespace(const Decl* record) {
 | 
|    std::string n = GetNamespace(record);
 | 
|    if (!n.empty()) {
 | 
| @@ -239,47 +286,6 @@ std::string ChromeClassTester::GetNamespaceImpl(const DeclContext* context,
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -bool ChromeClassTester::InBannedDirectory(SourceLocation loc) {
 | 
| -  std::string filename;
 | 
| -  if (!GetFilename(loc, &filename)) {
 | 
| -    // If the filename cannot be determined, simply treat this as a banned
 | 
| -    // location, instead of going through the full lookup process.
 | 
| -    return true;
 | 
| -  }
 | 
| -
 | 
| -  // We need to special case scratch space; which is where clang does its
 | 
| -  // macro expansion. We explicitly want to allow people to do otherwise bad
 | 
| -  // things through macros that were defined due to third party libraries.
 | 
| -  if (filename == "<scratch space>")
 | 
| -    return true;
 | 
| -
 | 
| -  // Don't complain about autogenerated protobuf files.
 | 
| -  if (ends_with(filename, ".pb.h")) {
 | 
| -    return true;
 | 
| -  }
 | 
| -
 | 
| -  // We need to munge the paths so that they are relative to the repository
 | 
| -  // srcroot. We first resolve the symlinktastic relative path and then
 | 
| -  // remove our known srcroot from it if needed.
 | 
| -  char resolvedPath[MAXPATHLEN];
 | 
| -  if (realpath(filename.c_str(), resolvedPath)) {
 | 
| -    filename = resolvedPath;
 | 
| -  }
 | 
| -
 | 
| -  for (size_t i = 0; i < banned_directories_.size(); ++i) {
 | 
| -    // If any of the banned directories occur as a component in filename,
 | 
| -    // this file is rejected.
 | 
| -    const std::string& banned_dir = banned_directories_[i];
 | 
| -    assert(banned_dir.front() == '/' && "Banned dir must start with '/'");
 | 
| -    assert(banned_dir.back() == '/' && "Banned dir must end with '/'");
 | 
| -
 | 
| -    if (filename.find(banned_dir) != std::string::npos)
 | 
| -      return true;
 | 
| -  }
 | 
| -
 | 
| -  return false;
 | 
| -}
 | 
| -
 | 
|  bool ChromeClassTester::IsIgnoredType(const std::string& base_name) {
 | 
|    return ignored_record_names_.find(base_name) != ignored_record_names_.end();
 | 
|  }
 | 
| 
 |