Add tests for r286139.
authorJordan Rose <jordan_rose@apple.com>
Mon, 7 Nov 2016 20:40:16 +0000 (20:40 +0000)
committerJordan Rose <jordan_rose@apple.com>
Mon, 7 Nov 2016 20:40:16 +0000 (20:40 +0000)
llvm-svn: 286141

llvm/unittests/ADT/StringRefTest.cpp

index ca6b011..9c65a4b 100644 (file)
@@ -32,6 +32,34 @@ std::ostream &operator<<(std::ostream &OS,
 
 }
 
+// Check that we can't accidentally assign a temporary std::string to a
+// StringRef. (Unfortunately we can't make use of the same thing with
+// constructors.)
+//
+// Disable this check under MSVC; even MSVC 2015 isn't consistent between
+// std::is_assignable and actually writing such an assignment.
+#if !defined(_MSC_VER)
+static_assert(
+    !std::is_assignable<StringRef, std::string>::value,
+    "Assigning from prvalue std::string");
+static_assert(
+    !std::is_assignable<StringRef, std::string &&>::value,
+    "Assigning from xvalue std::string");
+static_assert(
+    std::is_assignable<StringRef, std::string &>::value,
+    "Assigning from lvalue std::string");
+static_assert(
+    std::is_assignable<StringRef, const char *>::value,
+    "Assigning from prvalue C string");
+static_assert(
+    std::is_assignable<StringRef, const char * &&>::value,
+    "Assigning from xvalue C string");
+static_assert(
+    std::is_assignable<StringRef, const char * &>::value,
+    "Assigning from lvalue C string");
+#endif
+
+
 namespace {
 TEST(StringRefTest, Construction) {
   EXPECT_EQ("", StringRef());
@@ -40,6 +68,14 @@ TEST(StringRefTest, Construction) {
   EXPECT_EQ("hello", StringRef(std::string("hello")));
 }
 
+TEST(StringRefTest, EmptyInitializerList) {
+  StringRef S = {};
+  EXPECT_TRUE(S.empty());
+
+  S = {};
+  EXPECT_TRUE(S.empty());
+}
+
 TEST(StringRefTest, Iteration) {
   StringRef S("hello");
   const char *p = "hello";