mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-19 03:25:54 -04:00
[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:
parent
41fcd17250
commit
020ed6713d
@ -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");
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user