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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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*89a1d03eSRichardvoid 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