From 8a15efb37a33d3c2943be87a19cbf9b5e2e8432b Mon Sep 17 00:00:00 2001 From: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> Date: Fri, 1 Aug 2025 12:36:29 -0700 Subject: Drain sink when single-argument constructor call fail (#7883) * fix bug * fix test * push test changs for clarity * fix bug * fix test * push test changs for clarity * test what fails * remove redundant code --- source/slang/hlsl.meta.slang | 13 +++++++++++-- source/slang/slang-check-conversion.cpp | 5 ++++- source/slang/slang-check-overload.cpp | 16 +++++++++++++--- 3 files changed, 28 insertions(+), 6 deletions(-) (limited to 'source') diff --git a/source/slang/hlsl.meta.slang b/source/slang/hlsl.meta.slang index 9fd5c8b6e..c3d2efaac 100644 --- a/source/slang/hlsl.meta.slang +++ b/source/slang/hlsl.meta.slang @@ -22665,7 +22665,7 @@ struct ConstBufferPointer [ForceInline] static ConstBufferPointer fromUInt(uint64_t val) { - return {(T*)val}; + return ConstBufferPointer(val); } [ForceInline] @@ -22679,8 +22679,17 @@ struct ConstBufferPointer { return _ptr != nullptr; } -} + __init(T* val) + { + _ptr = val; + } + + __init(uint64_t val) + { + _ptr = (T*)val; + } +} // // HLSL-like dynamic resources // https://microsoft.github.io/DirectX-Specs/d3d/HLSL_SM_6_6_DynamicResources.html diff --git a/source/slang/slang-check-conversion.cpp b/source/slang/slang-check-conversion.cpp index 61d132627..a605928e3 100644 --- a/source/slang/slang-check-conversion.cpp +++ b/source/slang/slang-check-conversion.cpp @@ -1711,6 +1711,8 @@ bool SemanticsVisitor::_coerce( } } + bool result = true; + // Conceptually, we want to treat the conversion as // possible, but report it as ambiguous if we actually // need to reify the result as an expression. @@ -1723,6 +1725,7 @@ bool SemanticsVisitor::_coerce( } *outToExpr = CreateErrorExpr(fromExpr); + result = false; } if (!cachedMethod) @@ -1734,7 +1737,7 @@ bool SemanticsVisitor::_coerce( if (outCost) *outCost = bestCost; - return true; + return result; } else if (overloadContext.bestCandidate) { diff --git a/source/slang/slang-check-overload.cpp b/source/slang/slang-check-overload.cpp index 71e8488d8..9e5560b3a 100644 --- a/source/slang/slang-check-overload.cpp +++ b/source/slang/slang-check-overload.cpp @@ -2727,6 +2727,7 @@ Expr* SemanticsVisitor::ResolveInvoke(InvokeExpr* expr) // bool typeOverloadChecked = false; + DiagnosticSink collectedErrorsSink(getSourceManager(), nullptr); if (expr->arguments.getCount() == 1 && !as(expr) && !as(expr->arguments[0])) { @@ -2735,16 +2736,15 @@ Expr* SemanticsVisitor::ResolveInvoke(InvokeExpr* expr) if (isDeclRefTypeOf(typeType->getType())) { Expr* resultExpr = nullptr; - DiagnosticSink tempSink(getSourceManager(), nullptr); ConversionCost conversionCost = kConversionCost_None; - auto coerceResult = SemanticsVisitor(withSink(&tempSink)) + auto coerceResult = SemanticsVisitor(withSink(&collectedErrorsSink)) ._coerce( CoercionSite::ExplicitCoercion, typeType->getType(), &resultExpr, expr->arguments[0]->type, expr->arguments[0], - &tempSink, + &collectedErrorsSink, &conversionCost); if (auto resultInvokeExpr = as(resultExpr)) { @@ -2963,6 +2963,16 @@ Expr* SemanticsVisitor::ResolveInvoke(InvokeExpr* expr) // for language server to use. if (IsErrorExpr(outExpr)) { + // Drain our error sink of "saved errors" + if (collectedErrorsSink.getErrorCount()) + { + Slang::ComPtr blob; + collectedErrorsSink.getBlobIfNeeded(blob.writeRef()); + getSink()->diagnoseRaw( + Severity::Error, + static_cast(blob->getBufferPointer())); + } + if (auto invokeExpr = as(outExpr)) { invokeExpr->originalFunctionExpr = typeExpr; -- cgit v1.2.3