diff options
| author | Eli Friedman <eli.friedman@gmail.com> | 2010-08-14 20:52:13 +0000 |
|---|---|---|
| committer | Eli Friedman <eli.friedman@gmail.com> | 2010-08-14 20:52:13 +0000 |
| commit | 9571953f3652d581af4683a336e30413176f8f95 (patch) | |
| tree | 99521f93ef8d4c4f499d5aeaf5ad99e4dad55183 | |
| parent | a7974757128761c7d2020fd9994b6bfb22d71a68 (diff) | |
| download | bcm5719-llvm-9571953f3652d581af4683a336e30413176f8f95.tar.gz bcm5719-llvm-9571953f3652d581af4683a336e30413176f8f95.zip | |
PR7884: Fix the implementations of __real__ and __imag__ on real floats.
llvm-svn: 111080
| -rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 30 | ||||
| -rw-r--r-- | clang/test/Sema/const-eval.c | 8 |
2 files changed, 27 insertions, 11 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 3ef2a62e2d7..3b288ec8b7f 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -1842,18 +1842,30 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) { } bool FloatExprEvaluator::VisitUnaryReal(const UnaryOperator *E) { - ComplexValue CV; - if (!EvaluateComplex(E->getSubExpr(), CV, Info)) - return false; - Result = CV.FloatReal; - return true; + if (E->getSubExpr()->getType()->isAnyComplexType()) { + ComplexValue CV; + if (!EvaluateComplex(E->getSubExpr(), CV, Info)) + return false; + Result = CV.FloatReal; + return true; + } + + return Visit(E->getSubExpr()); } bool FloatExprEvaluator::VisitUnaryImag(const UnaryOperator *E) { - ComplexValue CV; - if (!EvaluateComplex(E->getSubExpr(), CV, Info)) - return false; - Result = CV.FloatImag; + if (E->getSubExpr()->getType()->isAnyComplexType()) { + ComplexValue CV; + if (!EvaluateComplex(E->getSubExpr(), CV, Info)) + return false; + Result = CV.FloatImag; + return true; + } + + if (!E->getSubExpr()->isEvaluatable(Info.Ctx)) + Info.EvalResult.HasSideEffects = true; + const llvm::fltSemantics &Sem = Info.Ctx.getFloatTypeSemantics(E->getType()); + Result = llvm::APFloat::getZero(Sem); return true; } diff --git a/clang/test/Sema/const-eval.c b/clang/test/Sema/const-eval.c index 9c537250a93..42097e75f31 100644 --- a/clang/test/Sema/const-eval.c +++ b/clang/test/Sema/const-eval.c @@ -74,5 +74,9 @@ const _Bool constbool = 0; EVAL_EXPR(35, constbool) EVAL_EXPR(36, constbool) -EVAL_EXPR(37, (1,2.0) == 2.0) -EVAL_EXPR(38, __builtin_expect(1,1) == 1) +EVAL_EXPR(37, (1,2.0) == 2.0 ? 1 : -1) +EVAL_EXPR(38, __builtin_expect(1,1) == 1 ? 1 : -1) + +// PR7884 +EVAL_EXPR(39, __real__(1.f) == 1 ? 1 : -1) +EVAL_EXPR(40, __imag__(1.f) == 0 ? 1 : -1) |

