From e81a5fe56f3177fc3c7040e2320ae083e3746eb7 Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 3 Aug 2022 12:08:37 -0700 Subject: Basic pointer usages. (#2342) --- source/slang/slang-check-expr.cpp | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'source/slang/slang-check-expr.cpp') diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp index 1895da70b..addd3a5c4 100644 --- a/source/slang/slang-check-expr.cpp +++ b/source/slang/slang-check-expr.cpp @@ -231,6 +231,21 @@ namespace Slang return expr; } + Expr* SemanticsVisitor::maybeOpenRef(Expr* expr) + { + auto exprType = expr->type.type; + + if (auto refType = as(exprType)) + { + auto openRef = m_astBuilder->create(); + openRef->innerExpr = expr; + openRef->type.isLeftValue = true; + openRef->type.type = refType->getValueType(); + return openRef; + } + return expr; + } + static SourceLoc _getMemberOpLoc(Expr* expr) { if (auto m = as(expr)) @@ -1329,8 +1344,8 @@ namespace Slang Expr* SemanticsVisitor::checkAssignWithCheckedOperands(AssignExpr* expr) { auto type = expr->left->type; - - expr->right = coerce(type, expr->right); + auto right = maybeOpenRef(expr->right); + expr->right = coerce(type, right); if (!type.isLeftValue) { @@ -2514,6 +2529,16 @@ namespace Slang return expr; } + Expr* SemanticsExprVisitor::visitPointerTypeExpr(PointerTypeExpr* expr) + { + expr->base = CheckProperType(expr->base); + if (as(expr->base.type)) + expr->type = expr->base.type; + auto ptrType = m_astBuilder->getPtrType(expr->base.type); + expr->type = m_astBuilder->getTypeType(ptrType); + return expr; + } + Expr* SemanticsExprVisitor::visitModifiedTypeExpr(ModifiedTypeExpr* expr) { // The base type should be a proper type (not an expression, generic, etc.) -- cgit v1.2.3