Commit 020ed671 authored by Eric Fiselier's avatar Eric Fiselier
Browse files

[clang-tidy] Fix check for Abseil internal namespace access

This change makes following modifications:
  * If reference originated from macro expansion, we report location inside of
    the macro instead of location where macro is referenced.
  * If for any reason deduced location is not correct we silently ignore it.

Patch by Gennadiy Rozental (rogeeff@google.com)
Reviewed as https://reviews.llvm.org/D72484
parent 41fcd172
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -37,7 +37,13 @@ void NoInternalDependenciesCheck::check(const MatchFinder::MatchResult &Result)
  const auto *InternalDependency =
      Result.Nodes.getNodeAs<NestedNameSpecifierLoc>("InternalDep");

  diag(InternalDependency->getBeginLoc(),
  SourceLocation LocAtFault =
      Result.SourceManager->getSpellingLoc(InternalDependency->getBeginLoc());

  if (!LocAtFault.isValid())
    return;

  diag(LocAtFault,
       "do not reference any 'internal' namespaces; those implementation "
       "details are reserved to Abseil");
}
+2 −0
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@ template <class P> P InternalTemplateFunction(P a) {}

namespace container_internal {
struct InternalStruct {};

template <typename T> struct InternalTemplate {};
} // namespace container_internal
} // namespace absl

+14 −1
Original line number Diff line number Diff line
@@ -44,5 +44,18 @@ std::string Str = absl::StringsFunction("a");
void MacroUse() {
  USE_INTERNAL(Function); // no-warning
  USE_EXTERNAL(Function);
  // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil
  // CHECK-MESSAGES: :[[@LINE-5]]:25: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil
}

class A : absl::container_internal::InternalStruct {};
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil

template <typename T>
class B : absl::container_internal::InternalTemplate<T> {};
// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil

template <typename T> class C : absl::container_internal::InternalTemplate<T> {
public:
  template <typename U> static C Make(U *p) { return C{}; }
};
// CHECK-MESSAGES: :[[@LINE-4]]:33: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil