| 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