diff options
| author | Yong He <yonghe@outlook.com> | 2024-10-20 09:28:13 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-20 09:28:13 -0700 |
| commit | 307315a7305e76529837fd1cdb677f534d5f539b (patch) | |
| tree | ba39e96ba2e9b3d62d1213aab2f1cc54febe451a /source/slang/slang-check-conversion.cpp | |
| parent | 9936178dd3efb026bfa142512a2bf061d7a75ab5 (diff) | |
Properly check switch case. (#5341)
Diffstat (limited to 'source/slang/slang-check-conversion.cpp')
| -rw-r--r-- | source/slang/slang-check-conversion.cpp | 18 |
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 }); |
