diff options
Diffstat (limited to 'clang/lib/AST')
| -rw-r--r-- | clang/lib/AST/Expr.cpp | 14 | ||||
| -rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 9 | 
2 files changed, 20 insertions, 3 deletions
| diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index cc209a458a1..d5bdc88ccfe 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -800,14 +800,24 @@ const char *CastExpr::getCastKindName() const {      return "ObjCObjectLValueCast";    case CK_FloatingRealToComplex:      return "FloatingRealToComplex"; +  case CK_FloatingComplexToReal: +    return "FloatingComplexToReal"; +  case CK_FloatingComplexToBoolean: +    return "FloatingComplexToBoolean";    case CK_FloatingComplexCast:      return "FloatingComplexCast"; +  case CK_FloatingComplexToIntegralComplex: +    return "FloatingComplexToIntegralComplex";    case CK_IntegralRealToComplex:      return "IntegralRealToComplex"; +  case CK_IntegralComplexToReal: +    return "IntegralComplexToReal"; +  case CK_IntegralComplexToBoolean: +    return "IntegralComplexToBoolean";    case CK_IntegralComplexCast:      return "IntegralComplexCast"; -  case CK_IntegralToFloatingComplex: -    return "IntegralToFloatingComplex"; +  case CK_IntegralComplexToFloatingComplex: +    return "IntegralComplexToFloatingComplex";    }    llvm_unreachable("Unhandled cast kind!"); diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 172a811bee1..8a6d4ba7c42 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -2073,7 +2073,14 @@ bool FloatExprEvaluator::VisitCastExpr(CastExpr *E) {                                      Result, Info.Ctx);      return true;    } -  // FIXME: Handle complex types + +  if (E->getCastKind() == CK_FloatingComplexToReal) { +    ComplexValue V; +    if (!EvaluateComplex(SubExpr, V, Info)) +      return false; +    Result = V.getComplexFloatReal(); +    return true; +  }    return false;  } | 

