forked from OSchip/llvm-project
implement codegen support for implicit casts.
llvm-svn: 39831
This commit is contained in:
parent
5c2f76b395
commit
388cf760e2
|
@ -472,8 +472,10 @@ RValue CodeGenFunction::EmitExpr(const Expr *E) {
|
||||||
return EmitExpr(cast<ParenExpr>(E)->getSubExpr());
|
return EmitExpr(cast<ParenExpr>(E)->getSubExpr());
|
||||||
case Expr::UnaryOperatorClass:
|
case Expr::UnaryOperatorClass:
|
||||||
return EmitUnaryOperator(cast<UnaryOperator>(E));
|
return EmitUnaryOperator(cast<UnaryOperator>(E));
|
||||||
|
case Expr::ImplicitCastExprClass:
|
||||||
|
return EmitCastExpr(cast<ImplicitCastExpr>(E)->getSubExpr(), E->getType());
|
||||||
case Expr::CastExprClass:
|
case Expr::CastExprClass:
|
||||||
return EmitCastExpr(cast<CastExpr>(E));
|
return EmitCastExpr(cast<CastExpr>(E)->getSubExpr(), E->getType());
|
||||||
case Expr::CallExprClass:
|
case Expr::CallExprClass:
|
||||||
return EmitCallExpr(cast<CallExpr>(E));
|
return EmitCallExpr(cast<CallExpr>(E));
|
||||||
case Expr::BinaryOperatorClass:
|
case Expr::BinaryOperatorClass:
|
||||||
|
@ -518,16 +520,18 @@ RValue CodeGenFunction::EmitArraySubscriptExprRV(const ArraySubscriptExpr *E) {
|
||||||
return RValue::get(Builder.CreateExtractElement(Base, Idx, "vecext"));
|
return RValue::get(Builder.CreateExtractElement(Base, Idx, "vecext"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EmitCastExpr - Emit code for an explicit or implicit cast. Implicit casts
|
||||||
RValue CodeGenFunction::EmitCastExpr(const CastExpr *E) {
|
// have to handle a more broad range of conversions than explicit casts, as they
|
||||||
|
// handle things like function to ptr-to-function decay etc.
|
||||||
|
RValue CodeGenFunction::EmitCastExpr(const Expr *Op, QualType DestTy) {
|
||||||
QualType SrcTy;
|
QualType SrcTy;
|
||||||
RValue Src = EmitExprWithUsualUnaryConversions(E->getSubExpr(), SrcTy);
|
RValue Src = EmitExprWithUsualUnaryConversions(Op, SrcTy);
|
||||||
|
|
||||||
// If the destination is void, just evaluate the source.
|
// If the destination is void, just evaluate the source.
|
||||||
if (E->getType()->isVoidType())
|
if (DestTy->isVoidType())
|
||||||
return RValue::getAggregate(0);
|
return RValue::getAggregate(0);
|
||||||
|
|
||||||
return EmitConversion(Src, SrcTy, E->getType());
|
return EmitConversion(Src, SrcTy, DestTy);
|
||||||
}
|
}
|
||||||
|
|
||||||
RValue CodeGenFunction::EmitCallExpr(const CallExpr *E) {
|
RValue CodeGenFunction::EmitCallExpr(const CallExpr *E) {
|
||||||
|
|
|
@ -313,7 +313,7 @@ public:
|
||||||
RValue EmitFloatingLiteral(const FloatingLiteral *E);
|
RValue EmitFloatingLiteral(const FloatingLiteral *E);
|
||||||
RValue EmitCharacterLiteral(const CharacterLiteral *E);
|
RValue EmitCharacterLiteral(const CharacterLiteral *E);
|
||||||
|
|
||||||
RValue EmitCastExpr(const CastExpr *E);
|
RValue EmitCastExpr(const Expr *Op, QualType DestTy);
|
||||||
RValue EmitCallExpr(const CallExpr *E);
|
RValue EmitCallExpr(const CallExpr *E);
|
||||||
RValue EmitArraySubscriptExprRV(const ArraySubscriptExpr *E);
|
RValue EmitArraySubscriptExprRV(const ArraySubscriptExpr *E);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue