diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2009-02-28 03:59:05 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2009-02-28 03:59:05 +0000 |
commit | a1c7b6c5f6fe7a81b9b006fe4a2b3dd5fd2df298 (patch) | |
tree | ef55496d5c4644dc5d9ff5ebbec01e65769b34aa /clang/lib/AST/ExprConstant.cpp | |
parent | 8a56e5c29b2ac8ac8a04b3374ab935e863e20e10 (diff) | |
download | bcm5719-llvm-a1c7b6c5f6fe7a81b9b006fe4a2b3dd5fd2df298.tar.gz bcm5719-llvm-a1c7b6c5f6fe7a81b9b006fe4a2b3dd5fd2df298.zip |
Fix obvious shortcoming in the implementations of Evaluate for
integer __real__ and __imag__. Not sure how I missed this.
llvm-svn: 65677
Diffstat (limited to 'clang/lib/AST/ExprConstant.cpp')
-rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 68818dbf7b2..86a7e8217f7 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -645,9 +645,7 @@ public: } bool VisitChooseExpr(const ChooseExpr *E); - bool VisitUnaryReal(const UnaryOperator *E) { - return Visit(E->getSubExpr()); - } + bool VisitUnaryReal(const UnaryOperator *E); bool VisitUnaryImag(const UnaryOperator *E); private: @@ -1192,7 +1190,25 @@ bool IntExprEvaluator::VisitChooseExpr(const ChooseExpr *E) { return Visit(EvalExpr); } +bool IntExprEvaluator::VisitUnaryReal(const UnaryOperator *E) { + if (E->getSubExpr()->getType()->isAnyComplexType()) { + APValue LV; + if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt()) + return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); + return Success(LV.getComplexIntReal(), E); + } + + return Visit(E->getSubExpr()); +} + bool IntExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { + if (E->getSubExpr()->getType()->isComplexIntegerType()) { + APValue LV; + if (!EvaluateComplex(E->getSubExpr(), LV, Info) || !LV.isComplexInt()) + return Error(E->getExprLoc(), diag::note_invalid_subexpr_in_ice, E); + return Success(LV.getComplexIntImag(), E); + } + if (!E->getSubExpr()->isEvaluatable(Info.Ctx)) Info.EvalResult.HasSideEffects = true; return Success(0, E); |