]> granicus.if.org Git - llvm/commitdiff
Disallow StringRef assignment from temporary std::strings.
authorJordan Rose <jordan_rose@apple.com>
Mon, 7 Nov 2016 20:34:16 +0000 (20:34 +0000)
committerJordan Rose <jordan_rose@apple.com>
Mon, 7 Nov 2016 20:34:16 +0000 (20:34 +0000)
Similar to r283798, this prevents accidentally referring to temporary
storage that goes out of scope by the end of the statement:

  someStringRef = getStringByValue();
  someStringRef = (Twine("-") + otherString).str();

Note that once again the constructor still has this problem:

  StringRef someStringRef = getStringByValue();

because once again we occasionally rely on this in calls:

  takesStringRef(getStringByValue());
  takesStringRef(Twine("-") + otherString);

Still, it's a step.

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

include/llvm/ADT/StringRef.h

index cc5a5795eeb22bc18a694d968ac820bb10092d44..97359dd2630bb7c3a21d2c7ff6017512ae69dbc5 100644 (file)
@@ -226,6 +226,15 @@ namespace llvm {
       return Data[Index];
     }
 
+    /// Disallow accidental assignment from a temporary std::string.
+    ///
+    /// The declaration here is extra complicated so that `stringRef = {}`
+    /// and `stringRef = "abc"` continue to select the move assignment operator.
+    template <typename T>
+    typename std::enable_if<std::is_same<T, std::string>::value,
+                            StringRef>::type &
+    operator=(T &&Str) = delete;
+
     /// @}
     /// @name Type Conversions
     /// @{