summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST
diff options
context:
space:
mode:
authorAbramo Bagnara <abramo.bagnara@gmail.com>2011-06-30 09:36:05 +0000
committerAbramo Bagnara <abramo.bagnara@gmail.com>2011-06-30 09:36:05 +0000
commit2caedf449e640d14919402c7da27a36436971b95 (patch)
tree50ed6de1905840a63c0448ef27fa52c4889924e0 /clang/lib/AST
parent1406d6c037473e1e1d1f66745766d84c200eb251 (diff)
downloadbcm5719-llvm-2caedf449e640d14919402c7da27a36436971b95.tar.gz
bcm5719-llvm-2caedf449e640d14919402c7da27a36436971b95.zip
Fixed enum constant evaluation assertions.
llvm-svn: 134139
Diffstat (limited to 'clang/lib/AST')
-rw-r--r--clang/lib/AST/ExprConstant.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index 7d2ea13d0a7..1be23fc9903 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -955,17 +955,21 @@ public:
IntExprEvaluator(EvalInfo &info, APValue &result)
: ExprEvaluatorBaseTy(info), Result(result) {}
- bool Success(const llvm::APSInt &SI, const Expr *E) {
- assert(E->getType()->isIntegralOrEnumerationType() &&
+ bool Success(const llvm::APSInt &SI, QualType Ty) {
+ assert(Ty->isIntegralOrEnumerationType() &&
"Invalid evaluation result.");
- assert(SI.isSigned() == E->getType()->isSignedIntegerOrEnumerationType() &&
+ assert(SI.isSigned() == Ty->isSignedIntegerOrEnumerationType() &&
"Invalid evaluation result.");
- assert(SI.getBitWidth() == Info.Ctx.getIntWidth(E->getType()) &&
+ assert(SI.getBitWidth() == Info.Ctx.getIntWidth(Ty) &&
"Invalid evaluation result.");
Result = APValue(SI);
return true;
}
+ bool Success(const llvm::APSInt &SI, const Expr *E) {
+ return Success(SI, E->getType());
+ }
+
bool Success(const llvm::APInt &I, const Expr *E) {
assert(E->getType()->isIntegralOrEnumerationType() &&
"Invalid evaluation result.");
@@ -1106,8 +1110,11 @@ static bool EvaluateInteger(const Expr* E, APSInt &Result, EvalInfo &Info) {
bool IntExprEvaluator::CheckReferencedDecl(const Expr* E, const Decl* D) {
// Enums are integer constant exprs.
- if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D))
- return Success(ECD->getInitVal(), E);
+ if (const EnumConstantDecl *ECD = dyn_cast<EnumConstantDecl>(D)) {
+ // Note: provide the type of ECD (rather than that of E),
+ // so that signedness/width will match the ECD init value.
+ return Success(ECD->getInitVal(), ECD->getType());
+ }
// In C++, const, non-volatile integers initialized with ICEs are ICEs.
// In C, they can also be folded, although they are not ICEs.
OpenPOWER on IntegriCloud