]> granicus.if.org Git - clang/commitdiff
Add a fix-it hint note to -Wunique-enum to suggest that the last element gets
authorRichard Trieu <rtrieu@google.com>
Fri, 29 Jun 2012 20:36:14 +0000 (20:36 +0000)
committerRichard Trieu <rtrieu@google.com>
Fri, 29 Jun 2012 20:36:14 +0000 (20:36 +0000)
initialized with the next to last element to silence the warning.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaDecl.cpp
test/SemaCXX/warn-unique-enum.cpp

index 805c2dd0886fb3c5e2cb66b866e67aa7d5bedf3d..6ba2353b341fcaa0f2108d06590815da3c94c206 100644 (file)
@@ -23,6 +23,9 @@ def warn_variables_not_in_loop_body : Warning<
 def warn_identical_enum_values : Warning<
   "all elements of %0 are initialized with literals to value %1">,
   InGroup<DiagGroup<"unique-enum">>;
+def note_identical_enum_values : Note<
+  "initialize the last element with the previous element to silence "
+  "this warning">;
 
 // Constant expressions
 def err_expr_not_ice : Error<
index 40643896fd3bbaf6c5a4b6a323053eca1d61a672..40ec1baddba5aa9a8a03563a4679b28a510dad39 100644 (file)
@@ -10364,6 +10364,13 @@ static void CheckForUniqueEnumValues(Sema &S, Decl **Elements,
   S.Diag(Enum->getLocation(), diag::warn_identical_enum_values)
       << EnumType << FirstVal.toString(10)
       << Enum->getSourceRange();
+
+  EnumConstantDecl *Last = cast<EnumConstantDecl>(Elements[NumElements - 1]),
+                   *Next = cast<EnumConstantDecl>(Elements[NumElements - 2]);
+
+  S.Diag(Last->getLocation(), diag::note_identical_enum_values)
+    << FixItHint::CreateReplacement(Last->getInitExpr()->getSourceRange(),
+                                    Next->getName());
 }
 
 void Sema::ActOnEnumBody(SourceLocation EnumLoc, SourceLocation LBraceLoc,
index 7d04b1dc2ddc26de02ac328a8c2225e952679f12..c9e40b001425b04446c44235219c014104969dbd 100644 (file)
@@ -1,8 +1,13 @@
 // RUN: %clang_cc1 %s -fsyntax-only -verify -Wunique-enum
-enum A { A1 = 1, A2 = 1, A3 = 1 };  // expected-warning {{all elements of 'A' are initialized with literals to value 1}}
+enum A { A1 = 1, A2 = 1, A3 = 1 };  // expected-warning {{all elements of 'A' are initialized with literals to value 1}} \
+// expected-note {{initialize the last element with the previous element to silence this warning}}
 enum { B1 = 1, B2 = 1, B3 = 1 }; // no warning
-enum C { C1 = true, C2 = true}; // expected-warning {{all elements of 'C' are initialized with literals to value 1}}
-enum D { D1 = 5, D2 = 5L, D3 = 5UL, D4 = 5LL, D5 = 5ULL };  // expected-warning {{all elements of 'D' are initialized with literals to value 5}}
+enum C { // expected-warning {{all elements of 'C' are initialized with literals to value 1}}
+  C1 = true,
+  C2 = true  // expected-note {{initialize the last element with the previous element to silence this warning}}
+};
+enum D { D1 = 5, D2 = 5L, D3 = 5UL, D4 = 5LL, D5 = 5ULL };  // expected-warning {{all elements of 'D' are initialized with literals to value 5}} \
+// expected-note {{initialize the last element with the previous element to silence this warning}}
 
 // Don't warn on enums with less than 2 elements.
 enum E { E1 = 4 };