Index: clang-tools-extra/clang-tidy/abseil/NoInternalDependenciesCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/abseil/NoInternalDependenciesCheck.cpp +++ clang-tools-extra/clang-tidy/abseil/NoInternalDependenciesCheck.cpp @@ -37,7 +37,13 @@ const auto *InternalDependency = Result.Nodes.getNodeAs("InternalDep"); - diag(InternalDependency->getBeginLoc(), + auto loc_at_fault = + Result.SourceManager->getSpellingLoc(InternalDependency->getBeginLoc()); + + if (!loc_at_fault.isValid()) + return; + + diag(loc_at_fault, "do not reference any 'internal' namespaces; those implementation " "details are reserved to Abseil"); } Index: clang-tools-extra/test/clang-tidy/checkers/Inputs/absl/strings/internal-file.h =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/Inputs/absl/strings/internal-file.h +++ clang-tools-extra/test/clang-tidy/checkers/Inputs/absl/strings/internal-file.h @@ -15,6 +15,8 @@ namespace container_internal { struct InternalStruct {}; + +template struct InternalTemplate {}; } // namespace container_internal } // namespace absl Index: clang-tools-extra/test/clang-tidy/checkers/abseil-no-internal-dependencies.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/abseil-no-internal-dependencies.cpp +++ clang-tools-extra/test/clang-tidy/checkers/abseil-no-internal-dependencies.cpp @@ -44,5 +44,18 @@ 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 +class B : absl::container_internal::InternalTemplate {}; +// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil + +template class C : absl::container_internal::InternalTemplate { +public: + template 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