diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-05-16 05:32:58 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-05-16 05:32:58 +0000 |
commit | 3940ce83438e2332ba541f4e65e700fbefe0c7a8 (patch) | |
tree | 7c8765daa7c5f9b090d8fd12508a4319e2d56820 /lib/Sema/SemaStmt.cpp | |
parent | def07624ecc535431e0c814b4b5b842de8a06997 (diff) |
Produce more useful 'duplicate case' diagnostics. Fixes PR9243, from Terry Long!
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156904 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaStmt.cpp')
-rw-r--r-- | lib/Sema/SemaStmt.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index 2ea07efde8..295068c9f2 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -768,8 +768,29 @@ Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch, if (i != 0 && CaseVals[i].first == CaseVals[i-1].first) { // If we have a duplicate, report it. - Diag(CaseVals[i].second->getLHS()->getLocStart(), - diag::err_duplicate_case) << CaseVals[i].first.toString(10); + // First, determine if either case value has a name + StringRef PrevString, CurrString; + Expr *PrevCase = CaseVals[i-1].second->getLHS()->IgnoreParenCasts(); + Expr *CurrCase = CaseVals[i].second->getLHS()->IgnoreParenCasts(); + if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(PrevCase)) { + PrevString = DeclRef->getDecl()->getName(); + } + if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(CurrCase)) { + CurrString = DeclRef->getDecl()->getName(); + } + std::string CaseValStr = CaseVals[i-1].first.toString(10); + + if (PrevString == CurrString) + Diag(CaseVals[i].second->getLHS()->getLocStart(), + diag::err_duplicate_case) << + (PrevString.empty() ? CaseValStr : PrevString.str()); + else + Diag(CaseVals[i].second->getLHS()->getLocStart(), + diag::err_duplicate_case_differing_expr) << + (PrevString.empty() ? CaseValStr : PrevString.str()) << + (CurrString.empty() ? CaseValStr : CurrString.str()) << + CaseValStr; + Diag(CaseVals[i-1].second->getLHS()->getLocStart(), diag::note_duplicate_case_prev); // FIXME: We really want to remove the bogus case stmt from the |