diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-ast-expr.h | 6 | ||||
| -rw-r--r-- | source/slang/slang-check-conversion.cpp | 18 | ||||
| -rw-r--r-- | source/slang/slang-check-expr.cpp | 5 | ||||
| -rw-r--r-- | source/slang/slang-check-impl.h | 1 | ||||
| -rw-r--r-- | source/slang/slang-lower-to-ir.cpp | 11 |
5 files changed, 29 insertions, 12 deletions
diff --git a/source/slang/slang-ast-expr.h b/source/slang/slang-ast-expr.h index 5d8caefa9..346ed56f1 100644 --- a/source/slang/slang-ast-expr.h +++ b/source/slang/slang-ast-expr.h @@ -139,6 +139,12 @@ class StringLiteralExpr : public LiteralExpr FIDDLE() String value; }; +FIDDLE() +class MakeArrayFromElementExpr : public Expr +{ + FIDDLE(...) +}; + // An initializer list, e.g. `{ 1, 2, 3 }` FIDDLE() class InitializerListExpr : public Expr diff --git a/source/slang/slang-check-conversion.cpp b/source/slang/slang-check-conversion.cpp index 1c8846e66..a2cb0f91b 100644 --- a/source/slang/slang-check-conversion.cpp +++ b/source/slang/slang-check-conversion.cpp @@ -613,19 +613,13 @@ bool SemanticsVisitor::_readAggregateValueFromInitializerList( } else { - // We don't know the element count statically, - // so what are we supposed to be doing? - // - if (outToExpr) - { - getSink()->diagnose( - fromInitializerListExpr, - Diagnostics::cannotUseInitializerListForArrayOfUnknownSize, - toElementCount); - } - return false; - } + auto toMakeArrayFromElementExpr = m_astBuilder->create<MakeArrayFromElementExpr>(); + toMakeArrayFromElementExpr->loc = fromInitializerListExpr->loc; + toMakeArrayFromElementExpr->type = QualType(toType); + *outToExpr = toMakeArrayFromElementExpr; + return true; + } for (UInt ee = 0; ee < elementCount; ++ee) { Expr* coercedArg = nullptr; diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp index 87f29d367..48f32952b 100644 --- a/source/slang/slang-check-expr.cpp +++ b/source/slang/slang-check-expr.cpp @@ -5181,6 +5181,11 @@ Expr* SemanticsExprVisitor::visitMemberExpr(MemberExpr* expr) } } +Expr* SemanticsExprVisitor::visitMakeArrayFromElementExpr(MakeArrayFromElementExpr* expr) +{ + return expr; +} + Expr* SemanticsExprVisitor::visitInitializerListExpr(InitializerListExpr* expr) { // If we are assigned a type, expr has already been legalized diff --git a/source/slang/slang-check-impl.h b/source/slang/slang-check-impl.h index 1e93d8381..a910a3722 100644 --- a/source/slang/slang-check-impl.h +++ b/source/slang/slang-check-impl.h @@ -2954,6 +2954,7 @@ public: Expr* visitMemberExpr(MemberExpr* expr); Expr* visitInitializerListExpr(InitializerListExpr* expr); + Expr* visitMakeArrayFromElementExpr(MakeArrayFromElementExpr* expr); Expr* visitThisExpr(ThisExpr* expr); Expr* visitThisTypeExpr(ThisTypeExpr* expr); diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp index 90780882d..1006a3489 100644 --- a/source/slang/slang-lower-to-ir.cpp +++ b/source/slang/slang-lower-to-ir.cpp @@ -4825,6 +4825,17 @@ struct ExprLoweringVisitorBase : public ExprVisitor<Derived, LoweredValInfo> } } + LoweredValInfo visitMakeArrayFromElementExpr(MakeArrayFromElementExpr* expr) + { + auto irType = lowerType(context, expr->type); + auto irDefaultElement = getSimpleVal( + context, + getDefaultVal(as<ArrayExpressionType>(expr->type)->getElementType())); + + return LoweredValInfo::simple( + getBuilder()->emitMakeArrayFromElement(irType, irDefaultElement)); + } + LoweredValInfo visitInitializerListExpr(InitializerListExpr* expr) { // Allocate a temporary of the given type |
