summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2016-02-10 13:33:49 +0000
committerMaxime Coste <frrrwww@gmail.com>2016-02-10 13:33:49 +0000
commit8701a53252cbcd54e33ffe9f9257aadcde95c8aa (patch)
tree906e6eef40322c1c58865c44c36a763771f54f02
parent8d37a716fbf83cd58a026d70a293cb30f972ecaa (diff)
Fix use of dead temporary strings in completions
-rw-r--r--src/client_manager.cc5
-rw-r--r--src/commands.cc5
-rw-r--r--src/completion.hh4
-rw-r--r--src/face_registry.cc3
4 files changed, 14 insertions, 3 deletions
diff --git a/src/client_manager.cc b/src/client_manager.cc
index 540d18c7..d06e7259 100644
--- a/src/client_manager.cc
+++ b/src/client_manager.cc
@@ -175,7 +175,10 @@ void ClientManager::redraw_clients() const
CandidateList ClientManager::complete_client_name(StringView prefix,
ByteCount cursor_pos) const
{
- auto c = transformed(m_clients, [](const std::unique_ptr<Client>& c){ return c->context().name(); });
+ auto c = transformed(m_clients,
+ [](const std::unique_ptr<Client>& c) -> const String&
+ { return c->context().name(); });
+
return complete(prefix, cursor_pos, c);
}
diff --git a/src/commands.cc b/src/commands.cc
index 0a34cd65..6304378d 100644
--- a/src/commands.cc
+++ b/src/commands.cc
@@ -60,7 +60,10 @@ const PerArgumentCommandCompleter filename_completer({
static CandidateList complete_buffer_name(StringView prefix, ByteCount cursor_pos)
{
- auto c = transformed(BufferManager::instance(), [](const SafePtr<Buffer>& b){ return b->display_name(); });
+ auto c = transformed(BufferManager::instance(),
+ [](const SafePtr<Buffer>& b) -> const String&
+ { return b->display_name(); });
+
return complete(prefix, cursor_pos, c);
}
diff --git a/src/completion.hh b/src/completion.hh
index 47b08c73..1cc219c0 100644
--- a/src/completion.hh
+++ b/src/completion.hh
@@ -59,6 +59,10 @@ template<typename Container>
CandidateList complete(StringView prefix, ByteCount cursor_pos,
const Container& container)
{
+ using std::begin;
+ static_assert(not std::is_same<decltype(*begin(container)), String>::value,
+ "complete require long lived strings");
+
prefix = prefix.substr(0, cursor_pos);
Vector<RankedMatch> matches;
for (const auto& str : container)
diff --git a/src/face_registry.cc b/src/face_registry.cc
index cf404e63..53e93f78 100644
--- a/src/face_registry.cc
+++ b/src/face_registry.cc
@@ -97,7 +97,8 @@ CandidateList FaceRegistry::complete_alias_name(StringView prefix,
using ValueType = std::pair<String, FaceOrAlias>;
return complete(prefix, cursor_pos,
transformed(m_aliases,
- [](const ValueType& v){ return v.first; }));
+ [](const ValueType& v) -> const String&
+ { return v.first; }));
}
FaceRegistry::FaceRegistry()