blob: a69a1a0c40daea52ae801745087c4688ee04f0c9 [file] [log] [blame]
// 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