summaryrefslogtreecommitdiffstats
path: root/source/slang/lower.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/lower.cpp')
-rw-r--r--source/slang/lower.cpp42
1 files changed, 20 insertions, 22 deletions
diff --git a/source/slang/lower.cpp b/source/slang/lower.cpp
index 7a487d29f..f0d756a02 100644
--- a/source/slang/lower.cpp
+++ b/source/slang/lower.cpp
@@ -1781,19 +1781,9 @@ struct LoweringVisitor
LoweredExpr visitInvokeExpr(
InvokeExpr* expr)
{
- return LoweredExpr(lowerCallExpr(new InvokeExpr(), expr));
- }
-
- LoweredExpr visitInfixExpr(
- InfixExpr* expr)
- {
- return LoweredExpr(lowerCallExpr(new InfixExpr(), expr));
- }
-
- LoweredExpr visitPrefixExpr(
- PrefixExpr* expr)
- {
- return LoweredExpr(lowerCallExpr(new PrefixExpr(), expr));
+ // Create a clone with the same class
+ InvokeExpr* loweredExpr = (InvokeExpr*) expr->getClass().createInstance();
+ return LoweredExpr(lowerCallExpr(loweredExpr, expr));
}
LoweredExpr visitSelectExpr(
@@ -1804,12 +1794,6 @@ struct LoweringVisitor
return LoweredExpr(lowerCallExpr(new SelectExpr(), expr));
}
- LoweredExpr visitPostfixExpr(
- PostfixExpr* expr)
- {
- return LoweredExpr(lowerCallExpr(new PostfixExpr(), expr));
- }
-
LoweredExpr visitDerefExpr(
DerefExpr* expr)
{
@@ -2412,15 +2396,29 @@ struct LoweringVisitor
assign(expr, LoweredExpr(createVarRef(getPosition(expr), varDecl)));
}
+ RefPtr<Expr> createTypeExpr(
+ RefPtr<Type> type)
+ {
+ auto typeType = new TypeType();
+ typeType->type = type;
+
+ auto result = new SharedTypeExpr();
+ result->base.type = type;
+ result->type.type = typeType;
+
+ return result;
+ }
+
RefPtr<Expr> createCastExpr(
- RefPtr<Type> type,
+ RefPtr<Type> type,
RefPtr<Expr> expr)
{
RefPtr<ExplicitCastExpr> castExpr = new ExplicitCastExpr();
castExpr->loc = expr->loc;
castExpr->type.type = type;
- castExpr->TargetType.type = type;
- castExpr->Expression = expr;
+
+ castExpr->FunctionExpr = createTypeExpr(type);
+ castExpr->Arguments.Add(expr);
return castExpr;
}