Fix 11666: FP returnDanglingLifetime with specializations and ptr to member (#5003)

* Fix 11666: FP returnDanglingLifetime with specializations and ptr to member

* Format
This commit is contained in:
Paul Fultz II 2023-04-23 07:38:28 -05:00 committed by GitHub
parent c5310fe8a2
commit 1b9369b78b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 4 deletions

View File

@ -4519,10 +4519,15 @@ static void valueFlowLifetimeClassConstructor(Token* tok,
std::vector<const Token*> args = getArguments(tok);
if (scope->numConstructors == 0) {
auto it = scope->varlist.cbegin();
LifetimeStore::forEach(args,
"Passed to constructor of '" + t->name() + "'.",
ValueFlow::Value::LifetimeKind::SubObject,
[&](const LifetimeStore& ls) {
LifetimeStore::forEach(
args,
"Passed to constructor of '" + t->name() + "'.",
ValueFlow::Value::LifetimeKind::SubObject,
[&](const LifetimeStore& ls) {
// Skip static variable
it = std::find_if(it, scope->varlist.cend(), [](const Variable& var) {
return !var.isStatic();
});
if (it == scope->varlist.cend())
return;
const Variable& var = *it;

View File

@ -3235,6 +3235,28 @@ private:
" return &a[0].x;\n"
"}\n");
ASSERT_EQUALS("", errout.str());
// #11666
check("template <class T, int M, int N>\n"
"struct Matrix;\n"
"template <class T, int N>\n"
"struct Matrix<T, 1, N> {\n"
" std::array<T, N> x;\n"
"private:\n"
" static constexpr decltype(&Matrix::x) members[] = {&Matrix::x};\n"
"};\n"
"template <class T, int N>\n"
"struct Matrix<T, 2, N> {\n"
" std::array<T, N> x;\n"
" std::array<T, N> y;\n"
"private:\n"
" static constexpr decltype(&Matrix::x) members[] = {&Matrix::x, &Matrix::y};\n"
"};\n"
"template <class T>\n"
"Matrix<T, 2, 2> O() {\n"
" return { {}, {} };\n"
"}\n");
ASSERT_EQUALS("", errout.str());
}
void danglingLifetimeFunction() {