Issue 178159
Summary [LifetimeSafety] Detect dangling temporaries hidden under CXXFunctionalCast
Labels false-negative, clang:temporal-safety
Assignees
Reporter usx95
    https://godbolt.org/z/a8P95MhWT
```cpp
#include <string>
#include <string_view>

std::string_view identity(std::string_view in [[clang::lifetimebound]]) {
    return in;
}

std::string_view foo() {
    return identity(std::string("temporary"));  // no error. Bad.
}

std::string temp();

std::string_view foo2() {
    return identity(temp());  // error. Good.
}

std::string_view bar() {
    return identity(std::string());  // error. Ok.
}

std::string_view baz() {
    return identity(std::string{});  // error. Ok.
}
```
Problem is because the `CXXBindTemporary` is under `CXXFunctionalCastExpr` is under `MaterializeTemporaryExpr`
```
-FunctionDecl <line:8:1, line:10:1> line:8:18 foo 'std::string_view ()'
| `-CompoundStmt <col:24, line:10:1>
| `-ReturnStmt <line:9:5, col:45>
|     `-ExprWithCleanups <col:12, col:45> 'std::string_view':'std::basic_string_view<char>'
|       `-CallExpr <col:12, col:45> 'std::string_view':'std::basic_string_view<char>'
| |-ImplicitCastExpr <col:12> 'std::string_view (*)(std::string_view)' <FunctionToPointerDecay>
|         | `-DeclRefExpr <col:12> 'std::string_view (std::string_view)' lvalue Function 0x4d5e5a28 'identity' 'std::string_view (std::string_view)'
|         `-ImplicitCastExpr <col:21, col:44> '__sv_type':'std::basic_string_view<char>' <UserDefinedConversion>
| `-CXXMemberCallExpr <col:21, col:44> '__sv_type':'std::basic_string_view<char>'
|             `-MemberExpr <col:21, col:44> '<bound member function type>' .operator basic_string_view 0x4d2dd530
|               `-ImplicitCastExpr <col:21, col:44> 'const std::basic_string<char>' lvalue <NoOp>
| `-MaterializeTemporaryExpr <col:21, col:44> 'std::string':'std::basic_string<char>' lvalue
| `-CXXFunctionalCastExpr <col:21, col:44> 'std::string':'std::basic_string<char>' functional cast to std::string <ConstructorConversion>
|                     `-CXXBindTemporaryExpr <col:21, col:44> 'std::string':'std::basic_string<char>' (CXXTemporary 0x4d5eed70)
|                       `-CXXConstructExpr <col:21, col:44> 'std::string':'std::basic_string<char>' 'void (const char *, const std::allocator<char> &)'
|                         |-ImplicitCastExpr <col:33> 'const char *' <ArrayToPointerDecay>
|                         | `-StringLiteral <col:33> 'const char[10]' lvalue "temporary"
| `-CXXDefaultArgExpr 'const std::allocator<char>' lvalue
| `-MaterializeTemporaryExpr </opt/compiler-explorer/gcc-snapshot/lib/gcc/x86_64-linux-gnu/16.0.1/../../../../include/c++/16.0.1/bits/basic_string.h:706:59, col:66> 'const std::allocator<char>' lvalue
| `-ImplicitCastExpr <col:59, col:66> 'const std::allocator<char>' <NoOp>
| `-CXXBindTemporaryExpr <col:59, col:66> 'std::allocator<char>' (CXXTemporary 0x4d5eec70)
| `-CXXTemporaryObjectExpr <col:59, col:66> 'std::allocator<char>' 'void () noexcept'
```

_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to