summaryrefslogtreecommitdiffstats
path: root/source/slang/lower.cpp
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2017-09-05 13:16:21 -0700
committerGitHub <noreply@github.com>2017-09-05 13:16:21 -0700
commite59a1b39317c10815baaed3b70c4a6580dbe1e63 (patch)
treedc908e481eb5d73ceb7dc9d1f5da1e40d5b0e7e8 /source/slang/lower.cpp
parent620734080f825cb205b887fa1d6203e35dd60663 (diff)
parent8b91fb8e2db782c73541c83042209b4263402902 (diff)
Merge pull request #175 from tfoleyNV/implicit-conversion
Move implicit conversion operations to stdlib
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;
}