mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-27 13:30:05 +00:00
Postpone the deletion of the old name in StructType::setName to allow using a slice of the old name.
Fixes PR13522. Add a rudimentary unit test to exercise the behavior. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161296 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a6273f1a4a
commit
189f231a4b
@ -464,19 +464,26 @@ void StructType::setBody(ArrayRef<Type*> Elements, bool isPacked) {
|
||||
void StructType::setName(StringRef Name) {
|
||||
if (Name == getName()) return;
|
||||
|
||||
// If this struct already had a name, remove its symbol table entry.
|
||||
if (SymbolTableEntry) {
|
||||
getContext().pImpl->NamedStructTypes.erase(getName());
|
||||
SymbolTableEntry = 0;
|
||||
StringMap<StructType *> &SymbolTable = getContext().pImpl->NamedStructTypes;
|
||||
typedef StringMap<StructType *>::MapEntryTy EntryTy;
|
||||
|
||||
// If this struct already had a name, remove its symbol table entry. Don't
|
||||
// delete the data yet because it may be part of the new name.
|
||||
if (SymbolTableEntry)
|
||||
SymbolTable.remove((EntryTy *)SymbolTableEntry);
|
||||
|
||||
// If this is just removing the name, we're done.
|
||||
if (Name.empty()) {
|
||||
if (SymbolTableEntry) {
|
||||
// Delete the old string data.
|
||||
((EntryTy *)SymbolTableEntry)->Destroy(SymbolTable.getAllocator());
|
||||
SymbolTableEntry = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// If this is just removing the name, we're done.
|
||||
if (Name.empty())
|
||||
return;
|
||||
|
||||
// Look up the entry for the name.
|
||||
StringMapEntry<StructType*> *Entry =
|
||||
&getContext().pImpl->NamedStructTypes.GetOrCreateValue(Name);
|
||||
EntryTy *Entry = &getContext().pImpl->NamedStructTypes.GetOrCreateValue(Name);
|
||||
|
||||
// While we have a name collision, try a random rename.
|
||||
if (Entry->getValue()) {
|
||||
@ -497,7 +504,10 @@ void StructType::setName(StringRef Name) {
|
||||
|
||||
// Okay, we found an entry that isn't used. It's us!
|
||||
Entry->setValue(this);
|
||||
|
||||
|
||||
// Delete the old string data.
|
||||
if (SymbolTableEntry)
|
||||
((EntryTy *)SymbolTableEntry)->Destroy(SymbolTable.getAllocator());
|
||||
SymbolTableEntry = Entry;
|
||||
}
|
||||
|
||||
|
30
unittests/VMCore/TypesTest.cpp
Normal file
30
unittests/VMCore/TypesTest.cpp
Normal file
@ -0,0 +1,30 @@
|
||||
//===- llvm/unittest/VMCore/TypesTest.cpp - Type unit tests ---------------===//
|
||||
//
|
||||
// The LLVM Compiler Infrastructure
|
||||
//
|
||||
// This file is distributed under the University of Illinois Open Source
|
||||
// License. See LICENSE.TXT for details.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include "llvm/LLVMContext.h"
|
||||
#include "gtest/gtest.h"
|
||||
using namespace llvm;
|
||||
|
||||
namespace {
|
||||
|
||||
TEST(TypesTest, StructType) {
|
||||
LLVMContext C;
|
||||
|
||||
// PR13522
|
||||
StructType *Struct = StructType::create(C, "FooBar");
|
||||
EXPECT_EQ("FooBar", Struct->getName());
|
||||
Struct->setName(Struct->getName().substr(0, 3));
|
||||
EXPECT_EQ("Foo", Struct->getName());
|
||||
Struct->setName("");
|
||||
EXPECT_TRUE(Struct->getName().empty());
|
||||
EXPECT_FALSE(Struct->hasName());
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
Loading…
Reference in New Issue
Block a user