mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-03 07:38:57 +00:00
Issue warning when case value is too large to fit
in case condition type. // rdar://11577384. Test is conditionalized on x86_64-apple triple as I am not sure if the INT_MAX/LONG_MAX values in the test will pass this test for other hosts. llvm-svn: 172016
This commit is contained in:
parent
751fd88eba
commit
8b115b7872
@ -568,7 +568,8 @@ public:
|
||||
/// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded
|
||||
/// integer. This must be called on an expression that constant folds to an
|
||||
/// integer.
|
||||
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const;
|
||||
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx,
|
||||
llvm::SmallVectorImpl<PartialDiagnosticAt> *Diag=0) const;
|
||||
|
||||
/// EvaluateAsLValue - Evaluate an expression to see if we can fold it to an
|
||||
/// lvalue with link time known address, with no side-effects.
|
||||
|
@ -6364,8 +6364,10 @@ bool Expr::isEvaluatable(const ASTContext &Ctx) const {
|
||||
return EvaluateAsRValue(Result, Ctx) && !Result.HasSideEffects;
|
||||
}
|
||||
|
||||
APSInt Expr::EvaluateKnownConstInt(const ASTContext &Ctx) const {
|
||||
APSInt Expr::EvaluateKnownConstInt(const ASTContext &Ctx,
|
||||
llvm::SmallVectorImpl<PartialDiagnosticAt> *Diag) const {
|
||||
EvalResult EvalResult;
|
||||
EvalResult.Diag = Diag;
|
||||
bool Result = EvaluateAsRValue(EvalResult, Ctx);
|
||||
(void)Result;
|
||||
assert(Result && "Could not evaluate expression");
|
||||
|
@ -13,6 +13,7 @@
|
||||
|
||||
#include "clang/Sema/SemaInternal.h"
|
||||
#include "clang/AST/ASTContext.h"
|
||||
#include "clang/AST/ASTDiagnostic.h"
|
||||
#include "clang/AST/CharUnits.h"
|
||||
#include "clang/AST/DeclObjC.h"
|
||||
#include "clang/AST/EvaluatedExprVisitor.h"
|
||||
@ -725,7 +726,14 @@ Sema::ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch,
|
||||
} else {
|
||||
// We already verified that the expression has a i-c-e value (C99
|
||||
// 6.8.4.2p3) - get that value now.
|
||||
LoVal = Lo->EvaluateKnownConstInt(Context);
|
||||
llvm::SmallVector<PartialDiagnosticAt, 8> Diags;
|
||||
LoVal = Lo->EvaluateKnownConstInt(Context, &Diags);
|
||||
if (Diags.size() == 1 &&
|
||||
Diags[0].second.getDiagID() == diag::note_constexpr_overflow) {
|
||||
Diag(Lo->getLocStart(), diag::warn_case_value_overflow) <<
|
||||
LoVal.toString(10) << "switch condition value";
|
||||
Diag(Diags[0].first, Diags[0].second);
|
||||
}
|
||||
|
||||
// If the LHS is not the same type as the condition, insert an implicit
|
||||
// cast.
|
||||
|
17
clang/test/Sema/switch-1.c
Normal file
17
clang/test/Sema/switch-1.c
Normal file
@ -0,0 +1,17 @@
|
||||
// RUN: %clang_cc1 -fsyntax-only -verify -triple x86_64-apple-darwin10 %s
|
||||
// RUN: %clang_cc1 -x c++ -fsyntax-only -verify -triple x86_64-apple-darwin10 %s
|
||||
// rdar://11577384
|
||||
|
||||
int f(int i) {
|
||||
switch (i) {
|
||||
case 2147483647 + 2: // expected-note {{value 2147483649 is outside the range of representable values of type 'int'}} \
|
||||
// expected-warning {{overflow converting case value to switch condition type}}
|
||||
return 1;
|
||||
case 9223372036854775807L * 4 : // expected-note {{value 36893488147419103228 is outside the range of representable values of type 'long'}} \
|
||||
// expected-warning {{overflow converting case value to switch condition type}}
|
||||
return 2;
|
||||
case 2147483647:
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user