]> granicus.if.org Git - clang/commitdiff
Fix crash in clang.
authorZachary Turner <zturner@google.com>
Tue, 3 Jul 2018 18:12:39 +0000 (18:12 +0000)
committerZachary Turner <zturner@google.com>
Tue, 3 Jul 2018 18:12:39 +0000 (18:12 +0000)
This happened during a recent refactor.  toStringRefArray() returns
a vector<StringRef>, which was being implicitly converted to an
ArrayRef<StringRef>, and then the vector was immediately being
destroyed, so the ArrayRef<> was losing its backing storage.
Fix this by making sure the vector gets permanent storage.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@336219 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/Job.cpp

index 74af597ad362707f3a5dfb86dd85c9117b48f9ba..bd1a9bd8e3ebadee63922c69a0a0f53687099113 100644 (file)
@@ -318,10 +318,12 @@ int Command::Execute(ArrayRef<llvm::Optional<StringRef>> Redirects,
   SmallVector<const char*, 128> Argv;
 
   Optional<ArrayRef<StringRef>> Env;
+  std::vector<StringRef> ArgvVectorStorage;
   if (!Environment.empty()) {
     assert(Environment.back() == nullptr &&
            "Environment vector should be null-terminated by now");
-    Env = llvm::toStringRefArray(Environment.data());
+    ArgvVectorStorage = llvm::toStringRefArray(Environment.data());
+    Env = makeArrayRef(ArgvVectorStorage);
   }
 
   if (ResponseFile == nullptr) {