// Part of the Crubit project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

// Tests involving (non-template) records (structs, classes, unions).

#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "lifetime_analysis/test/lifetime_analysis_test.h"

namespace clang {
namespace tidy {
namespace lifetimes {
namespace {

TEST_F(LifetimeAnalysisTest, MembersWithSameAnnotationMergeLifetimes) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* i;
      [[clang::annotate("member_lifetimes", "a")]]
      int* j;
    };
    void target(S* s, int* p, int* q) {
      s->i = p;
      s->j = q;
    }
  )"),
              LifetimesAre({{"target", "(a, b), a, a"}}));
}

TEST_F(LifetimeAnalysisTest, StructsWithTemplateFieldsDoesNotMergeLifetimes) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename A, typename B>
    struct S { A i; B j; };
    void target(S<int*, int*>* s, int* p, int* q) {
      s->i = p;
      s->j = q;
    }
  )"),
              LifetimesAre({{"target", "(<a, b>, c), a, b"}}));
}

TEST_F(LifetimeAnalysisTest, StructWithArrayMergesLifetimes) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename A>
    struct S { A array; };
    void target(S<int**>* s, int* p, int* q) {
      s->array[0] = p;
      s->array[1] = q;
    }
  )"),
              LifetimesAre({{"target", "(a, b, c), a, a"}}));
}

TEST_F(LifetimeAnalysisTest, DeclRecordWithConditionalOperator) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename P>
    struct S { P p; };
    int* target(int* a, int* b, bool cond) {
      S<int*> s = cond ? S<int*>{a} : S<int*>{b};
      return s.p;
    }
  )"),
              LifetimesAre({{"target", "a, a, () -> a"}}));
}

TEST_F(LifetimeAnalysisTest, ReturnRecordWithConditionalOperator) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename P>
    struct S { P p; };
    S<int*> target(int* a, int* b, bool cond) {
      return cond ? S<int*>{a} : S<int*>{b};
    }
  )"),
              LifetimesAre({{"target", "a, a, () -> a"}}));
}

TEST_F(LifetimeAnalysisTest, MaterializeRecordWithConditionalOperator) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename P>
    struct S { P p; };
    int* target(int* a, int* b, bool cond) {
      return (cond ? S<int*>{a} : S<int*>{b}).p;
    }
  )"),
              LifetimesAre({{"target", "a, a, () -> a"}}));
}

TEST_F(LifetimeAnalysisTest, ConstructorInitRecordWithConditionalOperator) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename P>
    struct S { P p; };
    template <typename P>
    struct T {
      T(int* a, int* b, bool cond) : s(cond ? S<int*>{a} : S<int*>{b}) {}
      S<P> s;
    };
    int* target(int* a, int* b, bool cond) {
      T<int*> t(a, b, cond);
      return t.s.p;
    }
  )"),
              LifetimesAre({{"T<int *>::T", "(a, b): a, a, ()"},
                            {"target", "a, a, () -> a"}}));
}

TEST_F(LifetimeAnalysisTest, MemberInitRecordWithConditionalOperator) {
  EXPECT_THAT(
      GetLifetimes(R"(
    template <typename P>
    struct S { P p; };
    template <typename A, typename B, typename P>
    struct T {
      T(int* a, int* b, bool cond) : a(a), b(b), cond(cond) {}
      A a;
      B b;
      bool cond;
      S<P> s{cond ? S<int*>{a} : S<int*>{b}};
    };
    int* target(int* a, int* b, bool cond) {
      T<int*, int*, int*> t(a, b, cond);
      return t.s.p;
    }
  )"),
      LifetimesAre({{"T<int *, int *, int *>::T", "(<a, a, a>, b): a, a, ()"},
                    {"target", "a, a, () -> a"}}));
}

TEST_F(LifetimeAnalysisTest, SimpleStruct) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
      [[clang::annotate("member_lifetimes", "a")]]
      int* b;
    };
    void target(S* s, int* a, int* b) {
      s->a = a;
      s->b = b;
    }
  )"),
              LifetimesAre({{"target", "(a, b), a, a"}}));
}

TEST_F(LifetimeAnalysisTest, SimpleUnion) {
  EXPECT_THAT(GetLifetimes(R"(
    union [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
      [[clang::annotate("member_lifetimes", "a")]]
      int* b;
    };
    void target(S* s, int* a, int* b) {
      s->a = a;
      s->b = b;
    }
  )"),
              LifetimesAre({{"target", "(a, b), a, a"}}));
}

TEST_F(LifetimeAnalysisTest, StructReference) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
      [[clang::annotate("member_lifetimes", "a")]]
      int* b;
    };
    void target(S& s, int* a, int* b) {
      s.a = a;
      s.b = b;
    }
  )"),
              LifetimesAre({{"target", "(a, b), a, a"}}));
}

TEST_F(LifetimeAnalysisTest, StructValue) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    int* target(S s) {
      return s.a;
    }
  )"),
              LifetimesAre({{"target", "a -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructMultiplePtrsSameLifetime) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a", "a", "a")]]
      int*** a;
      [[clang::annotate("member_lifetimes", "a", "a")]]
      int** b;
    };
    void f(S& s) {
      **s.a = *s.b;
    }
    void target(int** a, int* b) {
       S s{&a, &b};
       f(s);
    }
  )"),
              LifetimesContain({{"target", "(a, b), a"}}));
}

TEST_F(LifetimeAnalysisTest, StructNonLocalPtr) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    int* target(S* s) {
      return s->a;
    }
  )"),
              LifetimesAre({{"target", "(a, b) -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructMemberStructInitializedWithInitializerList) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] T {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    struct [[clang::annotate("lifetime_params", "a")]] S {
      S(int* a): t{a} { }
      [[clang::annotate("member_lifetimes", "a")]]
      T t;
    };
    int* target(int* a) {
      return S{a}.t.a;
    }
  )"),
              LifetimesAre({{"S::S", "(a, b): a"}, {"target", "a -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructMemberPtr) {
  EXPECT_THAT(GetLifetimes(R"(
    struct S {
      int a;
    };
    int* target(S* s) {
      return &s->a;
    }
  )"),
              LifetimesAre({{"target", "a -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructReferenceMember) {
  // This is a regression test for a bug where we were not treating accesses to
  // member variables of reference type correctly.
  EXPECT_THAT(GetLifetimes(R"(
    struct S1 {
      int a;
    };
    struct [[clang::annotate("lifetime_params", "a")]] S2 {
      [[clang::annotate("member_lifetimes", "a")]]
      S1 &s1;
    };
    int& target(S2* s2) {
      // Make sure we can find the field S1::a. This is to ensure that our
      // member access for s2->s1 is in fact returning an object of type S1
      // (not S1&).
      s2->s1.a = 5;
      return s2->s1.a;
    }
  )"),
              LifetimesAre({{"target", "(a, b) -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructStaticMemberFunction) {
  EXPECT_THAT(GetLifetimes(R"(
    struct S {
      static int* f(int* x) { return x; }
    };
    int* target(int* a) {
      return S::f(a);
    }
  )"),
              LifetimesAre({{"S::f", "a -> a"}, {"target", "a -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructMemberFunction) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
      int* f() { return a; }
    };
  )"),
              LifetimesAre({{"S::f", "(a, b): -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructMemberFunctionExplicitThis) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
      int* f() { return this->a; }
    };
  )"),
              LifetimesAre({{"S::f", "(a, b): -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructMemberFunctionCall) {
  EXPECT_THAT(
      GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
      int* f() { return a; }
    };
    int* target(S* s) {
      return s->f();
    }
  )"),
      LifetimesAre({{"S::f", "(a, b): -> a"}, {"target", "(a, b) -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructMemberFunctionCallDot) {
  EXPECT_THAT(
      GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
      int* f() { return a; }
    };
    int* target(S* s) {
      return (*s).f();
    }
  )"),
      LifetimesAre({{"S::f", "(a, b): -> a"}, {"target", "(a, b) -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructMemberFunctionComplexCall) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
      void set(int* x) { a = x; }
      int* f() { return a; }
    };
    int* target(S* s, int* b) {
      s->set(b);
      return (*s).f();
    }
  )"),
              LifetimesAre({{"S::set", "(a, b): a"},
                            {"S::f", "(a, b): -> a"},
                            {"target", "(a, b), a -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructReturnAddressOfMemberFunction) {
  EXPECT_THAT(GetLifetimes(R"(
    struct S {
      static void f();
    };
    typedef void (*funtype)();
    funtype target() {
      S s;
      return s.f;
    }
  )"),
              LifetimesContain({{"target", "-> static"}}));
}

TEST_F(LifetimeAnalysisTest, StructDefaultConstructor) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    void target() {
      S s;
    }
  )"),
              LifetimesAre({{"target", ""}}));
}

TEST_F(LifetimeAnalysisTest, StructDefaultConstructor_ExplicitCall) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    void target() {
      S();
    }
  )"),
              LifetimesAre({{"target", ""}}));
}

TEST_F(LifetimeAnalysisTest, StructConstructorStatic) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      S(int* a) { this->a = a; }
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    void target(int* a) {
      static S s{a};
    }
  )"),
              LifetimesAre({{"S::S", "(a, b): a"}, {"target", "static"}}));
}

TEST_F(LifetimeAnalysisTest, StructCopyConstructorStatic) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    void target(S* x) {
      static S s = *x;
    }
  )"),
              LifetimesAre({{"target", "(static, a)"}}));
}

TEST_F(LifetimeAnalysisTest, StructConstructorOutputsFieldPointer) {
  EXPECT_THAT(GetLifetimes(R"(
    struct S {
      S(int** field_out) {
        *field_out = &i;
      }
      int i;
    };
    int* target() {
     int* i_out;
     S s(&i_out);
     return i_out;
    }
  )"),
              LifetimesAre({{"S::S", "a: (a, b)"},
                            {"target",
                             "ERROR: function returns reference to a local"}}));
}

TEST_F(LifetimeAnalysisTest, StructConstructorOutputsThisPointer) {
  EXPECT_THAT(GetLifetimes(R"(
    struct S {
      S(S** this_out) {
        *this_out = this;
      }
    };
    S* target() {
     S* s_out;
     S s(&s_out);
     return s_out;
    }
  )"),
              LifetimesAre({{"S::S", "a: (a, b)"},
                            {"target",
                             "ERROR: function returns reference to a local"}}));
}

TEST_F(LifetimeAnalysisTest,
       StructConstructorOutputsFieldPointerConstructorInitializer) {
  EXPECT_THAT(GetLifetimes(R"(
    struct S {
      S(int** field_out) {
        *field_out = &i;
      }
      int i;
    };
    struct T {
      T(int** int_out): s(int_out) {}
      S s;
    };
  )"),
              LifetimesAre({{"S::S", "a: (a, b)"}, {"T::T", "a: (a, b)"}}));
}

TEST_F(LifetimeAnalysisTest,
       StructConstructorOutputsThisPointerConstructorInitializer) {
  EXPECT_THAT(GetLifetimes(R"(
    struct S {
      S(S** this_out) {
        *this_out = this;
      } 
    };
    struct T {
      T(S** this_out): s(this_out) {}
      S s;
    };
  )"),
              LifetimesAre({{"S::S", "a: (a, b)"}, {"T::T", "a: (a, b)"}}));
}

TEST_F(LifetimeAnalysisTest, StructConstructorOutputsThisPointerInitMember) {
  EXPECT_THAT(GetLifetimes(R"(
    struct S {
      S(S** this_out) {
        *this_out = this;
      }
    };
    static S* static_s_ptr;
    struct T {
      T() {}
      S s{&static_s_ptr};
    };
  )"),
              LifetimesAre({{"S::S", "a: (a, b)"}, {"T::T", "static:"}}));
}

TEST_F(LifetimeAnalysisTest, StructConstructorInitializers) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      S(int* a): a(a) { }
      [[clang::annotate("member_lifetimes", "a")]]
      int* a = nullptr;
      // The following members don't affect lifetimes, but we keep them
      // around to make sure that the related code is exercised.
      int b = 0;
      // This member points into the struct itself, forcing the lifetime
      // parameter in the constructor to be the same as the lifetime of the
      // object itself.
      [[clang::annotate("member_lifetimes", "a")]]
      int* c = &b;
      int d;
    };
  )"),
              LifetimesAre({{"S::S", "(a, a): a"}}));
}

TEST_F(LifetimeAnalysisTest, StructConstructorStaticPtr) {
  // TODO(veluca): this is overly restrictive in the same way as
  // StaticPointerOutParam.
  EXPECT_THAT(GetLifetimes(R"(
    static int x;
    struct [[clang::annotate("lifetime_params", "a")]] S {
      S() { a = &x; }
      [[clang::annotate("member_lifetimes", "a")]]
      int* a = nullptr;
    };
  )"),
              LifetimesAre({{"S::S", "(static, a):"}}));
}

TEST_F(LifetimeAnalysisTest, StructConstructorStaticPtrInitializer) {
  // TODO(veluca): this is overly restrictive in the same way as
  // StaticPointerOutParam.
  EXPECT_THAT(GetLifetimes(R"(
    static int x;
    struct [[clang::annotate("lifetime_params", "a")]] S {
      S(): a(&x) { }
      [[clang::annotate("member_lifetimes", "a")]]
      int* a = nullptr;
    };
  )"),
              LifetimesAre({{"S::S", "(static, a):"}}));
}

TEST_F(LifetimeAnalysisTest, StructConstructorStaticPtrMemberInitializer) {
  // TODO(veluca): this is overly restrictive in the same way as
  // StaticPointerOutParam.
  EXPECT_THAT(GetLifetimes(R"(
    static int x;
    struct [[clang::annotate("lifetime_params", "a")]] S {
      S() { }
      [[clang::annotate("member_lifetimes", "a")]]
      int* a = &x;
    };
  )"),
              LifetimesAre({{"S::S", "(static, a):"}}));
}

TEST_F(LifetimeAnalysisTest, StructMemberFreeFunction) {
  // Check that calling a method behaves in the same way as a free function.
  EXPECT_THAT(GetLifetimes(R"(
    static int x;
    struct [[clang::annotate("lifetime_params", "a")]] S {
      void f() { a = &x; }
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    void f(S& a) {
      a.a = &x;
    }
  )"),
              LifetimesAre({{"S::f", "(static, a):"}, {"f", "(static, a)"}}));
}

TEST_F(LifetimeAnalysisTest, ReturnFieldFromTemporaryStructConstructor) {
  // S(i) with a single argument produces a clang::CXXFunctionalCastExpr around
  // a clang::CXXConstructExpr.
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      S(int* i) : f(i) {}
      [[clang::annotate("member_lifetimes", "a")]]
      int* f;
    };
    int* ConstructorSyntax(int* i) {
      return S{i}.f;
    }
    int* CastSyntax(int* i) {
      return S(i).f;
    }
  )"),
              LifetimesAre({{"S::S", "(a, b): a"},
                            {"ConstructorSyntax", "a -> a"},
                            {"CastSyntax", "a -> a"}}));
}

TEST_F(LifetimeAnalysisTest,
       ReturnFieldFromTemporaryStructConstructorInitList) {
  // S has no constructors so S{i} produces a clang::InitListExpr.
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* f;
    };
    int* target(int* i) {
      return S{i}.f;
    }
  )"),
              LifetimesAre({{"target", "a -> a"}}));
}

TEST_F(LifetimeAnalysisTest, ReturnFieldFromTemporaryUnion) {
  // S has no constructors so S{i} produces a clang::InitListExpr.
  EXPECT_THAT(GetLifetimes(R"(
    union [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* f;
    };
    int* target(int* i) {
      return S{i}.f;
    }
  )"),
              LifetimesAre({{"target", "a -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructInitList) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    void target(int* a) {
      S s{a};
    }
  )"),
              LifetimesAre({{"target", "a"}}));
}

TEST_F(LifetimeAnalysisTest, UnionInitList) {
  EXPECT_THAT(GetLifetimes(R"(
    union [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    void target(int* a) {
      S s{a};
    }
  )"),
              LifetimesAre({{"target", "a"}}));
}

TEST_F(LifetimeAnalysisTest, StructCopy) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    void target(S* a, S* b) {
      *a = *b;
    }
  )"),
              LifetimesAre({{"target", "(a, b), (a, c)"}}));
}

TEST_F(LifetimeAnalysisTest, StructCopyStatic) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    void target(S* x) {
      static S s;
      s = *x;
    }
  )"),
              LifetimesAre({{"target", "(static, a)"}}));
}

// We fail to initialize the temporary object in a CXXOperatorCallExpr argument,
// which causes us to assert when we visit the MaterializeTemporaryExpr later.
TEST_F(LifetimeAnalysisTest, DISABLED_CallExprWithRecordInitializedArguments) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* i;
    };
    S callee(const S& s1, const S& s2) {
      return S{s2.i};
    }
    S target(int* a, int* b) {
      return callee(S{a}, S{b});
    }
  )"),
              LifetimesAre({{"target", "a, b -> b"}}));
}

TEST_F(LifetimeAnalysisTest, StructAssignMemberStatic) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    void target(int* x) {
      static S s;
      s.a = x;
    }
  )"),
              LifetimesAre({{"target", "static"}}));
}

TEST_F(LifetimeAnalysisTest, StructCopyExplicit) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
      S& operator=(const S& other) {
        a = other.a;
        return *this;
      }
    };
    void target(S* a, S* b) {
      *a = *b;
    }
  )"),
              LifetimesAre({{"S::operator=", "(a, c): (a, b) -> (a, c)"},
                            {"target", "(a, b), (a, c)"}}));
}

TEST_F(LifetimeAnalysisTest, StructCopyExplicitNoop) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
      S& operator=(const S& other) {
        return *this;
      }
    };
    void target(S* a, S* b) {
      *a = *b;
    }
  )"),
              LifetimesAre({{"S::operator=", "(c, d): (a, b) -> (c, d)"},
                            {"target", "(a, b), (c, d)"}}));
}

TEST_F(LifetimeAnalysisTest, StructWithStruct) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] T {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      T t;
    };
    int* target(S* s) {
      return s->t.a;
    }
  )"),
              LifetimesAre({{"target", "(a, b) -> a"}}));
}

TEST_F(LifetimeAnalysisTest, NonReferenceLikeStruct) {
  EXPECT_THAT(GetLifetimes(R"(
    struct S {
      int a;
    };
    void target(S* a, S* b) {
      a->a = b->a;
    }
  )"),
              LifetimesAre({{"target", "a, b"}}));
}

TEST_F(LifetimeAnalysisTest, StructNonReferenceLikeField) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      int a;
      [[clang::annotate("member_lifetimes", "a")]]
      int* b;
    };
    void target(S* a, S* b) {
      a->a = b->a;
    }
  )"),
              LifetimesAre({{"target", "(a, b), (c, d)"}}));
}

TEST_F(LifetimeAnalysisTest, StructAssignToReference) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      int a;
      [[clang::annotate("member_lifetimes", "a")]]
      int& b;
    };
    void target(S* a, S* b) {
      a->a = b->a;
      a->b = b->b;
    }
  )"),
              LifetimesAre({{"target", "(a, b), (c, d)"}}));
}

TEST_F(LifetimeAnalysisTest, NonReferenceLikeStructCopyAssignment) {
  EXPECT_THAT(GetLifetimes(R"(
    struct S {
      int a;
    };
    void target(S* a, S* b) {
      *a = *b;
    }
  )"),
              LifetimesAre({{"target", "a, b"}}));
}

TEST_F(LifetimeAnalysisTest, ReturnReferenceLikeStruct) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* p;
    };
    S target() {
      int i = 42;
      S s = { &i };
      return s;
    }
  )"),
              LifetimesAre({{"target",
                             "ERROR: function returns reference to a local"}}));
}

TEST_F(LifetimeAnalysisTest, ReturnNonReferenceLikeStruct) {
  EXPECT_THAT(GetLifetimes(R"(
    struct S {
      int a;
    };
    S target() {
      int i = 42;
      S s = { i };
      return s;
    }
  )"),
              LifetimesAre({{"target", ""}}));
}

TEST_F(LifetimeAnalysisTest, ReturnNonReferenceLikeStructCopy) {
  EXPECT_THAT(GetLifetimes(R"(
    struct S {
      int a;
    };
    S target(S& s) {
      return s;
    }
  )"),
              LifetimesAre({{"target", "a"}}));
}

TEST_F(LifetimeAnalysisTest, ReturnNonReferenceLikeStructFromTemporary) {
  // This is a repro for a crash observed on b/228325046.
  EXPECT_THAT(GetLifetimes(R"(
    struct S {};
    S target() {
      return S();
    }
  )"),
              LifetimesAre({{"target", ""}}));
}

TEST_F(LifetimeAnalysisTest, StructInnerDoublePtrInitList) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a", "a")]]
      int** x;
    };

    void f(int** b) {
      S s{b};
      int i = 0;
      *s.x = &i;
    }
  )"),
              LifetimesAre({{"f",
                             "ERROR: function returns reference to a local "
                             "through parameter 'b'"}}));
}

TEST_F(LifetimeAnalysisTest, StructInnerDoublePtr) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a", "a")]]
      int** x;
    };

    void g(S* s, int* a) {
      *s->x = a;
    }

    void f(int* a, int** b) {
      S s{b};
      g(&s, a);
    }
  )"),
              LifetimesAre({{"f", "a, (a, b)"}, {"g", "(a, b), a"}}));
}

TEST_F(LifetimeAnalysisTest, StructInnerDoublePtrAssign) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a", "a")]]
      int** x;
    };

    void g(S* s, int* a) {
      *s->x = a;
    }

    int* f(int* a, int** b) {
      S s{b};
      g(&s, a);
      return *b;
    }
  )"),
              LifetimesAre({{"f", "a, (a, b) -> a"}, {"g", "(a, b), a"}}));
}

TEST_F(LifetimeAnalysisTest, StructInnerDoublePtrParam) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a", "a")]]
      int** x;
    };

    void g(S* s, int* a) {
      *s->x = a;
    }

    void f(S& s, int* a, int** b) {
      s.x = b;
      g(&s, a);
    }
  )"),
              LifetimesAre({{"f", "(a, b), a, (a, a)"}, {"g", "(a, b), a"}}));
}

TEST_F(LifetimeAnalysisTest, List) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] List {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
      [[clang::annotate("member_lifetimes", "a", "a")]]
      List* next;
      void Append(List& oth) {
        next = &oth;
      }
      int* Get() const {
        return a;
      }
    };
    int* target(List* l, int* a) {
      if (l->next) {
        l->next->a = a;
      }
      return l->Get();
    }
  )"),
              LifetimesAre({{"List::Append", "(a, b): (a, a)"},
                            {"List::Get", "(a, b): -> a"},
                            {"target", "(a, b), a -> a"}}));
}

// TODO(danakj): Crashes trying to find the initializer expression under
// MaterializeTemporaryExpr. Should be improved by cl/414032764.
TEST_F(LifetimeAnalysisTest, DISABLED_VarDeclReferenceToRecordTemporary) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename T>
    struct S {
      T a;
    };
    int* target(int* a) {
      const S<int*>& s = S<int*>{a};
      return s.a;
    }
  )"),
              LifetimesAre({{"target", "a -> a"}}));
}

TEST_F(LifetimeAnalysisTest, VarDeclReferenceToRecordTemplate) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename T>
    struct S {
      T a;
    };
    S<int*>* target(S<int*>* a) {
      S<int*>& b = *a;
      return &b;
    }
  )"),
              LifetimesAre({{"target", "(a, b) -> (a, b)"}}));
}

TEST_F(LifetimeAnalysisTest, VarDeclReferenceToRecordNoTemplate) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    S* target(S* a) {
      S& b = *a;
      return &b;
    }
  )"),
              LifetimesAre({{"target", "(a, b) -> (a, b)"}}));
}

TEST_F(LifetimeAnalysisTest, ConstructorInitReferenceToRecord) {
  EXPECT_THAT(GetLifetimes(R"(
    struct [[clang::annotate("lifetime_params", "a")]] S {
      [[clang::annotate("member_lifetimes", "a")]]
      int* a;
    };
    template <class Ref>
    struct R {
      R(S& s): s(s) {}
      Ref s;
    };
    int* target(S* a) {
      R<S&> r(*a);
      return r.s.a;
    }
  )"),
              LifetimesAre({{"R<S &>::R", "(a, b, c): (a, b)"},
                            {"target", "(a, b) -> a"}}));
}

TEST_F(LifetimeAnalysisTest, MemberInitReferenceToRecord) {
  EXPECT_THAT(
      GetLifetimes(R"(
    template <typename P>
    struct S {
      P p;
    };
    template<typename P>
    struct [[clang::annotate("lifetime_params", "a")]] R {
      R(P p): ss{p} {}
      S<P> ss;
      [[clang::annotate("member_lifetimes", "a")]]
      S<P>& s{ss};
    };
    int* target(int* a) {
      R<int*> r(a);
      return r.s.p;
    }
  )"),
      LifetimesAre({{"R<int *>::R", "(<a> [b], b): a"}, {"target", "a -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructTemplateReturn) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename T>
    struct S {
      T a;
    };
    S<int*> target(S<int*>& s) {
      return s;
    }
  )"),
              LifetimesAre({{"target", "(a, b) -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructTemplateReturnXvalue) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename T>
    struct S {
      T a;
    };
    S<int*> target(S<int*> s) {
      return s;
    }
  )"),
              LifetimesAre({{"target", "a -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructTemplateReturnCall) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename T>
    struct S {
      T a;
    };
    S<int*> take_by_ref(S<int*>& s) {
      return s;
    }
    S<int*> take_by_value(S<int*> s) {
      return s;
    }
  )"),
              LifetimesAre({{"take_by_ref", "(a, b) -> a"},
                            {"take_by_value", "a -> a"}}));
}

TEST_F(LifetimeAnalysisTest, StructTemplateReturnLocal) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename T>
    struct S {
      T a;
    };
    S<int*> target(int* a) {
      int i = 42;
      return { &i };
    }
  )"),
              LifetimesAre({{"target",
                             "ERROR: function returns reference to a local"}}));
}

TEST_F(LifetimeAnalysisTest, ReturnStructTemporaryConstructor) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename T>
    struct S {
      S(T a) : a(a) {}
      T a;
    };
    S<int*> ConstructorCastSyntax(int* a) {
      return S(a);
    }
    S<int*> ConstructTemporarySyntax(int* a) {
      return S{a};
    }
  )"),
              LifetimesAre({{"S<int *>::S", "(a, b): a"},
                            {"ConstructorCastSyntax", "a -> a"},
                            {"ConstructTemporarySyntax", "a -> a"}}));
}

TEST_F(LifetimeAnalysisTest, ReturnStructTemporaryInitializerList) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename T>
    struct S {
      T a;
    };
    S<int*> InitListExpr(int* a) {
      return {a};
    }
    S<int*> CastWithInitListExpr(int* a) {
      return S<int*>{a};
    }
  )"),
              LifetimesAre({{"InitListExpr", "a -> a"},
                            {"CastWithInitListExpr", "a -> a"}}));
}

TEST_F(LifetimeAnalysisTest, ReturnUnionTemporaryInitializerList) {
  EXPECT_THAT(GetLifetimes(R"(
    template <typename T>
    union S {
      T a;
    };
    S<int*> target(int* a) {
      return {a};
    }
  )"),
              LifetimesAre({{"target", "a -> a"}}));
}

}  // namespace
}  // namespace lifetimes
}  // namespace tidy
}  // namespace clang
