[cfe-commits] r172016 - in /cfe/trunk: include/clang/AST/Expr.h lib/AST/ExprConstant.cpp lib/Sema/SemaStmt.cpp test/Sema/switch-1.c
Fariborz Jahanian
fjahanian at apple.com
Wed Jan 9 15:04:57 PST 2013
Author: fjahanian
Date: Wed Jan 9 17:04:56 2013
New Revision: 172016
URL: http://llvm.org/viewvc/llvm-project?rev=172016&view=rev
Log:
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.
Added:
cfe/trunk/test/Sema/switch-1.c
Modified:
cfe/trunk/include/clang/AST/Expr.h
cfe/trunk/lib/AST/ExprConstant.cpp
cfe/trunk/lib/Sema/SemaStmt.cpp
Modified: cfe/trunk/include/clang/AST/Expr.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=172016&r1=172015&r2=172016&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Expr.h (original)
+++ cfe/trunk/include/clang/AST/Expr.h Wed Jan 9 17:04:56 2013
@@ -568,7 +568,8 @@
/// 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.
Modified: cfe/trunk/lib/AST/ExprConstant.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprConstant.cpp?rev=172016&r1=172015&r2=172016&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprConstant.cpp (original)
+++ cfe/trunk/lib/AST/ExprConstant.cpp Wed Jan 9 17:04:56 2013
@@ -6364,8 +6364,10 @@
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");
Modified: cfe/trunk/lib/Sema/SemaStmt.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=172016&r1=172015&r2=172016&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaStmt.cpp (original)
+++ cfe/trunk/lib/Sema/SemaStmt.cpp Wed Jan 9 17:04:56 2013
@@ -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 @@
} 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.
Added: cfe/trunk/test/Sema/switch-1.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/switch-1.c?rev=172016&view=auto
==============================================================================
--- cfe/trunk/test/Sema/switch-1.c (added)
+++ cfe/trunk/test/Sema/switch-1.c Wed Jan 9 17:04:56 2013
@@ -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;
+}
More information about the cfe-commits
mailing list