| // 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 that execution order is taken into account correctly. | |
| #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, OrderOfOperations_OrderOfExecution) { | |
| // This is a regression test for a wrong result that was generated by the | |
| // constraint-based approach. | |
| EXPECT_THAT(GetLifetimes(R"( | |
| int* target(int* p) { | |
| int* p2 = p; | |
| int local = 42; | |
| p = &local; | |
| return p2; | |
| } | |
| )"), | |
| LifetimesAre({{"target", "a -> a"}})); | |
| } | |
| TEST_F(LifetimeAnalysisTest, OrderOfOperations_OrderOfExecution2) { | |
| // This is a regression test for a wrong result that was generated by the | |
| // constraint-based approach. | |
| EXPECT_THAT(GetLifetimes(R"( | |
| int* target(int* p) { | |
| int **pp = &p; | |
| int local = 42; | |
| int* p2; | |
| pp = &p2; | |
| *pp = &local; | |
| return p; | |
| } | |
| )"), | |
| LifetimesAre({{"target", "a -> a"}})); | |
| } | |
| TEST_F(LifetimeAnalysisTest, OrderOfOperations_Assignment) { | |
| EXPECT_THAT(GetLifetimes(R"( | |
| int* target(int* p) { | |
| int* p2 = p; | |
| int local = 42; | |
| p2 = &local; | |
| p2 = p; | |
| return p2; | |
| } | |
| )"), | |
| LifetimesAre({{"target", "a -> a"}})); | |
| } | |
| TEST_F(LifetimeAnalysisTest, TakeAReferenceLater) { | |
| EXPECT_THAT(GetLifetimes(R"( | |
| int* target(int* p) { | |
| int* p2 = p; | |
| int local = 42; | |
| p = &local; | |
| int** pp = &p; | |
| return p2; | |
| } | |
| )"), | |
| LifetimesAre({{"target", "a -> a"}})); | |
| } | |
| TEST_F(LifetimeAnalysisTest, ChainedAssignment) { | |
| EXPECT_THAT(GetLifetimes(R"( | |
| int* target(int* a, int* b, int* c) { | |
| a = b = c; | |
| return a; | |
| } | |
| )"), | |
| LifetimesAre({{"target", "a, b, c -> c"}})); | |
| } | |
| TEST_F(LifetimeAnalysisTest, ParenExpr) { | |
| EXPECT_THAT(GetLifetimes(R"( | |
| int* target(int* a, int* b, int* c) { | |
| a = (b = c); | |
| return a; | |
| } | |
| )"), | |
| LifetimesAre({{"target", "a, b, c -> c"}})); | |
| } | |
| TEST_F(LifetimeAnalysisTest, ParenExpr2) { | |
| EXPECT_THAT(GetLifetimes(R"( | |
| int* target(int* a, int* b, int* c) { | |
| (a = b) = c; | |
| return a; | |
| } | |
| )"), | |
| LifetimesAre({{"target", "a, b, c -> c"}})); | |
| } | |
| } // namespace | |
| } // namespace lifetimes | |
| } // namespace tidy | |
| } // namespace clang |