[llvm] r221958 - StringMap: Test and finish off supporting perfectly forwarded values in StringMap operations.

Duncan P. N. Exon Smith dexonsmith at apple.com
Mon Nov 17 15:17:57 PST 2014


> On 2014-Nov-17, at 11:26, David Blaikie <dblaikie at gmail.com> wrote:
> 
> 
> 
> On Thu, Nov 13, 2014 at 4:51 PM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
> 
> > On 2014-Nov-13, at 16:41, David Blaikie <dblaikie at gmail.com> wrote:
> >
> > Author: dblaikie
> > Date: Thu Nov 13 18:41:46 2014
> > New Revision: 221958
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=221958&view=rev
> > Log:
> > StringMap: Test and finish off supporting perfectly forwarded values in StringMap operations.
> >
> > Followup to r221946.
> 
> I'm not convinced this is necessary when there are in-tree users,
> but I suppose it can't hurt anything.
> 
> Easier to iterate when someone goes to refactor it & ensures the codepaths continue to be tested even if a certain use case later gets refactored to not use that feature anymore.
>  
> 
> >
> > Modified:
> >    llvm/trunk/include/llvm/ADT/StringMap.h
> >    llvm/trunk/unittests/ADT/StringMapTest.cpp
> >
> > Modified: llvm/trunk/include/llvm/ADT/StringMap.h
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/StringMap.h?rev=221958&r1=221957&r2=221958&view=diff
> > ==============================================================================
> > --- llvm/trunk/include/llvm/ADT/StringMap.h (original)
> > +++ llvm/trunk/include/llvm/ADT/StringMap.h Thu Nov 13 18:41:46 2014
> > @@ -170,9 +170,9 @@ public:
> >
> >   /// Create - Create a StringMapEntry with normal malloc/free.
> >   template<typename InitType>
> > -  static StringMapEntry *Create(StringRef Key, InitType InitVal) {
> > +  static StringMapEntry *Create(StringRef Key, InitType &&InitVal) {
> >     MallocAllocator A;
> > -    return Create(Key, A, std::move(InitVal));
> > +    return Create(Key, A, std::forward<InitType>(InitVal));
> >   }
> 
> This hardly adds new functionality.  The lvalue version collides with the
> `Create(StringRef, AllocatorTy&)` overload. 
> 
> Which no one is using? (or I would've just made the code fail to compile? depending on the exact nature of the collision) Again, why I love having tests - if it's required functionality, I should've broken something.
>  

Right, but you've extended functionality from my prior commit, and
added tests for what you're guessing my purpose was.  It's a rather
awkward way for us to co-develop ;).

I still think a test that "this API will compile" isn't useful.  It
permanently adds time to everyone's build, and doesn't catch any
regressions (at least, none that aren't caught by other in-tree
users failing to compile).

It would have saved us both time if I hadn't broken the commit up
into two, so perhaps I should just collapse them in the future when
I think a unit test is harmful.

> This will *only* add
> functionality for a temporary being passed in.  (See my comment below.)
> 
> A workaround would be to invert the `StringRef` and `AllocatorTy` args,
> but really you should always be passing the map's allocator.
> 
> Really? Lots of them use the default, so far as I can see.
>  
> Maybe this overload should be deleted entirely?
> 
> Maybe - but it seems it's used more than the other.
>  

I must have had a `grep`-fail :(.  It looked to me like there were
almost no users of this, most users went through the `StringMap`.

> 
> >
> >   static StringMapEntry *Create(StringRef Key) {
> > @@ -367,8 +367,9 @@ public:
> >   /// exists, return it.  Otherwise, default construct a value, insert it, and
> >   /// return.
> >   template <typename InitTy>
> > -  MapEntryTy &GetOrCreateValue(StringRef Key, InitTy Val) {
> > -    return *insert(std::make_pair(Key, std::move(Val))).first;
> > +  MapEntryTy &GetOrCreateValue(StringRef Key, InitTy &&Val) {
> > +    return *insert(std::pair<StringRef, ValueTy>(
> > +                       Key, std::forward<InitTy>(Val))).first;
> >   }
> >
> >   MapEntryTy &GetOrCreateValue(StringRef Key) {
> >
> > Modified: llvm/trunk/unittests/ADT/StringMapTest.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/StringMapTest.cpp?rev=221958&r1=221957&r2=221958&view=diff
> > ==============================================================================
> > --- llvm/trunk/unittests/ADT/StringMapTest.cpp (original)
> > +++ llvm/trunk/unittests/ADT/StringMapTest.cpp Thu Nov 13 18:41:46 2014
> > @@ -256,9 +256,15 @@ TEST_F(StringMapTest, NonDefaultConstruc
> >   ASSERT_EQ(iter->second.i, 123);
> > }
> >
> > +struct Immovable {
> > +  Immovable() {}
> > +  Immovable(Immovable&&) LLVM_DELETED_FUNCTION; // will disable the other special members
> > +};
> > +
> > struct MoveOnly {
> >   int i;
> >   MoveOnly(int i) : i(i) {}
> > +  MoveOnly(const Immovable&) : i(0) {}
> >   MoveOnly(MoveOnly &&RHS) : i(RHS.i) {}
> >   MoveOnly &operator=(MoveOnly &&RHS) {
> >     i = RHS.i;
> > @@ -270,7 +276,7 @@ private:
> >   MoveOnly &operator=(const MoveOnly &) LLVM_DELETED_FUNCTION;
> > };
> >
> > -TEST_F(StringMapTest, MoveOnlyKey) {
> > +TEST_F(StringMapTest, MoveOnly) {
> >   StringMap<MoveOnly> t;
> >   t.GetOrCreateValue("Test", MoveOnly(42));
> >   StringRef Key = "Test";
> > @@ -278,6 +284,14 @@ TEST_F(StringMapTest, MoveOnlyKey) {
> >       ->Destroy();
> > }
> >
> > +TEST_F(StringMapTest, CtorArg) {
> > +  StringMap<MoveOnly> t;
> > +  t.GetOrCreateValue("Test", Immovable());
> > +  StringRef Key = "Test";
> > +  StringMapEntry<MoveOnly>::Create(Key, Immovable())
> > +      ->Destroy();
> 
> In particular, this test would fail:
> 
>     Immovable I;
>     StringMapEntry<MoveOnly>::Create(Key, I)
> 
> Agreed.
> 
> Though on further reflection, I'm not sure this whole line of changes is the right direction - will discuss more on your use-case commit
>  
> 
> > +}
> > +
> > TEST_F(StringMapTest, MoveConstruct) {
> >   StringMap<int> A;
> >   A.GetOrCreateValue("x", 42);
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 
> 





More information about the llvm-commits mailing list