summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaChecking.cpp
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2011-10-10 18:28:20 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2011-10-10 18:28:20 +0000
commitcaf3390d449ccc4a2eb97958dd3d456d1ea4bf90 (patch)
treeff8b87a69b97998ade8e050f2b93d9b31b1a6c6c /clang/lib/Sema/SemaChecking.cpp
parent47aac5104302121ba64975cd4b51e27ef621131e (diff)
downloadbcm5719-llvm-caf3390d449ccc4a2eb97958dd3d456d1ea4bf90.tar.gz
bcm5719-llvm-caf3390d449ccc4a2eb97958dd3d456d1ea4bf90.zip
Constant expression evaluation refactoring:
- Remodel Expr::EvaluateAsInt to behave like the other EvaluateAs* functions, and add Expr::EvaluateKnownConstInt to capture the current fold-or-assert behaviour. - Factor out evaluation of bitfield bit widths. - Fix a few places which would evaluate an expression twice: once to determine whether it is a constant expression, then again to get the value. llvm-svn: 141561
Diffstat (limited to 'clang/lib/Sema/SemaChecking.cpp')
-rw-r--r--clang/lib/Sema/SemaChecking.cpp15
1 files changed, 4 insertions, 11 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 181d40ba014..412ed0ebb5f 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -2897,14 +2897,9 @@ IntRange GetExprRange(ASTContext &C, Expr *E, unsigned MaxWidth) {
IntRange::forValueOfType(C, E->getType());
}
- FieldDecl *BitField = E->getBitField();
- if (BitField) {
- llvm::APSInt BitWidthAP = BitField->getBitWidth()->EvaluateAsInt(C);
- unsigned BitWidth = BitWidthAP.getZExtValue();
-
- return IntRange(BitWidth,
+ if (FieldDecl *BitField = E->getBitField())
+ return IntRange(BitField->getBitWidthValue(C),
BitField->getType()->isUnsignedIntegerOrEnumerationType());
- }
return IntRange::forValueOfType(C, E->getType());
}
@@ -3106,16 +3101,14 @@ bool AnalyzeBitFieldAssignment(Sema &S, FieldDecl *Bitfield, Expr *Init,
Expr *OriginalInit = Init->IgnoreParenImpCasts();
- llvm::APSInt Width(32);
Expr::EvalResult InitValue;
- if (!Bitfield->getBitWidth()->isIntegerConstantExpr(Width, S.Context) ||
- !OriginalInit->Evaluate(InitValue, S.Context) ||
+ if (!OriginalInit->Evaluate(InitValue, S.Context) ||
!InitValue.Val.isInt())
return false;
const llvm::APSInt &Value = InitValue.Val.getInt();
unsigned OriginalWidth = Value.getBitWidth();
- unsigned FieldWidth = Width.getZExtValue();
+ unsigned FieldWidth = Bitfield->getBitWidthValue(S.Context);
if (OriginalWidth <= FieldWidth)
return false;
OpenPOWER on IntegriCloud