From 4715f6395ef152fd92c9b74d5f3e62e2cff29d27 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 4 Feb 2009 01:54:10 +0000 Subject: fix a pretty serious bug in StringMap where GetOrCreate(strstart,strend, z) would not set new values to Z. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@63707 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/StringMap.h | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'include') diff --git a/include/llvm/ADT/StringMap.h b/include/llvm/ADT/StringMap.h index aec84a9503..08418ee3c1 100644 --- a/include/llvm/ADT/StringMap.h +++ b/include/llvm/ADT/StringMap.h @@ -34,6 +34,7 @@ class StringMapEntryInitializer { public: template static void Initialize(StringMapEntry &T, InitTy InitVal) { + T.second = InitVal; } }; @@ -195,7 +196,7 @@ public: } static StringMapEntry *Create(const char *KeyStart, const char *KeyEnd) { - return Create(KeyStart, KeyEnd, 0); + return Create(KeyStart, KeyEnd, ValueTy()); } /// GetStringMapEntryFromValue - Given a value that is known to be embedded @@ -240,6 +241,17 @@ public: StringMap() : StringMapImpl(static_cast(sizeof(MapEntryTy))) {} explicit StringMap(unsigned InitialSize) : StringMapImpl(InitialSize, static_cast(sizeof(MapEntryTy))) {} + explicit StringMap(const StringMap &RHS) + : StringMapImpl(static_cast(sizeof(MapEntryTy))) { + assert(RHS.empty() && + "Copy ctor from non-empty stringmap not implemented yet!"); + } + void operator=(const StringMap &RHS) { + assert(RHS.empty() && + "assignment from non-empty stringmap not implemented yet!"); + clear(); + } + AllocatorTy &getAllocator() { return Allocator; } const AllocatorTy &getAllocator() const { return Allocator; } @@ -292,13 +304,11 @@ public: } ValueTy& operator[](const char *Key) { - value_type& entry = GetOrCreateValue(Key, Key + strlen(Key)); - return entry.getValue(); + return GetOrCreateValue(Key, Key + strlen(Key)).getValue(); } ValueTy& operator[](const std::string &Key) { const char* key_start = (Key.empty() ? NULL : &Key[0]); - value_type& entry = GetOrCreateValue(key_start, key_start + Key.size()); - return entry.getValue(); + return GetOrCreateValue(key_start, key_start + Key.size()).getValue(); } size_type count(const char *KeyStart, const char *KeyEnd) const { @@ -378,7 +388,7 @@ public: StringMapEntry &GetOrCreateValue(const char *KeyStart, const char *KeyEnd) { - return GetOrCreateValue(KeyStart, KeyEnd, 0); + return GetOrCreateValue(KeyStart, KeyEnd, ValueTy()); } /// remove - Remove the specified key/value pair from the map, but do not @@ -411,9 +421,6 @@ public: clear(); free(TheTable); } -private: - StringMap(const StringMap &); // FIXME: Implement. - void operator=(const StringMap &); // FIXME: Implement. }; -- cgit v1.2.3