diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2009-02-27 06:44:11 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2009-02-27 06:44:11 +0000 |
commit | 988a16b9b842b23f98d6df0b9141bcd4462fdfd8 (patch) | |
tree | da7ee827155adfbe84a388d67a79a2c3a235e2ae /clang/lib/AST/ExprConstant.cpp | |
parent | 34709f84d809133654f78b8de87573e74b619b5c (diff) | |
download | bcm5719-llvm-988a16b9b842b23f98d6df0b9141bcd4462fdfd8.tar.gz bcm5719-llvm-988a16b9b842b23f98d6df0b9141bcd4462fdfd8.zip |
Change the AST generated for offsetof a bit so that it looks like a
normal expression, and change Evaluate and IRGen to evaluate it like a
normal expression. This simplifies the code significantly, and fixes
PR3396.
llvm-svn: 65622
Diffstat (limited to 'clang/lib/AST/ExprConstant.cpp')
-rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 4f55f8d7642..68818dbf7b2 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -1064,8 +1064,16 @@ bool IntExprEvaluator::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) { bool IntExprEvaluator::VisitUnaryOperator(const UnaryOperator *E) { // Special case unary operators that do not need their subexpression // evaluated. offsetof/sizeof/alignof are all special. - if (E->isOffsetOfOp()) - return Success(E->evaluateOffsetOf(Info.Ctx), E); + if (E->isOffsetOfOp()) { + // The AST for offsetof is defined in such a way that we can just + // directly Evaluate it as an l-value. + APValue LV; + if (!EvaluateLValue(E->getSubExpr(), LV, Info)) + return false; + if (LV.getLValueBase()) + return false; + return Success(LV.getLValueOffset(), E); + } if (E->getOpcode() == UnaryOperator::LNot) { // LNot's operand isn't necessarily an integer, so we handle it specially. |