forked from OSchip/llvm-project
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
This commit is contained in:
parent
396b3adc10
commit
cf86744ffe
|
@ -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<
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 };
|
||||
|
|
Loading…
Reference in New Issue