[cfe-commits] r115355 - in /cfe/trunk: lib/Sema/SemaStmt.cpp test/SemaCXX/gnu-case-ranges.cpp
Douglas Gregor
dgregor at apple.com
Fri Oct 1 15:08:02 PDT 2010
On Oct 1, 2010, at 3:05 PM, Gabor Greif wrote:
> Author: ggreif
> Date: Fri Oct 1 17:05:14 2010
> New Revision: 115355
>
> URL: http://llvm.org/viewvc/llvm-project?rev=115355&view=rev
> Log:
> Factor out enumerator APSInt adjustment into
> a helper function (AdjustAPSInt) and use that
> for adjusting the high bounds of case ranges
> before APSInt comparisons. Fixes
> http://llvm.org/bugs/show_bug.cgi?id=8135
>
> Some minor refacorings while I am here.
>
> Added:
> cfe/trunk/test/SemaCXX/gnu-case-ranges.cpp
> Modified:
> cfe/trunk/lib/Sema/SemaStmt.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaStmt.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=115355&r1=115354&r2=115355&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaStmt.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaStmt.cpp Fri Oct 1 17:05:14 2010
> @@ -459,6 +459,14 @@
> return Owned(SS);
> }
>
> +static void AdjustAPSInt(llvm::APSInt &Val, unsigned BitWidth, bool IsSigned) {
> + if (Val.getBitWidth() < BitWidth)
> + Val.extend(BitWidth);
> + else if (Val.getBitWidth() > BitWidth)
> + Val.trunc(BitWidth);
> + Val.setIsSigned(IsSigned);
> +}
> +
> StmtResult
> Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch,
> Stmt *BodyStmt) {
> @@ -560,7 +568,7 @@
>
> // Convert the value to the same width/sign as the condition.
> ConvertIntegerToTypeWarnOnOverflow(LoVal, CondWidth, CondIsSigned,
> - CS->getLHS()->getLocStart(),
> + Lo->getLocStart(),
> diag::warn_case_value_overflow);
>
> // If the LHS is not the same type as the condition, insert an implicit
> @@ -639,7 +647,7 @@
>
> // Convert the value to the same width/sign as the condition.
> ConvertIntegerToTypeWarnOnOverflow(HiVal, CondWidth, CondIsSigned,
> - CR->getRHS()->getLocStart(),
> + Hi->getLocStart(),
> diag::warn_case_value_overflow);
>
> // If the LHS is not the same type as the condition, insert an implicit
> @@ -651,7 +659,7 @@
> if (LoVal > HiVal) {
> Diag(CR->getLHS()->getLocStart(), diag::warn_case_empty_range)
> << SourceRange(CR->getLHS()->getLocStart(),
> - CR->getRHS()->getLocEnd());
> + Hi->getLocEnd());
> CaseRanges.erase(CaseRanges.begin()+i);
> --i, --e;
> continue;
> @@ -740,14 +748,10 @@
> // Gather all enum values, set their type and sort them,
> // allowing easier comparison with CaseVals.
> for (EnumDecl::enumerator_iterator EDI = ED->enumerator_begin();
> - EDI != ED->enumerator_end(); EDI++) {
> - llvm::APSInt Val = (*EDI)->getInitVal();
> - if(Val.getBitWidth() < CondWidth)
> - Val.extend(CondWidth);
> - else if (Val.getBitWidth() > CondWidth)
> - Val.trunc(CondWidth);
> - Val.setIsSigned(CondIsSigned);
> - EnumVals.push_back(std::make_pair(Val, (*EDI)));
> + EDI != ED->enumerator_end(); ++EDI) {
> + llvm::APSInt Val = EDI->getInitVal();
> + AdjustAPSInt(Val, CondWidth, CondIsSigned);
> + EnumVals.push_back(std::make_pair(Val, *EDI));
> }
> std::stable_sort(EnumVals.begin(), EnumVals.end(), CmpEnumVals);
> EnumValsTy::iterator EIend =
> @@ -779,6 +783,7 @@
> }
>
> llvm::APSInt Hi = RI->second->getRHS()->EvaluateAsInt(Context);
> + AdjustAPSInt(Hi, CondWidth, CondIsSigned);
> while (EI != EIend && EI->first < Hi)
> EI++;
> if (EI == EIend || EI->first != Hi)
> @@ -806,6 +811,7 @@
> // Drop unneeded case ranges
> for (; RI != CaseRanges.end(); RI++) {
> llvm::APSInt Hi = RI->second->getRHS()->EvaluateAsInt(Context);
> + AdjustAPSInt(Hi, CondWidth, CondIsSigned);
> if (EI->first <= Hi)
> break;
> }
>
> Added: cfe/trunk/test/SemaCXX/gnu-case-ranges.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/gnu-case-ranges.cpp?rev=115355&view=auto
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/gnu-case-ranges.cpp (added)
> +++ cfe/trunk/test/SemaCXX/gnu-case-ranges.cpp Fri Oct 1 17:05:14 2010
> @@ -0,0 +1,24 @@
> +// RUN: %clang_cc1 -o /dev/null -verify %s
The -o /dev/null is redundant here. clang -cc1 defaults to -fsyntax-only, which does not produce any files as output.
- Doug
More information about the cfe-commits
mailing list