diff --git a/llvm/unittests/CodeGen/DIEHashTest.cpp b/llvm/unittests/CodeGen/DIEHashTest.cpp
index 92b6d76..fd1845e 100644
--- a/llvm/unittests/CodeGen/DIEHashTest.cpp
+++ b/llvm/unittests/CodeGen/DIEHashTest.cpp
@@ -17,7 +17,7 @@
 using namespace llvm;
 
 namespace {
-TEST(DIEHashData1Test, DIEHash) {
+TEST(Data1, DIEHash) {
   DIEHash Hash;
   DIE Die(dwarf::DW_TAG_base_type);
   DIEInteger Size(4);
@@ -26,19 +26,68 @@
   ASSERT_EQ(0x1AFE116E83701108ULL, MD5Res);
 }
 
-TEST(DIEHashTrivialTypeTest, DIEHash) {
+TEST(TrivialType, DIEHash) {
   // A complete, but simple, type containing no members and defined on the first
   // line of a file.
-  DIE FooType(dwarf::DW_TAG_structure_type);
+  DIE Unnamed(dwarf::DW_TAG_structure_type);
   DIEInteger One(1);
-  FooType.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One);
+  Unnamed.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One);
 
   // Line and file number are ignored.
-  FooType.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One);
-  FooType.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &One);
-  uint64_t MD5Res = DIEHash().computeTypeSignature(&FooType);
+  Unnamed.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One);
+  Unnamed.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &One);
+  uint64_t MD5Res = DIEHash().computeTypeSignature(&Unnamed);
 
   // The exact same hash GCC produces for this DIE.
   ASSERT_EQ(0x715305ce6cfd9ad1ULL, MD5Res);
 }
+
+TEST(NamedType, DIEHash) {
+  // A complete named type containing no members and defined on the first line
+  // of a file.
+  DIE Foo(dwarf::DW_TAG_structure_type);
+  DIEInteger One(1);
+  DIEString FooStr(&One, "foo");
+  Foo.addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr);
+  Foo.addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One);
+
+  // Line and file number are ignored.
+  Foo.addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One);
+  Foo.addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &One);
+  uint64_t MD5Res = DIEHash().computeTypeSignature(&Foo);
+
+  // The exact same hash GCC produces for this DIE.
+  ASSERT_EQ(0xd566dbd2ca5265ffULL, MD5Res);
+}
+
+TEST(NamespacedType, DIEHash) {
+  // A complete named type containing no members and defined on the first line
+  // of a file.
+  DIE CU(dwarf::DW_TAG_compile_unit);
+
+  DIE *Space = new DIE(dwarf::DW_TAG_namespace);
+  DIEInteger One(1);
+  DIEString SpaceStr(&One, "space");
+  Space->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &SpaceStr);
+  // DW_AT_declaration is ignored.
+  Space->addValue(dwarf::DW_AT_declaration, dwarf::DW_FORM_flag_present, &One);
+  // sibling?
+
+  DIE *Foo = new DIE(dwarf::DW_TAG_structure_type);
+  DIEString FooStr(&One, "foo");
+  Foo->addValue(dwarf::DW_AT_name, dwarf::DW_FORM_strp, &FooStr);
+  Foo->addValue(dwarf::DW_AT_byte_size, dwarf::DW_FORM_data1, &One);
+
+  // Line and file number are ignored.
+  Foo->addValue(dwarf::DW_AT_decl_file, dwarf::DW_FORM_data1, &One);
+  Foo->addValue(dwarf::DW_AT_decl_line, dwarf::DW_FORM_data1, &One);
+
+  Space->addChild(Foo);
+  CU.addChild(Space);
+
+  uint64_t MD5Res = DIEHash().computeTypeSignature(Foo);
+
+  // The exact same hash GCC produces for this DIE.
+  ASSERT_EQ(0x7b80381fd17f1e33ULL, MD5Res);
+}
 }
