[cfe-commits] r172016 - in /cfe/trunk: include/clang/AST/Expr.h lib/AST/ExprConstant.cpp lib/Sema/SemaStmt.cpp test/Sema/switch-1.c
Richard Smith
richard at metafoo.co.uk
Thu Jan 10 18:39:32 PST 2013
On Thu, Jan 10, 2013 at 12:31 PM, jahanian <fjahanian at apple.com> wrote:
>
> On Jan 9, 2013, at 5:58 PM, Richard Smith <richard at metafoo.co.uk> wrote:
>
>> On Wed, Jan 9, 2013 at 3:04 PM, Fariborz Jahanian <fjahanian at apple.com> wrote:
>>> 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) {
>>
>> It seems a bit strange to only diagnose in the presence of a specific
>> diagnostic. What's the goal here?
>
> I want to issue warning when case value overflows. EvaluateKnownConstInt detects
> this by returning a note and callers are expected to issue the warning based on the note returned.
> Similar case is handled at end of CheckConvertedConstantExpression.
Well, in CheckConvertedConstantExpression, a diagnostic is produced
any time the evaluation produces notes. In this case, we only issue a
diagnostic for one of the notes. I'm concerned that this code would be
broken if we split that note into multiple notes with more details for
some cases -- and, in fact, there already is such a separate note for
signed left shift overflow.
Have you thought about always warning when an expression contains an
overflowing calculation, not only when such an overflow appears in a
case expression (like we already do for left shifts, for instance)?
> Also, I changed the warning per your other comments.
> In r172102.
Thanks! The "results in a new value" wording seems a bit awkward, how
about just saying "overflow in case constant expression results in
value %0"?
More information about the cfe-commits
mailing list