Distinguish "a," from "a". The first one splits into "a" + "" and the second one...
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 13 Nov 2009 04:55:09 +0000 (04:55 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 13 Nov 2009 04:55:09 +0000 (04:55 +0000)
"a" + 0.

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

lib/Support/StringExtras.cpp
unittests/ADT/StringRefTest.cpp

index 687394a2fce493562490cdb9580acc101c475ede..1b233ab200ae703b79b273d59d37cdf2c3509a21 100644 (file)
@@ -63,8 +63,10 @@ void llvm::StringRef::split(SmallVectorImpl<StringRef> &A,
                             bool KeepEmpty) const {
   StringRef rest = *this;
 
+  // rest.data() is used to distinguish cases like "a," that splits into
+  // "a" + "" and "a" that splits into "a" + 0.
   for (int splits = 0;
-       rest.size() != 0 && (MaxSplit < 0 || splits < MaxSplit);
+       rest.data() != NULL && (MaxSplit < 0 || splits < MaxSplit);
        ++splits) {
     std::pair<llvm::StringRef, llvm::StringRef> p = rest.split(Separators);
 
@@ -72,7 +74,7 @@ void llvm::StringRef::split(SmallVectorImpl<StringRef> &A,
       A.push_back(p.first);
     rest = p.second;
   }
-
-  if (rest.size() != 0 || KeepEmpty)
+  // If we have a tail left, add it.
+  if (rest.data() != NULL && (rest.size() != 0 || KeepEmpty))
     A.push_back(rest);
 }
index ea1d26cb60064a79a706d9f47b95be04a757e57c..dfa208abefdc223d2dce9bdd7f949f30d8c86621 100644 (file)
@@ -143,6 +143,11 @@ TEST(StringRefTest, Split2) {
   StringRef(",").split(parts, ",", -1, true);
   EXPECT_TRUE(parts == expected);
 
+  expected.clear(); parts.clear();
+  expected.push_back("a"); expected.push_back("b");
+  StringRef("a,b").split(parts, ",", -1, true);
+  EXPECT_TRUE(parts == expected);
+
   // Test MaxSplit
   expected.clear(); parts.clear();
   expected.push_back("a,,b,c");