aboutsummaryrefslogtreecommitdiff
path: root/llvm/unittests/ADT/DenseMapTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/unittests/ADT/DenseMapTest.cpp')
-rw-r--r--llvm/unittests/ADT/DenseMapTest.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp
index 1ff12a6..9cd974f 100644
--- a/llvm/unittests/ADT/DenseMapTest.cpp
+++ b/llvm/unittests/ADT/DenseMapTest.cpp
@@ -622,4 +622,28 @@ TEST(DenseMapCustomTest, ConstTest) {
EXPECT_NE(Map.find(B), Map.end());
EXPECT_NE(Map.find(C), Map.end());
}
+
+struct IncompleteStruct;
+
+TEST(DenseMapCustomTest, OpaquePointerKey) {
+ // Test that we can use a pointer to an incomplete type as a DenseMap key.
+ // This is an important build time optimization, since many classes have
+ // DenseMap members.
+ DenseMap<IncompleteStruct *, int> Map;
+ int Keys[3] = {0, 0, 0};
+ IncompleteStruct *K1 = reinterpret_cast<IncompleteStruct *>(&Keys[0]);
+ IncompleteStruct *K2 = reinterpret_cast<IncompleteStruct *>(&Keys[1]);
+ IncompleteStruct *K3 = reinterpret_cast<IncompleteStruct *>(&Keys[2]);
+ Map.insert({K1, 1});
+ Map.insert({K2, 2});
+ Map.insert({K3, 3});
+ EXPECT_EQ(Map.count(K1), 1u);
+ EXPECT_EQ(Map[K1], 1);
+ EXPECT_EQ(Map[K2], 2);
+ EXPECT_EQ(Map[K3], 3);
+ Map.clear();
+ EXPECT_EQ(Map.find(K1), Map.end());
+ EXPECT_EQ(Map.find(K2), Map.end());
+ EXPECT_EQ(Map.find(K3), Map.end());
+}
}