diff options
| author | Yong He <yonghe@outlook.com> | 2020-10-04 01:40:58 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-04 01:40:58 -0700 |
| commit | 3321df74904dfe3a11a41179b66a4c3ce5b57022 (patch) | |
| tree | 2644bd8c0dcb3cdd148042745ed2fb7c51cd91ed /source | |
| parent | 24ecd1fa2f37f3c4949989b53562e8f85833a8f6 (diff) | |
Handle partial existential parameter type specialization. (#1568)
* Specialize exsitentials parameters in struct fields.
* Cleanup.
* Handle partial existential parameter type specialization.
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-ir-insts.h | 2 | ||||
| -rw-r--r-- | source/slang/slang-ir.cpp | 10 |
2 files changed, 9 insertions, 3 deletions
diff --git a/source/slang/slang-ir-insts.h b/source/slang/slang-ir-insts.h index ef382373f..658e50f28 100644 --- a/source/slang/slang-ir-insts.h +++ b/source/slang/slang-ir-insts.h @@ -1807,7 +1807,7 @@ struct IRBuilder IRInOutType* getInOutType(IRType* valueType); IRRefType* getRefType(IRType* valueType); IRPtrTypeBase* getPtrType(IROp op, IRType* valueType); - IRExistentialBoxType* getExistentialBoxType(IRType* concreteType, IRType* interfaceType); + IRType* getExistentialBoxType(IRType* concreteType, IRType* interfaceType); IRArrayTypeBase* getArrayTypeBase( IROp op, diff --git a/source/slang/slang-ir.cpp b/source/slang/slang-ir.cpp index e9d90adfe..3820119d2 100644 --- a/source/slang/slang-ir.cpp +++ b/source/slang/slang-ir.cpp @@ -2336,10 +2336,14 @@ namespace Slang operands); } - IRExistentialBoxType* IRBuilder::getExistentialBoxType(IRType* concreteType, IRType* interfaceType) + IRType* IRBuilder::getExistentialBoxType(IRType* concreteType, IRType* interfaceType) { + // Don't wrap an existential box if concreteType is __Dynamic. + if (as<IRDynamicType>(concreteType)) + return interfaceType; + IRInst* operands[] = {concreteType, interfaceType}; - return (IRExistentialBoxType*)getType(kIROp_ExistentialBoxType, 2, operands); + return getType(kIROp_ExistentialBoxType, 2, operands); } IRArrayTypeBase* IRBuilder::getArrayTypeBase( @@ -2845,6 +2849,8 @@ namespace Slang // We want to emit `makeExistential(load(value), witnessTable)`. // auto deref = emitLoad(value); + if (slotArgs[0]->op == kIROp_DynamicType) + return deref; return emitMakeExistential(type, deref, slotArgs[1]); } } |
