summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/ExprConstant.cpp
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-02-28 03:59:05 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-02-28 03:59:05 +0000
commita1c7b6c5f6fe7a81b9b006fe4a2b3dd5fd2df298 (patch)
treeef55496d5c4644dc5d9ff5ebbec01e65769b34aa /clang/lib/AST/ExprConstant.cpp
parent8a56e5c29b2ac8ac8a04b3374ab935e863e20e10 (diff)
downloadbcm5719-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.cpp22
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);
OpenPOWER on IntegriCloud