]> granicus.if.org Git - clang/commitdiff
[Sema] Use a more civilized hash map to implement -Wduplicate-enum.
authorErik Pilkington <erik.pilkington@gmail.com>
Tue, 25 Sep 2018 22:53:06 +0000 (22:53 +0000)
committerErik Pilkington <erik.pilkington@gmail.com>
Tue, 25 Sep 2018 22:53:06 +0000 (22:53 +0000)
DenseMap<long, SOMETHING> used LONG_MAX as a tombstone, so it asserts
when you try to insert it!

rdar://44774672

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@343042 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDecl.cpp
test/Sema/warn-duplicate-enum.c

index 763f6ac4d6fe72e38e8ca718de89972478b81358..d02b9712308e017bb098aed5af02fd9112f36361 100644 (file)
@@ -16402,7 +16402,7 @@ static void CheckForDuplicateEnumValues(Sema &S, ArrayRef<Decl *> Elements,
   typedef SmallVector<std::unique_ptr<ECDVector>, 3> DuplicatesVector;
 
   typedef llvm::PointerUnion<EnumConstantDecl*, ECDVector*> DeclOrVector;
-  typedef llvm::DenseMap<int64_t, DeclOrVector> ValueToVectorMap;
+  typedef std::unordered_map<int64_t, DeclOrVector> ValueToVectorMap;
 
   // Use int64_t as a key to avoid needing special handling for DenseMap keys.
   auto EnumConstantToKey = [](const EnumConstantDecl *D) {
index 84fdeb4f8fd4d6bb94b9e5806367be5d98076331..4536d0aced1f6ecaa0622abea188cf9776821def 100644 (file)
@@ -1,5 +1,5 @@
 // RUN: %clang_cc1 %s -fsyntax-only -verify -Wduplicate-enum
-// RUN: %clang_cc1 %s -x c++ -fsyntax-only -verify -Wduplicate-enum
+// RUN: %clang_cc1 %s -x c++ -DCPP -fsyntax-only -verify -Wduplicate-enum
 enum A {
   A1 = 0,  // expected-note {{element 'A1' also has value 0}}
   A2 = -1,
@@ -99,3 +99,11 @@ enum enum1 {
 enum enum2 {
   VALUE // expected-error{{redefinition of enumerator 'VALUE'}}
 };
+
+// rdar://44774672
+#ifdef CPP
+enum BigEnumerators : long {
+  e1,
+  e2 = 9223372036854775807L,
+};
+#endif