[libcxx-commits] [PATCH] D113137: [libc++] Fix lifetime issues of temporaries.

Arthur O'Dwyer via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Wed Nov 3 13:33:33 PDT 2021


Quuxplusone added a comment.

These tests are outside my interest area, so I don't really care what happens with them; and I also don't know much about how `format_args` is meant to be used; but, does this proposed PR actually //fix// the dangling, or just hide it enough to fool the tool?



================
Comment at: libcxx/test/std/utilities/format/format.formatter/format.context/format.context/ctor.pass.cpp:54
+  auto format_arg_store = std::make_format_args<std::basic_format_context<OutIt, CharT>>(true, CharT('a'), 42, string);
+  std::basic_format_args args{format_arg_store};
 
----------------
Style: `std::basic_format_args args = format_arg_store;` (it's not an aggregate or sequence-container)

Do I understand correctly that `std::make_format_args` does not actually return a `std::format_args`? Who came up with that? 😛 

But does this fix the dangling? https://en.cppreference.com/w/cpp/utility/format/make_format_args insists that "A formatting argument has reference semantics for user-defined types and does not extend the lifetime of `args`," so do you really need to do something like
```
auto args_tuple = std::make_tuple(true, CharT('a'), 42, string);
auto args = std::apply([](auto&&... ts) {
    return std::make_format_args<std::basic_format_context<OutIt, CharT>>(static_cast<decltype(ts)>(ts)...);
}, std::tuple<bool&&, CharT&&, int&&, std::basic_string<CharT>&>(args_tuple));
```
? (Or consider turning each of the following blocks into its own function, and just calling them like `test_foo(std::make_format_args<...>(...));` which would eliminate the lifetime issues in a more realistic way: basically by treating `format_args` as a parameter-only type.)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D113137/new/

https://reviews.llvm.org/D113137



More information about the libcxx-commits mailing list