// RUN: %clang_cc1 %s -ast-dump | FileCheck %s // Verify that we print the [[clang::lifetime_capture_by(X)]] attribute. struct S { void foo(int &a, int &b) [[clang::lifetime_capture_by(a, b, global)]]; }; // CHECK: CXXMethodDecl {{.*}}clang::lifetime_capture_by(a, b, global) // **************************************************************************** // Infer annotation for STL container methods. // **************************************************************************** namespace __gnu_cxx { template struct basic_iterator {}; } namespace std { template class allocator {}; template > struct vector { typedef __gnu_cxx::basic_iterator iterator; iterator begin(); vector(); void push_back(const T&); void push_back(T&&); void insert(iterator, T&&); }; template struct map { Value& operator[](Key&& p); Value& operator[](const Key& p); }; } // namespace std // CHECK-NOT: LifetimeCaptureByAttr struct [[gsl::Pointer()]] View {}; std::vector views; // CHECK: ClassTemplateSpecializationDecl {{.*}} struct vector definition implicit_instantiation // CHECK: CXXMethodDecl {{.*}} push_back 'void (const View &)' // CHECK-NEXT: ParmVarDecl {{.*}} 'const View &' // CHECK-NEXT: LifetimeCaptureByAttr {{.*}} Implicit // CHECK: CXXMethodDecl {{.*}} push_back 'void (View &&)' // CHECK-NEXT: ParmVarDecl {{.*}} 'View &&' // CHECK-NEXT: LifetimeCaptureByAttr {{.*}} Implicit // CHECK: CXXMethodDecl {{.*}} insert 'void (iterator, View &&)' // CHECK-NEXT: ParmVarDecl {{.*}} 'iterator' // CHECK-NEXT: ParmVarDecl {{.*}} 'View &&' // CHECK-NEXT: LifetimeCaptureByAttr {{.*}} Implicit template struct [[gsl::Pointer()]] ViewTemplate {}; std::vector> templated_views; // CHECK: ClassTemplateSpecializationDecl {{.*}} struct vector definition implicit_instantiation // CHECK: CXXMethodDecl {{.*}} push_back 'void (const ViewTemplate &)' // CHECK-NEXT: ParmVarDecl {{.*}} 'const ViewTemplate &' // CHECK-NEXT: LifetimeCaptureByAttr {{.*}} Implicit // CHECK-NOT: LifetimeCaptureByAttr // CHECK: CXXMethodDecl {{.*}} push_back 'void (ViewTemplate &&)' // CHECK-NEXT: ParmVarDecl {{.*}} 'ViewTemplate &&' // CHECK-NEXT: LifetimeCaptureByAttr {{.*}} Implicit // CHECK: CXXMethodDecl {{.*}} insert 'void (iterator, ViewTemplate &&)' // CHECK-NEXT: ParmVarDecl {{.*}} 'iterator' // CHECK-NEXT: ParmVarDecl {{.*}} 'ViewTemplate &&' // CHECK-NEXT: LifetimeCaptureByAttr {{.*}} Implicit std::vector pointers; // CHECK: ClassTemplateSpecializationDecl {{.*}} struct vector definition implicit_instantiation // CHECK: CXXMethodDecl {{.*}} push_back 'void (int *const &)' // CHECK-NEXT: ParmVarDecl {{.*}} 'int *const &' // CHECK-NOT: LifetimeCaptureByAttr // CHECK: CXXMethodDecl {{.*}} push_back 'void (int *&&)' // CHECK-NEXT: ParmVarDecl {{.*}} 'int *&&' // CHECK-NOT: LifetimeCaptureByAttr // CHECK: CXXMethodDecl {{.*}} insert 'void (iterator, int *&&)' // CHECK-NEXT: ParmVarDecl {{.*}} 'iterator' // CHECK-NEXT: ParmVarDecl {{.*}} 'int *&&' // CHECK-NOT: LifetimeCaptureByAttr std::vector ints; // CHECK: ClassTemplateSpecializationDecl {{.*}} struct vector definition implicit_instantiation // CHECK: TemplateArgument type 'int' // CHECK: CXXMethodDecl {{.*}} push_back 'void (const int &)' // CHECK-NOT: LifetimeCaptureByAttr // CHECK: CXXMethodDecl {{.*}} push_back 'void (int &&)' // CHECK-NOT: LifetimeCaptureByAttr // CHECK: CXXMethodDecl {{.*}} insert 'void (iterator, int &&)' // CHECK-NEXT: ParmVarDecl {{.*}} 'iterator' // CHECK-NEXT: ParmVarDecl {{.*}} 'int &&' // CHECK-NOT: LifetimeCaptureByAttr std::map map; // CHECK: ClassTemplateSpecializationDecl {{.*}} struct map definition implicit_instantiation // CHECK: CXXMethodDecl {{.*}} operator[] 'int &(View &&)' implicit_instantiation // CHECK-NEXT: ParmVarDecl {{.*}} p 'View &&' // CHECK-NEXT: LifetimeCaptureByAttr {{.*}} Implicit // CHECK: CXXMethodDecl {{.*}} operator[] 'int &(const View &)' implicit_instantiation // CHECK-NEXT: ParmVarDecl {{.*}} p 'const View &' // CHECK-NEXT: LifetimeCaptureByAttr {{.*}} Implicit