summaryrefslogtreecommitdiffstats
path: root/source/slang/check.cpp
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2017-12-08 14:23:12 -0800
committerGitHub <noreply@github.com>2017-12-08 14:23:12 -0800
commit0f55649cc1aa8ad3218b7f8ba7b1eabdd2ec6526 (patch)
tree0dc7fd5e88fbc530dc121946f4a20085aa5518d8 /source/slang/check.cpp
parent301cdf5ef42797b1073d9e6c741ef0ba98a38792 (diff)
Cleanups to `ParameterBlock<T>` behavior. (#304)
* Cleanups to `ParameterBlock<T>` behavior. These add some more realistic tests using the `ParameterBlock<T>` support, and show that it can work with the "rewriter" mode. Unfortunately, this code does *not* currently work with the rewriter + the IR at once. That will need to be fixed in a follow-on change, because I now see that the root problem is pretty ugly. * cleanup
Diffstat (limited to 'source/slang/check.cpp')
-rw-r--r--source/slang/check.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/source/slang/check.cpp b/source/slang/check.cpp
index c1893423a..4840ae30d 100644
--- a/source/slang/check.cpp
+++ b/source/slang/check.cpp
@@ -1005,6 +1005,40 @@ namespace Slang
}
}
+
+ // Are we converting from a parameter group type to its element type?
+ if(auto fromParameterGroupType = fromType->As<ParameterGroupType>())
+ {
+ auto fromElementType = fromParameterGroupType->getElementType();
+
+ // If we have, e.g., `ConstantBuffer<A>` and we want to convert
+ // to `B`, where conversion from `A` to `B` is possible, then
+ // we will do so here.
+
+ ConversionCost subCost = 0;
+ if(CanCoerce(toType, fromElementType, &subCost))
+ {
+ if(outCost)
+ *outCost = subCost + kConversionCost_ImplicitDereference;
+
+ if(outToExpr)
+ {
+ auto derefExpr = new DerefExpr();
+ derefExpr->base = fromExpr;
+ derefExpr->type = QualType(fromElementType);
+
+ return TryCoerceImpl(
+ toType,
+ outToExpr,
+ fromElementType,
+ derefExpr,
+ nullptr);
+ }
+ return true;
+ }
+ }
+
+
// Look for an initializer/constructor declaration in the target type,
// which is marked as usable for implicit conversion, and which takes
// the source type as an argument.
@@ -1171,6 +1205,7 @@ namespace Slang
RefPtr<TypeCastExpr> castExpr = createImplicitCastExpr();
auto typeType = new TypeType();
+ typeType->setSession(getSession());
typeType->type = toType;
auto typeExpr = new SharedTypeExpr();