From cf86744ffeb267c85fe485c26ecc1c906af1b6a7 Mon Sep 17 00:00:00 2001 From: Richard Trieu Date: Fri, 29 Jun 2012 20:36:14 +0000 Subject: [PATCH] Add a fix-it hint note to -Wunique-enum to suggest that the last element gets initialized with the next to last element to silence the warning. llvm-svn: 159458 --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 3 +++ clang/lib/Sema/SemaDecl.cpp | 7 +++++++ clang/test/SemaCXX/warn-unique-enum.cpp | 11 ++++++++--- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 805c2dd0886f..6ba2353b341f 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -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>; +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< diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 40643896fd3b..40ec1baddba5 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -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(Elements[NumElements - 1]), + *Next = cast(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, diff --git a/clang/test/SemaCXX/warn-unique-enum.cpp b/clang/test/SemaCXX/warn-unique-enum.cpp index 7d04b1dc2ddc..c9e40b001425 100644 --- a/clang/test/SemaCXX/warn-unique-enum.cpp +++ b/clang/test/SemaCXX/warn-unique-enum.cpp @@ -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 };