summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-check-conversion.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-check-conversion.cpp')
-rw-r--r--source/slang/slang-check-conversion.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/source/slang/slang-check-conversion.cpp b/source/slang/slang-check-conversion.cpp
index 8b60b2725..b6c7069a2 100644
--- a/source/slang/slang-check-conversion.cpp
+++ b/source/slang/slang-check-conversion.cpp
@@ -151,6 +151,44 @@ namespace Slang
ioInitArgIndex);
}
+ DeclRefType* findBaseStructType(ASTBuilder* astBuilder, DeclRef<StructDecl> const& structTypeDeclRef)
+ {
+ auto inheritanceDecl = getMembersOfType<InheritanceDecl>(structTypeDeclRef).getFirstOrNull();
+ if(!inheritanceDecl)
+ return nullptr;
+
+ auto baseType = getBaseType(astBuilder, inheritanceDecl);
+ auto baseDeclRefType = as<DeclRefType>(baseType);
+ if(!baseDeclRefType)
+ return nullptr;
+
+ auto baseDeclRef = baseDeclRefType->declRef;
+ auto baseStructDeclRef = baseDeclRef.as<StructDecl>();
+ if(!baseStructDeclRef)
+ return nullptr;
+
+ return baseDeclRefType;
+ }
+
+ DeclRef<StructDecl> findBaseStructDeclRef(ASTBuilder* astBuilder, DeclRef<StructDecl> const& structTypeDeclRef)
+ {
+ auto inheritanceDecl = getMembersOfType<InheritanceDecl>(structTypeDeclRef).getFirstOrNull();
+ if (!inheritanceDecl)
+ return DeclRef<StructDecl>();
+
+ auto baseType = getBaseType(astBuilder, inheritanceDecl);
+ auto baseDeclRefType = as<DeclRefType>(baseType);
+ if (!baseDeclRefType)
+ return DeclRef<StructDecl>();
+
+ auto baseDeclRef = baseDeclRefType->declRef;
+ auto baseStructDeclRef = baseDeclRef.as<StructDecl>();
+ if (!baseStructDeclRef)
+ return DeclRef<StructDecl>();
+
+ return baseStructDeclRef;
+ }
+
bool SemanticsVisitor::_readAggregateValueFromInitializerList(
Type* inToType,
Expr** outToExpr,
@@ -375,6 +413,30 @@ namespace Slang
if(auto toStructDeclRef = toTypeDeclRef.as<StructDecl>())
{
// Trying to initialize a `struct` type given an initializer list.
+ //
+ // Before we iterate over the fields, we want to check if this struct
+ // inherits from another `struct` type. If so, we want to read
+ // an initializer for that base type first.
+ //
+ if (auto baseStructType = findBaseStructType(m_astBuilder, toStructDeclRef))
+ {
+ Expr* coercedArg = nullptr;
+ bool argResult = _readValueFromInitializerList(
+ baseStructType,
+ outToExpr ? &coercedArg : nullptr,
+ fromInitializerListExpr,
+ ioArgIndex);
+
+ // No point in trying further if any argument fails
+ if (!argResult)
+ return false;
+
+ if (coercedArg)
+ {
+ coercedArgs.add(coercedArg);
+ }
+ }
+
// We will go through the fields in order and try to match them
// up with initializer arguments.
//