[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
This commit is contained in:
Eric Fiselier 2020-01-21 15:10:47 -05:00
parent 41fcd17250
commit 020ed6713d
3 changed files with 23 additions and 2 deletions

View File

@ -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");
}

View File

@ -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

View File

@ -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