xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/abseil/no-internal-dependencies.cpp (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
1*89a1d03eSRichard // RUN: %check_clang_tidy %s abseil-no-internal-dependencies %t,  -- -- -I %S/Inputs
2*89a1d03eSRichard // RUN: clang-tidy -checks='-*, abseil-no-internal-dependencies' -header-filter='.*' %s -- -I %S/Inputs 2>&1 | FileCheck %s
3*89a1d03eSRichard 
4*89a1d03eSRichard #include "absl/strings/internal-file.h"
5*89a1d03eSRichard #include "absl/flags/internal-file.h"
6*89a1d03eSRichard // CHECK-NOT: warning:
7*89a1d03eSRichard 
8*89a1d03eSRichard #include "absl/external-file.h"
9*89a1d03eSRichard // CHECK: absl/external-file.h:6:24: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil [abseil-no-internal-dependencies]
10*89a1d03eSRichard 
DirectAcess()11*89a1d03eSRichard void DirectAcess() {
12*89a1d03eSRichard   absl::strings_internal::InternalFunction();
13*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil
14*89a1d03eSRichard 
15*89a1d03eSRichard   absl::strings_internal::InternalTemplateFunction<std::string>("a");
16*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil
17*89a1d03eSRichard }
18*89a1d03eSRichard 
19*89a1d03eSRichard class FriendUsage {
20*89a1d03eSRichard   friend struct absl::container_internal::InternalStruct;
21*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil
22*89a1d03eSRichard };
23*89a1d03eSRichard 
24*89a1d03eSRichard namespace absl {
OpeningNamespace()25*89a1d03eSRichard void OpeningNamespace() {
26*89a1d03eSRichard   strings_internal::InternalFunction();
27*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil
28*89a1d03eSRichard }
29*89a1d03eSRichard } // namespace absl
30*89a1d03eSRichard 
31*89a1d03eSRichard // should not trigger warnings
CorrectUsage()32*89a1d03eSRichard void CorrectUsage() {
33*89a1d03eSRichard   std::string Str = absl::StringsFunction("a");
34*89a1d03eSRichard   absl::SomeContainer b;
35*89a1d03eSRichard }
36*89a1d03eSRichard 
37*89a1d03eSRichard namespace absl {
38*89a1d03eSRichard SomeContainer b;
39*89a1d03eSRichard std::string Str = absl::StringsFunction("a");
40*89a1d03eSRichard } // namespace absl
41*89a1d03eSRichard 
42*89a1d03eSRichard #define USE_EXTERNAL(x) absl::strings_internal::Internal##x()
43*89a1d03eSRichard 
MacroUse()44*89a1d03eSRichard void MacroUse() {
45*89a1d03eSRichard   USE_INTERNAL(Function); // no-warning
46*89a1d03eSRichard   USE_EXTERNAL(Function);
47*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-5]]:25: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil
48*89a1d03eSRichard }
49*89a1d03eSRichard 
50*89a1d03eSRichard class A : absl::container_internal::InternalStruct {};
51*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil
52*89a1d03eSRichard 
53*89a1d03eSRichard template <typename T>
54*89a1d03eSRichard class B : absl::container_internal::InternalTemplate<T> {};
55*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil
56*89a1d03eSRichard 
57*89a1d03eSRichard template <typename T> class C : absl::container_internal::InternalTemplate<T> {
58*89a1d03eSRichard public:
Make(U * p)59*89a1d03eSRichard   template <typename U> static C Make(U *p) { return C{}; }
60*89a1d03eSRichard };
61*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-4]]:33: warning: do not reference any 'internal' namespaces; those implementation details are reserved to Abseil
62