summaryrefslogtreecommitdiff
path: root/source/slang/slang-check-conversion.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-10-20 09:28:13 -0700
committerGitHub <noreply@github.com>2024-10-20 09:28:13 -0700
commit307315a7305e76529837fd1cdb677f534d5f539b (patch)
treeba39e96ba2e9b3d62d1213aab2f1cc54febe451a /source/slang/slang-check-conversion.cpp
parent9936178dd3efb026bfa142512a2bf061d7a75ab5 (diff)
Properly check switch case. (#5341)
Diffstat (limited to 'source/slang/slang-check-conversion.cpp')
-rw-r--r--source/slang/slang-check-conversion.cpp18
1 files changed, 12 insertions, 6 deletions
diff --git a/source/slang/slang-check-conversion.cpp b/source/slang/slang-check-conversion.cpp
index c0d7feaff..586f44887 100644
--- a/source/slang/slang-check-conversion.cpp
+++ b/source/slang/slang-check-conversion.cpp
@@ -960,7 +960,11 @@ namespace Slang
}
if (outToExpr)
{
- *outToExpr = fromExpr;
+ auto rsExpr = getASTBuilder()->create<BuiltinCastExpr>();
+ rsExpr->type = toType;
+ rsExpr->loc = fromExpr->loc;
+ rsExpr->base = fromExpr;
+ *outToExpr = rsExpr;
}
return true;
}
@@ -1150,7 +1154,7 @@ namespace Slang
// call to one of the initializers in the target type.
OverloadResolveContext overloadContext;
- overloadContext.disallowNestedConversions = true;
+ overloadContext.disallowNestedConversions = (site != CoercionSite::ExplicitCoercion);
overloadContext.argCount = 1;
List<Expr*> args;
args.add(fromExpr);
@@ -1295,7 +1299,7 @@ namespace Slang
// but then emit a diagnostic when actually reifying
// the result expression.
//
- if (outToExpr)
+ if (outToExpr && site != CoercionSite::ExplicitCoercion)
{
if (cost >= kConversionCost_Explicit)
{
@@ -1362,7 +1366,9 @@ namespace Slang
// base expression (the callee), since that will come
// from the selected overload candidate.
//
- auto castExpr = createImplicitCastExpr();
+ InvokeExpr* castExpr = (site == CoercionSite::ExplicitCoercion)
+ ? m_astBuilder->create<ExplicitCastExpr>()
+ : createImplicitCastExpr();
castExpr->loc = fromExpr->loc;
castExpr->arguments.add(fromExpr);
//
@@ -1379,7 +1385,7 @@ namespace Slang
// "argument list" was just a pointer to `fromExpr`.
//
// That means we need to clear the argument list and
- // reload it from `fromExpr` to make sure that we
+ // reload it from `args[0]` to make sure that we
// got the arguments *after* any transformations
// were applied.
// For right now this probably doesn't matter,
@@ -1387,7 +1393,7 @@ namespace Slang
// but I'd rather play it safe.
//
castExpr->arguments.clear();
- castExpr->arguments.add(fromExpr);
+ castExpr->arguments.add(args[0]);
}
if (!cachedMethod)
getShared()->cacheImplicitCastMethod(implicitCastKey, ImplicitCastMethod{ *overloadContext.bestCandidate, cost });